summaryrefslogtreecommitdiff
path: root/gcsdk/schemasharedobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gcsdk/schemasharedobject.cpp')
-rw-r--r--gcsdk/schemasharedobject.cpp274
1 files changed, 274 insertions, 0 deletions
diff --git a/gcsdk/schemasharedobject.cpp b/gcsdk/schemasharedobject.cpp
new file mode 100644
index 0000000..9ab65d1
--- /dev/null
+++ b/gcsdk/schemasharedobject.cpp
@@ -0,0 +1,274 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Shared object based on a CBaseRecord subclass
+//
+//=============================================================================
+#include "stdafx.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+namespace GCSDK
+{
+
+#ifdef GC
+
+//----------------------------------------------------------------------------
+// Purpose: Returns true if the object needs to be saved to the database
+//----------------------------------------------------------------------------
+bool CSchemaSharedObjectHelper::BYieldingAddToDatabase( CRecordBase *pRecordBase )
+{
+ if( pRecordBase->GetPSchema()->GetRecordInfo()->BHasIdentity() )
+ {
+ CSQLAccess sqlAccess;
+ return sqlAccess.BYieldingInsertWithIdentity( pRecordBase );
+ }
+ return false;
+}
+
+
+//----------------------------------------------------------------------------
+// Purpose: Returns true if the object needs to be saved to the database
+//----------------------------------------------------------------------------
+bool CSchemaSharedObjectHelper::BYieldingAddInsertToTransaction( CSQLAccess & sqlAccess, CRecordBase *pRecordBase )
+{
+ Assert( !pRecordBase->GetPSchema()->GetRecordInfo()->BHasIdentity() );
+ return sqlAccess.BYieldingInsertRecord( pRecordBase );
+}
+
+
+//----------------------------------------------------------------------------
+// Purpose: Reads the object from the database via its primary key. Initialize
+// the primary key fields before you call this.
+//----------------------------------------------------------------------------
+bool CSchemaSharedObjectHelper::BYieldingReadFromDatabase( CRecordBase *pRecordBase )
+{
+ CSQLAccess sqlAccess;
+ CColumnSet csPK( pRecordBase->GetPSchema()->GetRecordInfo() );
+ csPK.MakePrimaryKey();
+ CColumnSet csReadFields( pRecordBase->GetPSchema()->GetRecordInfo() );
+ csReadFields.MakeInverse( csPK );
+ if( k_EResultOK != sqlAccess.YieldingReadRecordWithWhereColumns( pRecordBase, csReadFields, csPK ) )
+ return false;
+
+ return true;
+}
+
+
+//----------------------------------------------------------------------------
+// Purpose: Writes the non-PK fields on the object to the database
+//----------------------------------------------------------------------------
+bool CSchemaSharedObjectHelper::BYieldingAddWriteToTransaction( CSQLAccess & sqlAccess, CRecordBase *pRecordBase, const CColumnSet & csDatabaseDirty )
+{
+ CColumnSet csPK( pRecordBase->GetPSchema()->GetRecordInfo() );
+ csPK.MakePrimaryKey();
+
+ if( !sqlAccess.BYieldingUpdateRecord( *pRecordBase, csPK, csDatabaseDirty ) )
+ return false;
+ return true;
+}
+
+
+//----------------------------------------------------------------------------
+// Purpose: Adds the primary key for this object to the network message
+//----------------------------------------------------------------------------
+bool CSchemaSharedObjectHelper::BYieldingAddRemoveToTransaction( CSQLAccess & sqlAccess, CRecordBase *pRecordBase )
+{
+ CColumnSet csPK( pRecordBase->GetPSchema()->GetRecordInfo() );
+ csPK.MakePrimaryKey();
+
+ if( !sqlAccess.BYieldingDeleteRecords( *pRecordBase, csPK ) )
+ return false;
+
+ return true;
+}
+#endif // GC
+
+
+//----------------------------------------------------------------------------
+// Purpose: Dumps diagnostic information about the shared object
+//----------------------------------------------------------------------------
+void CSchemaSharedObjectHelper::Dump( const CRecordBase *pRecordBase )
+{
+ CFmtStr1024 sOutput;
+ const CRecordInfo *pRecordInfo = pRecordBase->GetPRecordInfo();
+ for( uint32 unColumn = 0; unColumn < (uint32)pRecordInfo->GetNumColumns(); unColumn++ )
+ {
+ if( unColumn > 0 )
+ {
+ sOutput += ", ";
+ }
+
+ sOutput += pRecordInfo->GetColumnInfo( unColumn ).GetName();
+ sOutput += "=";
+
+ char pchFieldData[128];
+ pRecordBase->RenderField( unColumn, sizeof(pchFieldData), pchFieldData );
+ sOutput += pchFieldData;
+ }
+
+ EmitInfo( SPEW_CONSOLE, SPEW_ALWAYS, LOG_ALWAYS, "\t\t%s\n", sOutput.Access() );
+}
+
+
+//=============================================================================
+
+
+
+#ifdef GC
+
+//----------------------------------------------------------------------------
+// Purpose: Returns true if the object needs to be saved to the database
+//----------------------------------------------------------------------------
+bool CSchemaSharedObjectBase::BYieldingAddToDatabase()
+{
+ if( GetPObject()->GetPSchema()->GetRecordInfo()->BHasIdentity() )
+ {
+ return CSchemaSharedObjectHelper::BYieldingAddToDatabase( GetPObject() );
+ }
+ else
+ return CSharedObject::BYieldingAddToDatabase();
+}
+
+
+//----------------------------------------------------------------------------
+// Purpose: Returns true if the object needs to be saved to the database
+//----------------------------------------------------------------------------
+bool CSchemaSharedObjectBase::BYieldingAddInsertToTransaction( CSQLAccess & sqlAccess )
+{
+ return CSchemaSharedObjectHelper::BYieldingAddInsertToTransaction( sqlAccess, GetPObject() );
+}
+
+
+//----------------------------------------------------------------------------
+// Purpose: Reads the object from the database via its primary key. Initialize
+// the primary key fields before you call this.
+//----------------------------------------------------------------------------
+bool CSchemaSharedObjectBase::BYieldingReadFromDatabase()
+{
+ return CSchemaSharedObjectHelper::BYieldingReadFromDatabase( GetPObject() );
+}
+
+CColumnSet CSchemaSharedObjectBase::GetDatabaseDirtyColumnSet( const CUtlVector< int > &fields ) const
+{
+ CColumnSet cs( GetPObject()->GetPRecordInfo() );
+ FOR_EACH_VEC( fields, i )
+ {
+ cs.BAddColumn( fields[i] );
+ }
+
+ return cs;
+}
+
+//----------------------------------------------------------------------------
+// Purpose: Writes the non-PK fields on the object to the database
+//----------------------------------------------------------------------------
+bool CSchemaSharedObjectBase::BYieldingAddWriteToTransaction( CSQLAccess & sqlAccess, const CUtlVector< int > &fields )
+{
+ CColumnSet csDatabaseDirty = GetDatabaseDirtyColumnSet(fields);
+ return CSchemaSharedObjectHelper::BYieldingAddWriteToTransaction( sqlAccess, GetPObject(), csDatabaseDirty );
+}
+
+
+//----------------------------------------------------------------------------
+// Purpose: Adds the primary key for this object to the network message
+//----------------------------------------------------------------------------
+bool CSchemaSharedObjectBase::BYieldingAddRemoveToTransaction( CSQLAccess & sqlAccess )
+{
+ if ( CSchemaSharedObjectHelper::BYieldingAddRemoveToTransaction( sqlAccess, GetPObject() ) )
+ {
+ return true;
+ }
+ return false;
+}
+
+
+#endif // GC
+
+//----------------------------------------------------------------------------
+// Purpose: Returns true if this is less than than the object in soRHS. This
+// comparison is deterministic, but it may not be pleasing to a user
+// since it is just going to compare raw memory. If you need a sort
+// that is user-visible you will need to do it at a higher level that
+// actually knows what the data in these objects means.
+//----------------------------------------------------------------------------
+bool CSchemaSharedObjectBase::BIsKeyLess( const CSharedObject & soRHS ) const
+{
+ Assert( GetTypeID() == soRHS.GetTypeID() );
+ const CSchemaSharedObjectBase & soSchemaRHS = (const CSchemaSharedObjectBase &)soRHS;
+
+ CColumnSet csPK( GetPObject()->GetPSchema()->GetRecordInfo() );
+ csPK.MakePrimaryKey();
+
+ FOR_EACH_COLUMN_IN_SET( csPK, unColumnIndex )
+ {
+ uint8 *pubMyData, *pubTheirData;
+ uint32 cubMyData, cubTheirData;
+ int nColumn = csPK.GetColumn( unColumnIndex );
+ DbgVerify( GetPObject()->BGetField( nColumn, &pubMyData, &cubMyData ) );
+ DbgVerify( soSchemaRHS.GetPObject()->BGetField( nColumn, &pubTheirData, &cubTheirData ) );
+
+ int nCmp = Q_memcmp( pubMyData, pubTheirData, MIN( cubMyData, cubTheirData ) );
+
+ // longer chunks of memory are greater
+ if( nCmp == 0 )
+ {
+ nCmp = cubTheirData > cubMyData;
+ }
+
+ if( nCmp != 0 )
+ return nCmp < 0;
+ }
+
+ return false;
+}
+
+
+//----------------------------------------------------------------------------
+// Purpose: Copy the data from the specified schema shared object into this.
+// Both objects must be of the same type.
+//----------------------------------------------------------------------------
+void CSchemaSharedObjectBase::Copy( const CSharedObject & soRHS )
+{
+ Assert( GetTypeID() == soRHS.GetTypeID() );
+ CSchemaSharedObjectBase & soRHSBase = (CSchemaSharedObjectBase &)soRHS;
+ *GetPObject() = *(soRHSBase.GetPObject());
+}
+
+
+//----------------------------------------------------------------------------
+// Purpose: Dumps diagnostic information about the shared object
+//----------------------------------------------------------------------------
+void CSchemaSharedObjectBase::Dump() const
+{
+ CSchemaSharedObjectHelper::Dump( GetPObject() );
+}
+
+
+//----------------------------------------------------------------------------
+// Purpose: Returns the record info object for this type of schema object
+//----------------------------------------------------------------------------
+const CRecordInfo * CSchemaSharedObjectBase::GetRecordInfo() const
+{
+ return GetPObject()->GetPRecordInfo();
+}
+
+
+//----------------------------------------------------------------------------
+// Purpose: Claims all memory for the object.
+//----------------------------------------------------------------------------
+#ifdef DBGFLAG_VALIDATE
+void CSchemaSharedObjectBase::Validate( CValidator &validator, const char *pchName )
+{
+ CSharedObject::Validate( validator, pchName );
+
+ // these are INSIDE the function instead of outside so the interface
+ // doesn't change
+ VALIDATE_SCOPE();
+}
+#endif
+
+
+} // namespace GCSDK
+
+