//----------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995. // // File: crowset.hxx // // Contents: Rowset Class Declaration // //-------------------------------------------------------------------------- #ifndef _CROWSET_H_ #define _CROWSET_H_ #define FIRST_ROW 0 // changing this const will require changes to crowset.cxx #define RESET_ROW -1 #define STD_BMK_SIZE 1 #define ADSI_BMK_SIZE (sizeof(RBOOKMARK)) typedef struct tagCOLDATA { DWORD dwColOffset; // offset of column within row buffer DBTYPE wType; // OLEDB type of column } COLDATA; typedef struct tagROWBUFFER // header preceding all columns in a row { LONG lRefCount; // reference count of row LONG lRow; // row # DWORD cColErrors; // #columns in error in the row // ADS_SEARCH_COLUMN of the ADsPath attribute. Used only if // m_fadsPathPresent is FALSE ADS_SEARCH_COLUMN adsSearchCol; } ROWBUFFER; typedef struct tagOLEDBDATA { // Stores the ADS_SEARCH_COLUMN of this attribute so that it can be freed // later. ADS_SEARCH_COLUMN adsSearchCol; DBSTATUS dbStatus; DWORD dwLength; char *OledbValue; // Should be the last field in this structure } OLEDBDATA; typedef LONG RBOOKMARK; typedef enum tagFETCHDIR { FORWARD, BACKWARD } FETCHDIR; class CRowset : public IAccessor, public IColumnsInfo, public IConvertType, #if (!defined(BUILD_FOR_NT40)) public IGetRow, #endif public IRowsetIdentity, public IRowsetInfo, public IRowsetScroll { friend class CRowProvider; friend class CRow; protected: CRowsetInfo *m_pCRowsetInfo; CImpIAccessor *m_pCAccessor; CRowProvider *m_pCRowProvider; CUtilProp *m_pCUtilProp; IDataConvert *m_pIDataConvert; IColumnsInfo *m_pIColumnsInfo; IRowProvider *m_pIRowProvider; IMalloc *m_pIMalloc; LONG m_lLastFetchRow; DWORD m_cRowBytes; DBORDINAL m_cCol; COLDATA *m_pColData; CRITICAL_SECTION m_RowsetCritSection; BOOL m_fCritSectionInitialized; BOOL m_fEndOfRowset; BOOL m_fadsPathPresent; BOOL m_fAllAttrs; LONG m_cNumRowsCached; FETCHDIR m_LastFetchDir; ROWBUFFER **m_pRowsPtr; DWORD m_dwRowCacheSize; LONG m_lCurrentRow; DWORD m_dwMaxCacheSize; DWORD m_cRef; // Methods HRESULT CopyAccessors( ULONG cAccessors, // accessor count CCommandObject *pCCommand, // Command Object HACCESSOR rgAccessors[] // accessors on command object ); HRESULT GetColOffsets(void); HRESULT BringInRow(void); inline DWORD ColumnAlign(DWORD dwValue) { // align to next higher 8 byte boundary return ((dwValue+7) & (~7)); } HRESULT BmkToRow( ULONG cbBookmark, // number of bytes in the bookmark const BYTE *pBookmark, // pointer to bookmark LONG *plRow ); HRESULT SeekToRow(LONG lTargetRow); HRESULT SeekToEnd(void); inline RBOOKMARK RowToBmk(LONG lRow) { // bookmark is the same as the row return (RBOOKMARK) lRow; } inline LONG HROWToRow(HROW hRow) { // row handle is same as row + 1 return ((LONG) hRow) - 1; } inline HROW RowToHROW(LONG lRow) { // row handle is same as row + 1 return (HROW) (lRow + 1); } inline LONG HROWToIndex(HROW hRow) { int i; ROWBUFFER *pRowBuffer; for(i = 0; i < m_cNumRowsCached; i++) { pRowBuffer = m_pRowsPtr[i]; ADsAssert(pRowBuffer); if( pRowBuffer->lRow == (HROWToRow(hRow)) ) return i; } return -1; // invalid index } HRESULT GetMaxCacheSize(void); HRESULT IsRowObjRequested(BOOL *pfRowObjRequested); inline LONG RefCount(ROWBUFFER *pRowBuffer) { return pRowBuffer->lRefCount; } inline LONG IncrRefCount(ROWBUFFER *pRowBuffer) { return pRowBuffer->lRefCount++; } inline LONG DecrRefCount(ROWBUFFER *pRowBuffer) { return pRowBuffer->lRefCount--; } inline LONG Max(LONG x, LONG y) { return (x > y) ? x : y; } inline LONG Min(ULONG_PTR x, ULONG_PTR y) { return (x > y) ? y : x; } void FreeRow(ROWBUFFER *pRowBuffer); HRESULT GetADsPathFromHROW(HROW hRow, ADS_CASE_IGNORE_STRING *padsPath); public: CRowset(void); ~CRowset(void); static HRESULT CreateRowset( CRowProvider *pIRowProvider, // The Row provider IUnknown *pParentObj, // parent object, a command or a session CSessionObject *pCSession, // Session Object CCommandObject *pCCommand, // Command Object ULONG cPropertySets, // #prop sets in rowset property group DBPROPSET rgPropertySets[],// properties in rowset property group ULONG cAccessors, // accessor count HACCESSOR rgAccessors[], // accessors on command object BOOL fadsPathPresent, // Is ADsPath present in query BOOL fAllAttrs, // Return all attrs from row object? REFIID riid, // Interface desired IUnknown **ppIRowset // pointer to desired interface ); STDMETHODIMP FInit( CRowProvider *pIRowProvider, // The Row provider IUnknown *pParentObj, // parent object, a command or a session CSessionObject *pCSession, // Session Object CCommandObject *pCCommand, // Command Object ULONG cPropertySets, // #prop sets in rowset property group DBPROPSET rgPropertySets[],// properties in rowset property group ULONG cAccessors, // accessor count HACCESSOR rgAccessors[], // accessors on command object BOOL fadsPathPresent, // Is ADsPath present in query BOOL fAllAttrs // Return all attrs from row object? ); STDMETHODIMP GetNextRows( HCHAPTER hChapter, // ignored since this is not a chaptered rowset DBROWOFFSET lRowsOffset, DBROWCOUNT cRows, DBCOUNTITEM *pcRowsObtained, HROW **prghRows ); STDMETHODIMP GetRowsAt( HWATCHREGION hReserved, // Reserved for future use. Ignored. HCHAPTER hChapter, // ignored as this is not a chaptered rowset DBBKMARK cbBookmark, const BYTE *pBookmark, DBROWOFFSET lRowsOffset, DBROWCOUNT cRows, DBCOUNTITEM *pcRowsObtained, HROW **prghRows ); STDMETHODIMP GetData( HROW hRow, HACCESSOR hAccessor, void *pData ); STDMETHODIMP AddRefRows( DBCOUNTITEM cRows, const HROW rghRows[], ULONG rgRefCounts[], DBROWSTATUS rgRowStatus[] ); STDMETHODIMP ReleaseRows( DBCOUNTITEM cRows, const HROW rghRows[], DBROWOPTIONS rgRowOptions[], // ignored ULONG rgRefCounts[], DBROWSTATUS rgRowStatus[] ); STDMETHODIMP RestartPosition(HCHAPTER hChapter); STDMETHODIMP QueryInterface(THIS_ REFIID riid, LPVOID FAR* ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); STDMETHODIMP AddRefAccessor(HACCESSOR hAccessor, DBREFCOUNT *pcRefCount); STDMETHODIMP CreateAccessor( DBACCESSORFLAGS dwAccessorFlags, DBCOUNTITEM cBindings, const DBBINDING rgBindings[], DBLENGTH cbRowSize, HACCESSOR * phAccessor, DBBINDSTATUS rgStatus[] ); STDMETHODIMP ReleaseAccessor(HACCESSOR hAccessor, DBREFCOUNT *pcRefCount); STDMETHODIMP GetBindings( HACCESSOR hAccessor, DBACCESSORFLAGS * pdwAccessorFlags, DBCOUNTITEM * pcBindings, DBBINDING ** prgBindings ); STDMETHODIMP GetColumnInfo( DBORDINAL *pcColumns, DBCOLUMNINFO **pprgInfo, WCHAR ** ppStringsBuffer ); STDMETHODIMP MapColumnIDs( DBORDINAL cColumnIDs, const DBID rgColumnIDs[], DBORDINAL rgColumns[] ); STDMETHODIMP CanConvert( DBTYPE wFromType, DBTYPE wToType, DBCONVERTFLAGS dwConvertFlags ); STDMETHODIMP GetRowFromHROW( IUnknown *pUnkOuter, HROW hRow, REFIID riid, IUnknown **ppUnk ); STDMETHODIMP GetURLFromHROW( HROW hRow, LPOLESTR *ppwszURL ); STDMETHODIMP IsSameRow( HROW hRow1, HROW hRow2 ); STDMETHODIMP GetProperties( const ULONG cPropertyIDSets, const DBPROPIDSET rgPropertyIDSets[], ULONG *pcPropertySets, DBPROPSET **prgPropertySets ); STDMETHODIMP GetReferencedRowset( DBORDINAL iOrdinal, REFIID riid, IUnknown **ppReferencedRowset ); STDMETHODIMP GetSpecification( REFIID riid, IUnknown **ppSpecification ); STDMETHODIMP Compare( HCHAPTER hChapter, DBBKMARK cbBookmark1, const BYTE *pBookmark1, DBBKMARK cbBookmark2, const BYTE *pBookmark2, DBCOMPARE *pComparison ); STDMETHODIMP Hash( HCHAPTER hChapter, DBBKMARK cBookmarks, const DBBKMARK rgcbBookmarks[], const BYTE *rgpBookmarks[], DBHASHVALUE rgHashedValues[], DBROWSTATUS rgBookmarkStatus[] ); STDMETHODIMP GetRowsByBookmark( HCHAPTER hChapter, DBCOUNTITEM cRows, const DBBKMARK rgcbBookmarks[], const BYTE *rgpBookmarks[], HROW rghRows[], DBROWSTATUS rgRowStatus[] ); STDMETHODIMP GetApproximatePosition( HCHAPTER hChapter, DBBKMARK cbBookmark, const BYTE *pBookmark, DBCOUNTITEM *pulPosition, DBCOUNTITEM *pcRows ); STDMETHODIMP GetRowsAtRatio( HWATCHREGION hReserved1, HCHAPTER hChapter, DBCOUNTITEM ulNumerator, DBCOUNTITEM ulDenominator, DBROWCOUNT cRows, DBCOUNTITEM *pcRowsObtained, HROW **prghRows ); }; #endif // _CROWSET_H_