// RSIMP.H: Definition of CITResultSet #ifndef __RSIMP_H__ #define __RSIMP_H__ #include "verinfo.h" class CHeader { public: PROPID dwPropID; DWORD dwType; union { LPVOID lpvData; DWORD dwValue; }; PRIORITY Priority; LPVOID lpvHeap; PFNCOLHEAPFREE pfnHeapFree; }; // Implemenation of IITResultSet class CITResultSet: public IITResultSet, public CComObjectRootEx, public CComCoClass { BEGIN_COM_MAP(CITResultSet) COM_INTERFACE_ENTRY(IITResultSet) END_COM_MAP() DECLARE_REGISTRY(CLSID_IITResultSet, "ITIR.ResultSet.4", "ITIR.ResultSet", 0, THREADFLAGS_BOTH) public: CITResultSet(); ~CITResultSet(); public: // Initialization STDMETHOD(SetColumnPriority)(LONG lColumnIndex, PRIORITY ColumnPriority); STDMETHOD(SetColumnHeap)(LONG lColumnIndex, LPVOID lpvHeap, PFNCOLHEAPFREE pfnColHeapFree); inline STDMETHOD(SetKeyProp)(PROPID KeyPropID); STDMETHOD(Add)(LPVOID lpvHdr); STDMETHOD(Add)(PROPID PropID, LPVOID lpvDefaultData, DWORD cbData, PRIORITY Priority); STDMETHOD(Add)(PROPID PropID, LPCWSTR lpszwDefault, PRIORITY Priority); STDMETHOD(Add)(PROPID PropID, DWORD dwDefaultData, PRIORITY Priority); // Build result set STDMETHOD(Append)(LPVOID lpvHdr, LPVOID lpvData); STDMETHOD(Set)(LONG lRowIndex, LPVOID lpvHdr, LPVOID lpvData); STDMETHOD(Set)(LONG lRowIndex, LONG lColumnIndex, DWORD dwData); STDMETHOD(Set)(LONG lRowIndex, LONG lColumnIndex, LPCWSTR lpwStr); STDMETHOD(Set)(LONG lRowIndex, LONG lColumnIndex, LPVOID lpvData, DWORD cbData); STDMETHOD(Set)(LONG lRowIndex, LONG lColumnIndex, DWORD_PTR dwData); STDMETHOD(Copy)(IITResultSet* pRSCopy); STDMETHOD(AppendRows)(IITResultSet* pResSrc, LONG lRowSrcFirst, LONG cSrcRows, LONG& lRowFirstDest); // Obtain info about result set STDMETHOD(Get)(LONG lRowIndex, LONG lColumnIndex, CProperty& Prop); inline STDMETHOD(GetKeyProp)(DWORD& KeyPropID); STDMETHOD(GetColumnPriority)(LONG lColumnIndex, PRIORITY& ColumnPriority); inline STDMETHOD(GetColumnCount)(LONG& lNumberOfColumns); inline STDMETHOD(GetRowCount)(LONG& lNumberOfRows); STDMETHOD(GetColumn)(LONG lColumnIndex, PROPID& PropID); STDMETHOD(GetColumn)(LONG lColumnIndex, PROPID& PropID, DWORD& dwType, LPVOID& lpvDefaultValue, DWORD& cbSize, PRIORITY& ColumnPriority); STDMETHOD(GetColumnFromPropID)(PROPID PropID, LONG& lColumnIndex); // Clear result set STDMETHOD(Clear)(); STDMETHOD(ClearRows)(); STDMETHOD(Free)(); // Asynchronous support STDMETHOD(IsCompleted)(); // returns S_OK or S_FALSE STDMETHOD(Cancel)(); STDMETHOD(Pause)(BOOL fPause); STDMETHOD(GetRowStatus)(LONG lRowFirst, LONG cRows, LPROWSTATUS lpRowStatus); STDMETHOD(GetColumnStatus)(LPCOLUMNSTATUS lpColStatus); // STDMETHOD(Merge)(); // Private methods and data private: // Methods for memory management HRESULT WINAPI Reserve(); HRESULT WINAPI Commit(LONG RowNum); HRESULT WINAPI FreeMem(); // Data LONG m_cProp; // Number of properties (column count) DWORD m_dwKeyProp; // Key property CHeader m_Header[MAX_COLUMNS]; // Result set header HANDLE m_hResultSet; // Handle to result set DWORD_PTR** m_ResultSet; // Result set data - an array of pointers to chunks // of rows LONG m_Chunk; // Keeps track of which chunk we need to access LONG m_NumChunks; // Number of chunks accessible via m_ResultSet LONG m_AppendRow; // Next row for appending // data to keep calculations to a minimum BOOL m_fInit; // Have we calculated numbers and allocated page map yet? LONG m_BytesReserved; // Number of bytes reserved at a time LONG m_RowsPerPage; // Number of rows in a page of memory LONG m_NumberOfPages; // Number of pages in a result set chunk BOOL* m_PageMap; // Keeps track of which pages have been allocated (per chunk) LONG m_RowsReserved; // Total number of rows that have been reserved _ThreadModel::AutoCriticalSection m_cs; // Critical section obj. LPVOID m_pMemPool; // Memory pool for data }; #endif