|
|
//========= Copyright � 1996-2004, Valve LLC, All rights reserved. ============
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================
#ifndef GCRECORDINFO_H
#define GCRECORDINFO_H
namespace GCSDK {
typedef CUtlMap<const char *,int> CMapIColumnInfo;
// --------------------------------------------------------------------------
// Information about a column in a record (table or result set)
class CColumnInfo { public: CColumnInfo(); ~CColumnInfo() { }
void Set( const char *pchName, int nSQLColumn, EGCSQLType eGCSQLType, int cubFixedSize, int nColFlags, int cubMaxSize ); const char *GetName() const { return m_rgchName; } int GetSQLColumn() const { return m_nSQLColumn; } EGCSQLType GetType() const { return m_eType; } int GetFixedSize() const { return m_cubFixedSize; } int GetMaxSize() const { return m_cchMaxSize; } int GetChecksum() const { Assert( m_bHaveChecksum ); return m_nChecksum; } bool BIsVariableLength() const; int GetColFlags() const { return m_nColFlags; } void GetColFlagDescription( char* pstrOut, int cubOutLength ) const; int GetConstraintColFlags() { return m_nColFlags & k_nColFlagAllConstraints; } void SetColFlagBits( int nColFlag ); bool BIsIndexed() const { return 0 != ( m_nColFlags & k_nColFlagIndexed ); } bool BIsClustered() const { return 0 != ( m_nColFlags & k_nColFlagClustered ); } bool BIsUnique() const { return 0 != ( m_nColFlags & k_nColFlagUnique ); } bool BIsAutoIncrement() const { return 0 != ( m_nColFlags & k_nColFlagAutoIncrement ); } bool BIsPrimaryKey() const { return 0 != ( m_nColFlags & k_nColFlagPrimaryKey ); } bool BIsExplicitlyIndexed() const { return BIsIndexed() && !( BIsPrimaryKey() || BIsUnique() ); } bool BIsExplicitlyUnique() const { return BIsUnique() && !BIsPrimaryKey(); } bool BIsInsertable() const { return !BIsAutoIncrement(); } void CalculateChecksum(); void ValidateColFlags() const; bool operator==( const CColumnInfo& refOther ) const; bool operator!=( const CColumnInfo& refOther ) const { return ! operator==( refOther ); }
#ifdef DBGFLAG_VALIDATE
void Validate( CValidator &validator, const char *pchName ); #endif // DBGFLAG_VALIDATE
private: CColumnInfo( CColumnInfo& ); // no copy constructor, disable default copy constructor
CColumnInfo& operator = ( CColumnInfo& ); // no assignment operator, disable default assignment operator
char m_rgchName[k_cSQLObjectNameMax+1];
EGCSQLType m_eType; // GC-based enum data type of this column
int m_nColFlags; // flags for this column
int m_nSQLColumn; // column # in SQL database to bind to, starts at 1.
int m_cubFixedSize; // if fixed size, the fixed size in bytes; else 0
int m_cchMaxSize; // if variable size, the maximum size; else 0
int m_nChecksum; // checksum of this column info for quick comparisons
bool m_bHaveChecksum; // have we calculated a checksum yet?
};
// --------------------------------------------------------------------------
// Information about a record (table or result set)
class CRecordInfo : public CRefCount { public: CRecordInfo();
void InitFromDSSchema( CSchema *pSchema );
void SetName( const char *pchName ); const char *GetName() const { return m_rgchName; } void AddColumn( const char *pchName, int nSQLColumn, EGCSQLType eGCSQLType, int cubFixedSize, int nColFlags, int cubMaxSize ); void SetAllColumnsAdded() { m_bAllColumnsAdded = true; } void PrepareForUse(); int GetFixedSize() const { return m_cubFixedSize; } int GetNumColumns() const { return m_VecColumnInfo.Count(); } const CColumnInfo &GetColumnInfo( uint32 unColumn ) const { return m_VecColumnInfo[unColumn]; } CColumnInfo &GetColumnInfo( uint32 unColumn ) { return m_VecColumnInfo[unColumn]; } bool BFindColumnByName( const char *pchName, int *piColumn ); bool BPreparedForUse() const { return m_bPreparedForUse; } void EnsureCapacity( int cColumns ) { m_VecColumnInfo.EnsureCapacity( cColumns ); } int GetChecksum(); ESchemaCatalog GetESchemaCatalog() const { return m_eSchemaCatalog; } void SetESchemaCatalog( ESchemaCatalog e ) { m_eSchemaCatalog = e; } bool EqualTo( CRecordInfo* pOther ); bool CompareIndexLists( CRecordInfo *pOther ); bool CompareFKs( CRecordInfo *pOther ); bool CompareFTSIndexLists( CRecordInfo *pOther ) const; EPrimaryKeyType GetPrimaryKeyType() const { return m_nHasPrimaryKey; } bool BHasPrimaryKey() { return GetPrimaryKeyType() != k_EPrimaryKeyTypeNone; } const FieldSet_t& GetPKFields() { Assert( BHasPrimaryKey()); return GetIndexFields( )[ m_iPKIndex ]; } const CUtlVector<FieldSet_t>& GetIndexFields() const { return m_VecIndexes; } int GetIndexFieldCount() const { return m_VecIndexes.Count(); } int GetPKIndex() const { return m_iPKIndex; } int AddIndex( const FieldSet_t& fieldSet ); void GetIndexFieldList( CFmtStr1024 *pstr, int nIndents ) const; int GetTableID() const { return m_nTableID; } void SetTableID( int nTableID ) { m_nTableID = nTableID; } bool BHasIdentity() const;
// full-text index
CUtlVector<int> & GetFTSFields() { return m_vecFTSFields; } bool BHasFTSIndex() const { return m_vecFTSFields.Count() > 0; } void AddFTSFields( CUtlVector< int > &refVecFields ); int GetFullTextCatalogIndex() { return m_nFullTextCatalogIndex; }
// foreign keys
void AddFK( const FKData_t &fkData ); void GetFKListString( CFmtStr1024 *pstr, int nIndents ); int GetFKCount(); FKData_t &GetFKData( int iIndex );
static CRecordInfo *Alloc(); #ifdef DBGFLAG_VALIDATE
static void ValidateStatics( CValidator &validator, const char *pchName ); void Validate( CValidator &validator, const char *pchName ); #endif //DBGFLAG_VALIDATE
// note: destructor is private. This is a ref-counted object, private destructor ensures callers can't accidentally delete
// directly, or declare on stack
virtual ~CRecordInfo() { }
private: virtual void DestroyThis(); void CalculateChecksum(); void BuildColumnNameIndex();
char m_rgchName[k_cSQLObjectNameMax+1]; int m_nTableID; // Object_ID if this table in SQL Server
CUtlVector<CColumnInfo> m_VecColumnInfo; // Vector of columns in this record
CMapIColumnInfo m_MapIColumnInfo; // Map of name->column index for quick lookup by name
EPrimaryKeyType m_nHasPrimaryKey; // Does this table contain a column that is a primary key?
int m_iPKIndex; // index info m_VecIndexes of our PK index; -1 if no PK
CUtlVector<FieldSet_t> m_VecIndexes; // vector of all fields in all indexes
int m_cubFixedSize; // Sum of data sizes for all fixed size columns
bool m_bAllColumnsAdded; // Have all columns been added
bool m_bPreparedForUse; // Have we finished being initialized?
bool m_bHaveColumnNameIndex; // Have we created a column name index? (Only generated if someone asks.)
bool m_bHaveChecksum; // Have we generated a checksum? (Only generated if someone asks.)
int m_nChecksum; // checksum of this record info for quick comparisons - includes all columns
ESchemaCatalog m_eSchemaCatalog; // what catalog owns this object?
CUtlVector< int > m_vecFTSFields; // which fields have FTS indexing?
int m_nFullTextCatalogIndex; // index of catalog for FTS index, if we get one
CUtlVector<FKData_t> m_VecFKData; // vector of all FK relationships defined on this table
CThreadMutex m_Mutex; static CThreadSafeClassMemoryPool<CRecordInfo> sm_MemPoolRecordInfo;
#ifdef _DEBUG
// validation tracking
static CUtlRBTree<CRecordInfo *, int > sm_mapPMemPoolRecordInfo; static CThreadMutex sm_mutexMemPoolRecordInfo; #endif
};
int __cdecl CompareColumnInfo( const CColumnInfo *pColumnInfoLeft, const CColumnInfo *pColumnInfoRight );
} // namespace GCSDK
#endif // GCRECORDINFO_H
|