You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
9.5 KiB
274 lines
9.5 KiB
//========= 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 |
|
|
|
|
|
|