175 lines
7.7 KiB
C++
175 lines
7.7 KiB
C++
//========= Copyright Valve Corporation, 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 FindIndex( CRecordInfo *pRec, const FieldSet_t& fieldSet );
|
|
int FindIndexByName( const char *pszName ) const;
|
|
int GetPKIndex() const { return m_iPKIndex; }
|
|
void SetPKIndex( int i ) { m_iPKIndex = i; }
|
|
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
|