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.
284 lines
8.4 KiB
284 lines
8.4 KiB
//========= 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
|