1
This commit is contained in:
274
gcsdk/schemasharedobject.cpp
Normal file
274
gcsdk/schemasharedobject.cpp
Normal file
@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user