summaryrefslogtreecommitdiff
path: root/public/gcsdk/schemasharedobject.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/gcsdk/schemasharedobject.h')
-rw-r--r--public/gcsdk/schemasharedobject.h127
1 files changed, 127 insertions, 0 deletions
diff --git a/public/gcsdk/schemasharedobject.h b/public/gcsdk/schemasharedobject.h
new file mode 100644
index 0000000..bfd85cb
--- /dev/null
+++ b/public/gcsdk/schemasharedobject.h
@@ -0,0 +1,127 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Shared object based on a CBaseRecord subclass
+//
+//=============================================================================
+
+#ifndef SCHEMASHAREDOBJECT_H
+#define SCHEMASHAREDOBJECT_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#ifndef GC
+#error "CSchemaSharedObject is only intended for use on GC-only shared objects. It shouldn't be included on the client"
+#endif
+
+#if defined( DEBUG )
+#include "gcbase.h"
+#endif
+
+namespace GCSDK
+{
+
+//----------------------------------------------------------------------------
+// Purpose: Contains helper functions to deal with passed in CRecordInfo,
+// so that a CRecordInfo can be built on the fly
+//----------------------------------------------------------------------------
+class CSchemaSharedObjectHelper
+{
+public:
+ static bool BYieldingAddInsertToTransaction( CSQLAccess & sqlAccess, CRecordBase *pRecordBase );
+ static bool BYieldingAddWriteToTransaction( CSQLAccess & sqlAccess, CRecordBase *pRecordBase, const CColumnSet & csDatabaseDirty );
+ static bool BYieldingAddRemoveToTransaction( CSQLAccess & sqlAccess, CRecordBase *pRecordBase );
+ static bool BYieldingAddToDatabase( CRecordBase *pRecordBase );
+ static bool BYieldingReadFromDatabase( CRecordBase *pRecordBase );
+ static void Dump( const CRecordBase *pRecordBase );
+};
+
+//----------------------------------------------------------------------------
+// Purpose: Base class for CSchemaSharedObject. This is where all the actual
+// code lives.
+//----------------------------------------------------------------------------
+class CSchemaSharedObjectBase : public CSharedObject
+{
+public:
+ typedef CSharedObject BaseClass;
+
+ CSchemaSharedObjectBase( CRecordInfo *pRecordInfo ) : BaseClass() {}
+
+ virtual bool BYieldingAddInsertToTransaction( CSQLAccess & sqlAccess );
+ virtual bool BYieldingAddWriteToTransaction( CSQLAccess & sqlAccess, const CUtlVector< int > &fields );
+ virtual bool BYieldingAddRemoveToTransaction( CSQLAccess & sqlAccess );
+ virtual bool BYieldingAddToDatabase();
+ virtual bool BYieldingReadFromDatabase() ;
+
+ // schema shared objects are GC-only and are never sent to clients.
+ virtual bool BIsNetworked() const { return false; }
+ virtual bool BParseFromMessage( const CUtlBuffer & buffer ) { return false; }
+ virtual bool BParseFromMessage( const std::string &buffer ) { return false; }
+ virtual bool BAddToMessage( CUtlBuffer & bufOutput ) const { return false; }
+ virtual bool BAddToMessage( std::string *pBuffer ) const { return false; }
+ virtual bool BAddDestroyToMessage( CUtlBuffer & bufDestroy ) const { return false; }
+ virtual bool BAddDestroyToMessage( std::string *pBuffer ) const { return false; }
+ virtual bool BUpdateFromNetwork( const CSharedObject & objUpdate ) { return false; }
+
+ virtual bool BIsKeyLess( const CSharedObject & soRHS ) const;
+ virtual void Copy( const CSharedObject & soRHS );
+ virtual void Dump() const;
+// virtual bool BIsNetworkDirty() const { return false; }
+// virtual void MakeNetworkClean() {}
+
+ const CRecordInfo * GetRecordInfo() const;
+
+
+#ifdef DBGFLAG_VALIDATE
+ virtual void Validate( CValidator &validator, const char *pchName );
+#endif
+protected:
+ virtual CRecordBase *GetPObject() = 0;
+ const CRecordBase *GetPObject() const { return const_cast<CSchemaSharedObjectBase *>(this)->GetPObject(); }
+ CColumnSet GetDatabaseDirtyColumnSet( const CUtlVector< int > &fields ) const;
+};
+
+
+//----------------------------------------------------------------------------
+// Purpose: Template for making a shared object that uses a specific Schema
+// class for its data store.
+//----------------------------------------------------------------------------
+template< typename SchObject_t, int nTypeID >
+class CSchemaSharedObject : public CSchemaSharedObjectBase
+{
+public:
+ CSchemaSharedObject()
+ : CSchemaSharedObjectBase( GCSDK::GSchemaFull().GetSchema( SchObject_t::k_iTable ).GetRecordInfo() )
+ {
+ }
+
+ ~CSchemaSharedObject()
+ {
+#ifdef DEBUG
+ // Ensure this SO is not in any cache, or we have an error. Note we must provide the type
+ //since we are in a destructor and it is unsafe to call virtual functions
+ Assert( !GGCBase()->IsSOCached( this, nTypeID ) );
+#endif
+ }
+
+ virtual int GetTypeID() const { return nTypeID; }
+
+ SchObject_t & Obj() { return m_schObject; }
+ const SchObject_t & Obj() const { return m_schObject; }
+
+ typedef SchObject_t SchObjectType_t;
+public:
+ const static int k_nTypeID = nTypeID;
+ const static int k_iFieldMax = SchObject_t::k_iFieldMax;
+
+protected:
+ CRecordBase *GetPObject() { return &m_schObject; }
+private:
+ SchObject_t m_schObject;
+};
+
+
+} // namespace GCSDK
+
+
+#endif //SCHEMASHAREDOBJECT_H