summaryrefslogtreecommitdiff
path: root/public/gcsdk/sqlaccess/sqlutil.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/gcsdk/sqlaccess/sqlutil.h')
-rw-r--r--public/gcsdk/sqlaccess/sqlutil.h113
1 files changed, 113 insertions, 0 deletions
diff --git a/public/gcsdk/sqlaccess/sqlutil.h b/public/gcsdk/sqlaccess/sqlutil.h
new file mode 100644
index 0000000..5cad4d3
--- /dev/null
+++ b/public/gcsdk/sqlaccess/sqlutil.h
@@ -0,0 +1,113 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+
+#ifndef SQLUTIL_H
+#define SQLUTIL_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+
+namespace GCSDK
+{
+typedef CFmtStrN< 4096 > TSQLCmdStr;
+
+// Returns a long (1024 char) string of "?,?,?,?,?"... for use in IN clauses or INSERT statements
+const char *GetInsertArgString();
+// Returns the number of characters that should be used for the specified number of parameters
+uint32 GetInsertArgStringChars( uint32 nNumParams );
+// Returns the maximum number of parameters that are supported by the GetInsertArgString string
+uint32 GetInsertArgStringMaxParams();
+
+
+void ConvertFieldToText( EGCSQLType eFieldType, uint8 *pubRecord, int cubRecord, char *rgchField, int cchField, bool bQuoteString = true );
+void ConvertFieldArrayToInText( const CColumnInfo &columnInfo, byte *pubData, int cubData, char *rgchResult, bool bForPreparedStatement );
+char *SQLTypeFromField( const CColumnInfo &colInfo, char *pchBuf, int cchBuf );
+void EscapeStringValue( char *rgchField, int cchField );
+void AppendConstraints( const CRecordInfo *pRecordInfo, const CColumnInfo *pColumnInfo, bool bForAdd, CFmtStrMax & sCmd );
+void AppendTableConstraints( CRecordInfo *pRecordInfo, CFmtStrMax & sCmd );
+void AppendConstraint( const char *pchTableName, const char *pchColumnName, int nColFlagConstraint, bool bForAdd, bool bClustered,
+ CFmtStrMax & sCmd, int nFillFactor );
+void BuildTablePKConstraintText( TSQLCmdStr *psStatement, CRecordInfo *pRecordInfo );
+//void BuildSelectStatementText( CUtlVector<CQuery> *pVecQuery, bool bForPreparedStatement, char *pchStatement, int cchStatement );
+
+void BuildInsertStatementText( TSQLCmdStr *psStatement, const CRecordInfo *pRecordInfo );
+void BuildInsertAndReadStatementText( TSQLCmdStr *psStatement, CUtlVector<int> *pvecOutputFields, const CRecordInfo *pRecordInfo ) ;
+void BuildMergeStatementTextOnPKWhenMatchedUpdateWhenNotMatchedInsert( TSQLCmdStr *psStatement, const CRecordInfo *pRecordInfo );
+void BuildMergeStatementTextOnPKWhenNotMatchedInsert( TSQLCmdStr *psStatement, const CRecordInfo *pRecordInfo );
+void BuildSelectStatementText( TSQLCmdStr *psStatement, const CColumnSet & selectSet, const char *pchTopClause = NULL );
+void BuildUpdateStatementText( TSQLCmdStr *psStatement, const CColumnSet & columnSet );
+void BuildDeleteStatementText( TSQLCmdStr *psStatement, const CRecordInfo* pRecordInfo );
+void AppendWhereClauseText( TSQLCmdStr *psClause, const CColumnSet & columnSet );
+void BuildOutputClauseText( TSQLCmdStr *psClause, const CColumnSet & columnSet );
+
+template< typename T >
+bool CopyResultToSchVector( IGCSQLResultSet *pResultSet, const CColumnSet & readSet, CUtlVector< T > *pvecRecords )
+{
+ if ( pResultSet->GetRowCount() == 0 )
+ return true;
+
+ FOR_EACH_COLUMN_IN_SET( readSet, nColumnIndex )
+ {
+ EGCSQLType eRecordType = readSet.GetColumnInfo( nColumnIndex ).GetType();
+ EGCSQLType eResultType = pResultSet->GetColumnType( nColumnIndex );
+
+ Assert( eResultType == eRecordType );
+ if( eRecordType != eResultType )
+ return false;
+ }
+
+
+ for( CSQLRecord sqlRecord( 0, pResultSet ); sqlRecord.IsValid(); sqlRecord.NextRow() )
+ {
+ int nRecord = pvecRecords->AddToTail();
+
+ FOR_EACH_COLUMN_IN_SET( readSet, nColumnIndex )
+ {
+ uint8 *pubData;
+ uint32 cubData;
+
+ DbgVerify( sqlRecord.BGetColumnData( nColumnIndex, &pubData, (int*)&cubData ) );
+ DbgVerify( pvecRecords->Element( nRecord ).BSetField( readSet.GetColumn( nColumnIndex), pubData, cubData ) );
+ }
+ }
+ return true;
+}
+
+//EResult UpdateOrInsertUnique( CSQLAccess &sqlAccess, int iTable, int iField, CRecordBase *pRecordBase, int iIndexID );
+//bool BIsDuplicateInsertAttempt( const CSQLErrorInfo *pErr );
+
+
+#define EXIT_WITH_SQL_FAILURE( ret ) { nRet = ret; goto Exit; }
+
+#define EXIT_ON_BOOL_FAILURE( bRet, msg ) \
+ { \
+ if ( false == bRet ) \
+ { \
+ SetSQLError( msg ); \
+ nRet = SQL_ERROR; \
+ goto Exit; \
+ } \
+ }
+
+#define SAFE_CLOSE_STMT( x ) \
+ if ( NULL != (x) ) \
+ { \
+ SQLFreeHandle( SQL_HANDLE_STMT, (x) ); \
+ (x) = NULL; \
+ }
+
+#define SAFE_FREE_HANDLE( x, y ) \
+ if ( NULL != (x) ) \
+{ \
+ SQLFreeHandle( y, (x) ); \
+ (x) = NULL; \
+}
+
+} // namespace GCSDK
+#endif // SQLUTIL_H