summaryrefslogtreecommitdiff
path: root/public/gcsdk/sqlaccess/schemafull.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/gcsdk/sqlaccess/schemafull.h')
-rw-r--r--public/gcsdk/sqlaccess/schemafull.h284
1 files changed, 284 insertions, 0 deletions
diff --git a/public/gcsdk/sqlaccess/schemafull.h b/public/gcsdk/sqlaccess/schemafull.h
new file mode 100644
index 0000000..c971478
--- /dev/null
+++ b/public/gcsdk/sqlaccess/schemafull.h
@@ -0,0 +1,284 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+
+#ifndef GCSCHEMAFULL_H
+#define GCSCHEMAFULL_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+
+namespace GCSDK
+{
+
+
+//-----------------------------------------------------------------------------
+// SerSchemaFull
+// This defines the binary serialization format for a CSchemaFull
+//-----------------------------------------------------------------------------
+struct SerSchemaFull_t
+{
+ enum EVersion
+ {
+ k_ECurrentVersion = 1,
+ };
+
+ int32 m_nVersion; // version of serialization format
+ int32 m_cSchema; // # of schema we contain
+};
+
+
+//-----------------------------------------------------------------------------
+// CFTSCatalogInfo
+// information about a full text search catalog object in our schema
+//-----------------------------------------------------------------------------
+class CFTSCatalogInfo
+{
+public:
+ enum ESchemaCatalog m_eCatalog;
+ const char *m_pstrName;
+ int m_nFileGroup;
+
+ CFTSCatalogInfo()
+ : m_pstrName( NULL ),
+ m_eCatalog( k_ESchemaCatalogInvalid )
+ {
+ }
+
+ ~CFTSCatalogInfo()
+ {
+ free( (void*) m_pstrName);
+ }
+
+ CFTSCatalogInfo( const CFTSCatalogInfo &refOther )
+ {
+ m_eCatalog = refOther.m_eCatalog;
+ m_nFileGroup = refOther.m_nFileGroup;
+ if ( refOther.m_pstrName != NULL )
+ m_pstrName = strdup( refOther.m_pstrName );
+ else
+ m_pstrName = NULL;
+ }
+
+#ifdef DBGFLAG_VALIDATE
+ void Validate( CValidator &validator, const char *pchName ) // Validate our internal structures
+ {
+ validator.ClaimMemory( (void *) m_pstrName );
+ }
+#endif
+};
+
+
+//-----------------------------------------------------------------------------
+// SchemaFull conversion instructions
+// These specify various operations that can be performed when converting
+// from one SchemaFull to another.
+//-----------------------------------------------------------------------------
+struct DeleteTable_t
+{
+ char m_rgchTableName[k_cSQLObjectNameMax]; // Name of the table to delete
+};
+
+struct RenameTable_t
+{
+ char m_rgchTableNameOld[k_cSQLObjectNameMax]; // Rename a table with this name
+ int m_iTableDst; // to this table
+};
+
+
+enum ETriggerType
+{
+ k_ETriggerType_Invalid,
+ k_ETriggerType_After_Insert,
+ k_ETriggerType_InsteadOf_Insert,
+ k_ETriggerType_After_Delete,
+ k_ETriggerType_InsteadOf_Delete,
+ k_ETriggerType_After_Update,
+ k_ETriggerType_InsteadOf_Update,
+};
+
+class CTriggerInfo
+{
+public:
+ CTriggerInfo()
+ : m_eTriggerType( k_ETriggerType_Invalid ),
+ m_bMatched( false )
+ {
+ }
+
+ // are these equal for identity?
+ bool operator==( const CTriggerInfo& refOther ) const
+ {
+ if ( 0 != Q_stricmp( m_szTriggerTableName, refOther.m_szTriggerTableName ) )
+ return false;
+ if ( 0 != Q_stricmp( m_szTriggerName, refOther.m_szTriggerName ) )
+ return false;
+
+ // they're equal!
+ return true;
+ }
+
+ // if the identity is the same, this will tell if text or type differs
+ bool IsDifferent( const CTriggerInfo& refOther ) const
+ {
+ if ( m_eTriggerType != refOther.m_eTriggerType )
+ return false;
+ if ( m_strText != refOther.m_strText )
+ return false;
+
+ // they're equal!
+ return true;
+ }
+
+ const char* GetTriggerTypeString() const
+ {
+ const char *pstrSQL = "~~ unknown trigger type syntax error ~~";
+
+ switch ( m_eTriggerType )
+ {
+ case k_ETriggerType_After_Insert:
+ pstrSQL = "AFTER INSERT";
+ break;
+ case k_ETriggerType_InsteadOf_Insert:
+ pstrSQL = "INSTEAD OF INSERT";
+ break;
+ case k_ETriggerType_After_Delete:
+ pstrSQL = "AFTER DELETE";
+ break;
+ case k_ETriggerType_InsteadOf_Delete:
+ pstrSQL = "INSTEAD OF DELETE";
+ break;
+ case k_ETriggerType_After_Update:
+ pstrSQL = "AFTER UPDATE";
+ break;
+ case k_ETriggerType_InsteadOf_Update:
+ pstrSQL = "INSTEAD OF UPDATE";
+ break;
+
+ default:
+ case k_ETriggerType_Invalid:
+ /* initialize is fine, thanks */
+ break;
+ }
+
+ return pstrSQL;
+ }
+
+ bool m_bMatched; // got matched during schema convert
+ ETriggerType m_eTriggerType; // what kinda trigger is this?
+ ESchemaCatalog m_eSchemaCatalog; // catalog where this trigger lives
+ char m_szTriggerName[k_cSQLObjectNameMax]; // name of the trigger object
+ char m_szTriggerTableName[k_cSQLObjectNameMax]; // name of the table hosting this trigger
+ CUtlString m_strText; // text of the trigger
+
+ // Validate our internal structures
+#ifdef DBGFLAG_VALIDATE
+ void Validate( CValidator &validator, const char *pchName )
+ {
+ m_strText.Validate( validator, pchName );
+ }
+#endif
+};
+
+
+//-----------------------------------------------------------------------------
+// CSchemaFull
+// This defines the schema for the entire data store. It's essentially just
+// a collection of CSchema, which define the schema for individual tables.
+//-----------------------------------------------------------------------------
+class CSchemaFull
+{
+public:
+ // Constructors & destructors
+ CSchemaFull();
+ ~CSchemaFull();
+
+ void Uninit();
+
+ // add a new schema and return its pointer.
+ CSchema *AddNewSchema( int iTable, ESchemaCatalog eCatalog, const char *pstrName )
+ {
+ CSchema &refNewSchema = m_VecSchema[m_VecSchema.AddToTail()];
+ refNewSchema.SetName( pstrName );
+ refNewSchema.SetESchemaCatalog( eCatalog );
+ SetITable( &refNewSchema, iTable );
+ return &refNewSchema;
+ }
+
+
+ // Accessors
+ int GetCSchema() const { return m_VecSchema.Count(); }
+ CSchema &GetSchema( int iSchema ) { return m_VecSchema[iSchema]; }
+ uint32 GetCheckSum() const { return m_unCheckSum; }
+ const char *GetDefaultSchemaNameForCatalog( ESchemaCatalog eCatalog );
+
+ uint8 *GetPubScratchBuffer( );
+ uint32 GetCubScratchBuffer() const { return m_cubScratchBuffer; }
+
+ // Makes sure that a generated intrinsic schema is consistent
+ void CheckSchema( CSchema *pSchema, int cField, uint32 cubRecord );
+
+ // Find the table with a given name (returns -1 if not found)
+ int FindITable( const char *pchName );
+ const char *PchTableFromITable( int iTable );
+
+ // Helper functions for recording schema conversion operations
+ void AddDeleteTable( const char *pchTableName );
+ void AddRenameTable( const char *pchTableNameOld, const char *pchTableNameNew );
+ void AddDeleteField( const char *pchTableName, const char *pchFieldName );
+ void AddRenameField( const char *pchTableName, const char *pchFieldNameOld, const char *pchFieldNameNew );
+ void AddAlterField( const char *pchTableName, const char *pchFieldNameOld, const char *pchFieldNameNew, PfnAlterField_t pfnAlterField );
+
+ // declare that a trigger is on a table
+ void AddTrigger( ESchemaCatalog eCatalog, const char *pchTableName, const char *pchTriggerName, ETriggerType eTriggerType, const char *pchTriggerText );
+
+ // Schema conversion helper: figure out what table to map a table from a different schema to
+ bool BCanConvertTable( const char *pchTableSrc, int *piTableDst );
+
+ // full text catalogs
+ void AddFullTextCatalog( enum ESchemaCatalog eCatalog, const char *pstrCatalogName, int nFileGroup );
+ int GetFTSCatalogByName( enum ESchemaCatalog eCatalog, const char *pstrCatalogName );
+ void EnableFTS( enum ESchemaCatalog eCatalog );
+ int GetCFTSCatalogs() const { return m_vecFTSCatalogs.Count(); }
+ const CFTSCatalogInfo & GetFTSCatalogInfo( int nIndex ) const { return m_vecFTSCatalogs[nIndex]; }
+
+ const CUtlVector< CTriggerInfo> & GetTriggerInfos( ) const { return m_VecTriggers; }
+
+ // is the given schema catalog FTS enabled?
+ bool GetFTSEnabled( enum ESchemaCatalog eCatalog );
+
+ void Validate( CValidator &validator, const char *pchName ); // Validate our internal structures
+
+ // sets tableID on CSchema, checking that it is not a duplicate
+ void SetITable( CSchema* pSchema, int iTable );
+ void FinishInit(); // Recalculates some internal fields
+private:
+ CUtlConstString m_strDefaultSchemaName;
+
+ CUtlVector< CSchema > m_VecSchema; // Schema for tables in all catalogs
+ CUtlVector< CTriggerInfo > m_VecTriggers; // list of triggers in all catalogs
+
+ // which schema catalogs have FTS enabled?
+ CUtlMap< ESchemaCatalog, bool > m_mapFTSEnabled;
+
+ // list of catalogs; each is marked with the schema where it lives.
+ CUtlVector< CFTSCatalogInfo > m_vecFTSCatalogs;
+
+ uint32 m_unCheckSum; // A simple checksum of our contents
+
+ // SchemaFull conversion instructions
+ CUtlVector<DeleteTable_t> m_VecDeleteTable;
+ CUtlVector<RenameTable_t> m_VecRenameTable;
+
+ uint8 *m_pubScratchBuffer; // Big enough to hold any record or sparse record in this schemafull
+ uint32 m_cubScratchBuffer; // Size of the scratch buffer
+};
+
+extern CSchemaFull & GSchemaFull();
+
+} // namespace GCSDK
+#endif // GCSCHEMAFULL_H