/*-------------------------------------------------------------------------- dbsqlqry.h An additional layer to use in making dblib calls. Copyright (C) 1995 Microsoft Corporation All rights reserved. Authors: Keith Birney (keithbi) History: 07/19/95 keithbi Created --------------------------------------------------------------------------*/ #if !defined(__DBSQLQRY_H__) #define __DBSQLQRY_H__ #define DBNTWIN32 #pragma warning (disable:4121) #include #pragma warning (default:4121) #include // THIS_FILE is defined in source files // // #if defined(DEBUG) && defined(INLINE) // #undef THIS_FILE // static char BASED_CODE DBSQLQRY_H[] = "dbsqlqry.h"; // #define THIS_FILE DBSQLQRY_H // #endif #include class CDBConnection; class CDBQueryBase; class CDBQuery; typedef UINT (FNPROCESSROWCALLBACK)(CDBQuery *, DWORD, DWORD, PVOID); typedef FNPROCESSROWCALLBACK *PFNPROCESSROWCALLBACK; class CDBQueryBase { public: virtual VOID Release() = 0; virtual VOID ZeroDirtyParams() = 0; virtual VOID AddVarParam(WORD wDataType, PVOID pvParamValue, WORD wDataLen) = 0; virtual VOID AddSzParam(WORD wDataType, PVOID pvParamValue) = 0; virtual VOID AddParam(WORD wDataType, PVOID pvParamValue) = 0; virtual VOID AddReturnParam(WORD wDataType, PVOID pvParamValue) = 0; virtual VOID AddVarReturnParam(WORD wDataType, PVOID pvParamValue, WORD wDataLen, WORD wMaxLen) = 0; virtual VOID AddResultsSet() = 0; virtual VOID AddColumnToResultsSet(WORD wDataType) = 0; virtual VOID AddVarColumnToResultsSet(WORD wDataType, WORD wDataLen) = 0; virtual INT IGetReturnStatus() = 0; virtual VOID SetProcessRowCallback(PFNPROCESSROWCALLBACK pfnprocessrowcallback, PVOID pv) = 0; virtual UINT UiGetResultRow(PVOID pvFirst, ...) = 0; virtual UINT UiGetResultRowPtrs(PBYTE *pbFirst, ...) = 0; virtual BOOL FQueryComplete() = 0; virtual BOOL FQuerySuccess() = 0; virtual VOID AddRef() = 0; virtual VOID CancelExecution() = 0; virtual BYTE BGetDatabaseType() = 0; virtual VOID SetDatabaseType(BYTE bDatabaseType) = 0; virtual UINT UiGetAPIReturnCode() = 0; virtual VOID SetUserData(PVOID pv) = 0; virtual BOOL FIsReentrantCall() = 0; virtual UINT UiWaitUntilDone(DWORD dwTimeout) = 0; virtual VOID SetAPIReturnCode(UINT uiRet) = 0; virtual VOID SetRetryOnDBFail() = 0; virtual VOID SetPartitionInfo(DWORD dwPartitionType, PVOID pvData) = 0; virtual DWORD DwGetPartitionType() = 0; virtual PVOID PvGetPartitionBasis() = 0; virtual UINT UiWaitUntilResults(DWORD dwTimeout) = 0; virtual UINT UiGetNextRow(PVOID pvFirst, ...) = 0; virtual UINT UiGetNextResultsSet() = 0; }; class CDBQuery; extern "C" { CDBQuery DbSqlDLL *PdbqueryNew(WORD wDatabaseType, CHAR *szStoredProcedureName); } #define AC_MAX_NUMBER_DBPARAMS 32 #define AC_DB_OBJECT_NAME_SIZE 32 #define AC_MAX_NUMBER_RESULTS_SETS 5 #define AC_MAX_NUMBER_COLUMNS 32 #define AC_MAX_QUERIES_IN_POOL 1024 #define AC_RESULTS_ROW_BUFFER_WIDTH 2048 struct DBPARAM { WORD wDataType; WORD wDataLen; WORD wMaxLen; WORD wStatus; PBYTE pbParamValue; }; struct DBRESULTCOLUMN { WORD wDataType; WORD wDataLen; PBYTE pbData; }; struct DBRESULTINFO { DWORD dwNumberOfColumns; DBRESULTCOLUMN dbrescol[AC_MAX_NUMBER_COLUMNS]; }; class CDBQuery : public CDBQueryBase { friend CDBQuery DbSqlDLL *PdbqueryNew(WORD wDatabaseType, CHAR *szStoredProcedureName); public: void * operator new(size_t size); void operator delete(void *); VOID AddRef(); VOID Release(); VOID ZeroDirtyParams(); VOID AddVarParam(WORD wDataType, PVOID pvParamValue, WORD wDataLen); VOID AddSzParam(WORD wDataType, PVOID pvParamValue); VOID AddParam(WORD wDataType, PVOID pvParamValue); VOID AddReturnParam(WORD wDataType, PVOID pvParamValue); VOID AddVarReturnParam(WORD wDataType, PVOID pvParamValue, WORD wDataLen, WORD wMaxLen); VOID AddResultsSet(); VOID AddColumnToResultsSet(WORD wDataType); VOID AddVarColumnToResultsSet(WORD wDataType, WORD wDataLen); INT IGetReturnStatus() { return m_iRetStatus; } VOID SetProcessRowCallback(PFNPROCESSROWCALLBACK pfnprocessrowcallback, PVOID pv); UINT UiGetResultRow(PVOID pvFirst, ...); UINT UiGetResultRowPtrs(PBYTE *pbFirst, ...); UINT UiWaitUntilResults(DWORD dwTimeout); UINT UiGetNextRow(PVOID pvFirst, ...); UINT UiGetNextResultsSet(); PVOID PvGetResultsBuffer(); BOOL FQueryComplete() { return m_fQueryIsComplete; } BOOL FQuerySuccess() { return m_fQuerySucceeded; } VOID CancelExecution(); BYTE BGetDatabaseType() { return m_bDatabaseType; } VOID SetDatabaseType(BYTE bDatabaseType) { m_bDatabaseType = bDatabaseType; } UINT UiGetAPIReturnCode() { return m_uiAPIReturnCode; } VOID SetUserData(PVOID pv); VOID CleanupCallback(); BOOL FIsReentrantCall() { return m_fReentrantCallbackCall; } INT IGetNumberOfRowsProcessed(INT iResultsSet) { return m_iRowNum[iResultsSet]; } INT IGetNumberOfResultsSetsProcessed() { return m_iResultsNum + 1; } VOID SetBufferResultsSets(LONG lMaxRowsToBuffer); UINT UiAddRowToBuffer(); UINT UiWaitUntilDone(DWORD dwTimeout); VOID SetAPIReturnCode(UINT uiRet) { m_uiAPIReturnCode = uiRet; } VOID SetRetryOnDBFail() { m_fRetryOnFail = TRUE; } VOID SetPartitionInfo(DWORD dwPartitionType, PVOID pvData) { m_dwPartitionType = dwPartitionType; m_pvPartitionBasis = pvData; } DWORD DwGetPartitionType() { return m_dwPartitionType; } PVOID PvGetPartitionBasis() { return m_pvPartitionBasis; } static BOOL FInit(); static VOID Terminate(); static BOOL FQueryCompletePv(PVOID pv); protected: CDBQuery(BYTE bDatabaseType, CHAR *szStoredProcedureName); ~CDBQuery(); private: UINT UiDoDatabaseQuery(DBPROCESS *dbproc); CDBConnection* m_pdbconnection; DBPROCESS* m_dbproc; RETCODE m_retcodeLastDbresultsReturn; STATUS m_statusLastDbnextrowReturn; BOOL m_fReentrantCallbackCall; BOOL m_fRetryOnFail; CHAR m_szStoredProcedureName[AC_DB_OBJECT_NAME_SIZE]; BOOL m_fQueryIsComplete; BOOL m_fQuerySucceeded; BOOL m_fQueryCanceled; BOOL m_fBufferResultsSets; LONG m_lMaxRowsToBuffer; LONG m_cbBytesInBuffer; ULONG m_cRefCount; BYTE m_bDatabaseType; BYTE m_bNumberOfParams; BYTE m_bNumberOfReturnParams; BYTE m_bNumberOfResultsSets; INT m_iRetStatus; INT m_iResultsNum; INT m_iRowNum[AC_MAX_NUMBER_RESULTS_SETS]; UINT m_uiAPIReturnCode; PVOID m_pvUserData; PVOID m_pvBufferedResultsSets; PBYTE m_pbCurrentBufferOffset; PFNPROCESSROWCALLBACK m_pfnProcessRowCallback; CRITICAL_SECTION m_csCallbackCS; DWORD m_dwPartitionType; PVOID m_pvPartitionBasis; DBPARAM m_dbparam[AC_MAX_NUMBER_DBPARAMS]; DBRESULTINFO m_dbresinfo[AC_MAX_NUMBER_RESULTS_SETS]; BYTE m_bResultsSetRowBuffer[AC_RESULTS_ROW_BUFFER_WIDTH]; static BOOL fUseSuppliedDataLen[256]; static DWORD dwSqlBindValues[256]; static DWORD dwSqlDataLen[256]; static CPool *ppoolQuery; static BOOL fTerminateCalled; }; #define ACDB_CONTINUE 0 #define ACDB_CANCEL 1 #define ACDB_RESUBMIT 2 #define ACDB_CLEANUP 0xFFFFFFFF #endif // #if !defined(__DBSQLQRY_H__)