summaryrefslogtreecommitdiff
path: root/public/gcsdk/sqlaccess/recordinfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/gcsdk/sqlaccess/recordinfo.h')
-rw-r--r--public/gcsdk/sqlaccess/recordinfo.h174
1 files changed, 174 insertions, 0 deletions
diff --git a/public/gcsdk/sqlaccess/recordinfo.h b/public/gcsdk/sqlaccess/recordinfo.h
new file mode 100644
index 0000000..a4d332a
--- /dev/null
+++ b/public/gcsdk/sqlaccess/recordinfo.h
@@ -0,0 +1,174 @@
+//========= 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