//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1994 - 1999. // // File: query.hxx // // Contents: Declarations of classes which implement IRowset and // related OLE DB interfaces over file stores. // // Classes: PQuery - abstract base class // CAsyncQuery - container of table/query for a set of cursors // CSvcQueryProxy - Proxy to PQuery for the CI Service // // History: 31 May 94 AlanW Created // //---------------------------------------------------------------------------- #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include const CI_TBL_CHAPT chaptInvalid = 0xffffffff; class PVarAllocator; class PFixedVarAllocator; class CRowSeekDescription; //+------------------------------------------------------------------------- // // Class: CGetRowsParams // // Purpose: Bundles the parameters for a GetRows call. // // History: 3 Sep 99 KLam Added ReplyBase // //-------------------------------------------------------------------------- class CGetRowsParams { public: CGetRowsParams( ULONG cRows, BOOL fFwdFetch, ULONG cbRowWidth, PFixedVarAllocator & rAlloc) : _cRowsRequested( cRows ), _fFwdFetch( fFwdFetch ), _cbRowWidth( cbRowWidth ), _pData( 0 ), _cRowsReturned( 0 ), _rAllocator( rAlloc ), _pbReplyBase ( 0 ) { } PBYTE GetRowBuffer( ); size_t GetRowWidth( ) const // NOTE: _rAllocator.FixedWidth() may differ // for GetRowsInfo case. { return _cbRowWidth; } PVarAllocator& GetVarAllocator( ) { return (PVarAllocator &) _rAllocator; } PFixedVarAllocator& GetFixedVarAllocator( ) { return _rAllocator; } void SetRowsRequested( ULONG cRows ) { Win4Assert(_cRowsReturned == 0); _cRowsRequested = cRows; } void IncrementRowsRequested( ) { _cRowsRequested++; Win4Assert(_cRowsReturned <= _cRowsRequested); _pData = 0; } void SetRowsTransferred( ULONG cRows ) { Win4Assert(_cRowsReturned == 0); _cRowsReturned = cRows; } void IncrementRowCount( ) { _cRowsReturned++; Win4Assert(_cRowsReturned <= _cRowsRequested); _pData = 0; } unsigned RowsTransferred( ) const { return _cRowsReturned; } unsigned RowsToTransfer( ) const { return _cRowsRequested - _cRowsReturned; } PBYTE GetBuffer( ) const; BOOL GetFwdFetch() { return _fFwdFetch; } BYTE * GetReplyBase () const { return _pbReplyBase; } void SetReplyBase ( BYTE * pbReplyBase ) { _pbReplyBase = pbReplyBase; } private: ULONG _cRowsRequested; // number of rows to transfer ULONG _cRowsReturned; // number of rows transferred PFixedVarAllocator & _rAllocator; // allocator for row and indirect data ULONG _cbRowWidth; // size of a row in the row buffer void * _pData; // pointer to current row data buffer BOOL _fFwdFetch; // True if rows are to be fetched in // forward direction BYTE * _pbReplyBase; // pointer to base of reply // only needed for Win64Client->Win32Server }; //+--------------------------------------------------------------------------- // // Class: PQuery // // Purpose: Abstract base class for CAsyncQuery, CSeqQuery and // CSvcQueryProxy. Abstracts the operations needed by CRowset. // // History: 26 Aug 1994 AlanW Created // 27 Jan 1995 Alanw Rearranged methods for ole-db phase 3 // // Notes: // //---------------------------------------------------------------------------- class __declspec(novtable) PQuery { public: PQuery( void ) { } virtual ~PQuery() { } virtual ULONG AddRef(void) = 0; virtual ULONG Release(void) = 0; virtual void WorkIdToPath( WORKID wid, CFunnyPath & funnyPath ) = 0; virtual BOOL CanDoWorkIdToPath() = 0; // // Methods supporting IRowset // virtual void SetBindings( ULONG hCursor, ULONG cbRowLength, CTableColumnSet& cols, CPidMapper & pids) = 0; virtual SCODE GetRows( ULONG hCursor, const CRowSeekDescription& rSeekDesc, CGetRowsParams& rRowsParams, XPtr& pSeekDescOut) = 0; virtual void RatioFinished( ULONG hCursor, DBCOUNTITEM & rulDenominator, DBCOUNTITEM & rulNumerator, DBCOUNTITEM & rcRows, BOOL & rfNewRows ) = 0; virtual SCODE RatioFinished( CNotificationSync & rSync, ULONG hCursor, DBCOUNTITEM & rulDenominator, DBCOUNTITEM & rulNumerator, DBCOUNTITEM & rcRows, BOOL & rfNewRows ) { RatioFinished(hCursor, rulDenominator, rulNumerator, rcRows, rfNewRows ); return S_OK; } virtual void RestartPosition( ULONG hCursor, CI_TBL_CHAPT chapt ) = 0; // // Methods supporting IRowsetLocate // virtual void Compare( ULONG hCursor, CI_TBL_CHAPT chapt, CI_TBL_BMK bmkFirst, CI_TBL_BMK bmkSecond, DWORD & rdwComparison) = 0; // // Methods supporting IRowsetScroll // virtual void GetApproximatePosition( ULONG hCursor, CI_TBL_CHAPT chapt, CI_TBL_BMK bmk, DBCOUNTITEM * pulNumerator, DBCOUNTITEM * pulDenominator) = 0; // // Support routines // virtual unsigned FreeCursor(ULONG hCursor) = 0; virtual SCODE GetNotifications( CNotificationSync &rSync, DBWATCHNOTIFY &changeType) = 0; // // IRowsetWatchRegion methods // virtual void SetWatchMode ( HWATCHREGION* phRegion, ULONG mode) = 0; virtual void GetWatchInfo ( HWATCHREGION hRegion, ULONG* pMode, CI_TBL_CHAPT* pChapt, CI_TBL_BMK* pBmk, DBCOUNTITEM* pcRows) = 0; virtual void ShrinkWatchRegion ( HWATCHREGION hRegion, CI_TBL_CHAPT chapt, CI_TBL_BMK bmk, LONG cRows ) = 0; virtual void Refresh () = 0; // // Methods supporting IRowsetWatchAll // virtual void StartWatching( ULONG hCursor) = 0; virtual void StopWatching ( // Stop method (Stop already used by IRowsetAsync) ULONG hCursor) = 0; // // Methods supporting IRowsetAsync // virtual void StopAsynch (ULONG hCursor) = 0; // // Method supporting IRowsetQueryStatus // virtual void GetQueryStatus( ULONG hCursor, DWORD & rdwStatus) = 0; virtual void GetQueryStatusEx( ULONG hCursor, DWORD & rdwStatus, DWORD & rcFilteredDocuments, DWORD & rcDocumentsToFilter, DBCOUNTITEM & rdwRatioFinishedDenominator, DBCOUNTITEM & rdwRatioFinishedNumerator, CI_TBL_BMK bmk, DBCOUNTITEM & riRowBmk, DBCOUNTITEM & rcRowsTotal ) = 0; // // Method supporting load of deferred values. // virtual BOOL FetchDeferredValue( WORKID wid, CFullPropSpec const & ps, PROPVARIANT & var ) = 0; }; class CRequestServer; //+--------------------------------------------------------------------------- // // Class: CAsyncQuery // // Purpose: Encapsulates a query execution context, PID mapper // and large table for use by a row cursor. // // Interface: PQuery // // History: 02 Jun 94 AlanW Created // // Notes: // //---------------------------------------------------------------------------- class CAsyncQuery : public PQuery { public: // // Local methods. // CAsyncQuery( XQueryOptimizer & qopt, XColumnSet & pcol, XSortSet & sort, XCategorizationSet &categ, unsigned cCursors, ULONG * aCursors, XInterface & pidremap, BOOL fEnableNotification, ICiCDocStore *pDocStore, CRequestServer * pQuiesce ); virtual ~CAsyncQuery(); ULONG AddRef(void); ULONG Release(void); void WorkIdToPath( WORKID wid, CFunnyPath & funnyPath ); BOOL CanDoWorkIdToPath(); // // Methods supporting IRowset // void SetBindings( ULONG hCursor, ULONG cbRowLength, CTableColumnSet& cols, CPidMapper & pids ); SCODE GetRows( ULONG hCursor, const CRowSeekDescription& crSeekDesc, CGetRowsParams& rRowsParams, XPtr& pSeekDescOut ); void RatioFinished( ULONG hCursor, DBCOUNTITEM & rulDenominator, DBCOUNTITEM & rulNumerator, DBCOUNTITEM & rcRows, BOOL & rfNewRows ); void RestartPosition( ULONG hCursor, CI_TBL_CHAPT chapt ); // // Methods supporting IRowsetLocate // void Compare( ULONG hCursor, CI_TBL_CHAPT chapt, CI_TBL_BMK bmkFirst, CI_TBL_BMK bmkSecond, DWORD & rdwComparison ); // // Methods supporting IRowsetScroll // void GetApproximatePosition( ULONG hCursor, CI_TBL_CHAPT chapt, CI_TBL_BMK bmk, DBCOUNTITEM * pulNumerator, DBCOUNTITEM * pulDenominator ); // // Support routines // unsigned FreeCursor(ULONG hCursor); SCODE GetNotifications( CNotificationSync &rSync, DBWATCHNOTIFY &changeType); // // Methods supporting IRowsetWatchRegion // void SetWatchMode ( HWATCHREGION * phRegion, ULONG mode); void GetWatchInfo ( HWATCHREGION hRegion, ULONG* pMode, CI_TBL_CHAPT* pChapt, CI_TBL_BMK* pBmk, DBCOUNTITEM* pcRows); void ShrinkWatchRegion ( HWATCHREGION hRegion, CI_TBL_CHAPT chapt, CI_TBL_BMK bmk, LONG cRows ); void Refresh (); // // Methods supporting IRowsetWatchAll // void StartWatching(ULONG hCursor) { THROW(CException( E_NOTIMPL )); } void StopWatching (ULONG hCursor) { THROW(CException( E_NOTIMPL )); } // // Methods supporting IRowsetAsync // void StopAsynch (ULONG hCursor) { THROW(CException( E_NOTIMPL )); } // // Method supporting IRowsetQueryStatus // void GetQueryStatus( ULONG hCursor, DWORD & rdwStatus); void GetQueryStatusEx( ULONG hCursor, DWORD & rdwStatus, DWORD & rcFilteredDocuments, DWORD & rcDocumentsToFilter, DBCOUNTITEM & rdwRatioFinishedDenominator, DBCOUNTITEM & rdwRatioFinishedNumerator, CI_TBL_BMK bmk, DBCOUNTITEM & riRowBmk, DBCOUNTITEM & rcRowsTotal ); // // Method supporting load of deferred values. // BOOL FetchDeferredValue( WORKID wid, CFullPropSpec const & ps, PROPVARIANT & var ); private: ULONG _CreateRowCursor(); LONG _ref; // reference count BOOL _fCanDoWorkidToPath; // TRUE if paths are cached. CMutexSem _mutex; // Serialize access to tables XInterface _pidremap; // Pid remapper for props. in query CLargeTable _Table; // The cached table CTableCursorSet _aCursors; // Array of table cursors DBCOUNTITEM _cRowsLastAsked; // for RatioFinished CDynArray _aCategorize; // array of categorization objects XInterface _xCiManager; XInterface _xNameToWidTranslator; XQAsyncExecute _QExec; // The query execution context // WARNING: don't put any more embedded objects after the XQAsyncExecute // if you are concerned that they be around if a notification // arrives while CAsyncQuery is being destroyed! }; //+--------------------------------------------------------------------------- // // Class: CSvcQueryProxy // // Purpose: Proxy to the PQuery class in the Svc driver. // // Interface: PQuery // // History: 26 Aug 94 AlanW Created // 13 Sep 96 dlee Converted to cisvc // //---------------------------------------------------------------------------- class CSvcQueryProxy : public PQuery { public: // Local methods. CSvcQueryProxy( CRequestClient & client, CColumnSet const & col, CRestriction const & rst, CSortSet const * pso, CCategorizationSet const * pcateg, CRowsetProperties const & RstProp, CPidMapper const & pidmap , ULONG cCursors, ULONG * aCursors ); ULONG AddRef(void); ULONG Release(void); void WorkIdToPath( WORKID wid, CFunnyPath & funnyPath ); // Methods supporting IRowset void SetBindings( ULONG hCursor, ULONG cbRowLength, CTableColumnSet & cols, CPidMapper & pids ); SCODE GetRows( ULONG hCursor, const CRowSeekDescription & rSeekDesc, CGetRowsParams& rRowsParams, XPtr & pSeekDescOut ); void RatioFinished( ULONG hCursor, DBCOUNTITEM & rulDenominator, DBCOUNTITEM & rulNumerator, DBCOUNTITEM & rcRows, BOOL & rfNewRows ); SCODE RatioFinished( CNotificationSync & rSync, ULONG hCursor, DBCOUNTITEM & rulDenominator, DBCOUNTITEM & rulNumerator, DBCOUNTITEM & rcRows, BOOL & rfNewRows ); void RestartPosition( ULONG hCursor, CI_TBL_CHAPT chapt ); // Methods supporting IRowsetLocate void Compare( ULONG hCursor, CI_TBL_CHAPT chapt, CI_TBL_BMK bmkFirst, CI_TBL_BMK bmkSecond, DWORD & rdwComparison ); // Methods supporting IRowsetScroll void GetApproximatePosition( ULONG hCursor, CI_TBL_CHAPT chapt, CI_TBL_BMK bmk, DBCOUNTITEM * pulNumerator, DBCOUNTITEM * pulDenominator ); // Support routines unsigned FreeCursor( ULONG hCursor ); SCODE GetNotifications( CNotificationSync & rSync, DBWATCHNOTIFY & changeType ); // IRowsetWatchRegion methods void SetWatchMode( HWATCHREGION * phRegion, ULONG mode ); void GetWatchInfo( HWATCHREGION hRegion, ULONG * pMode, CI_TBL_CHAPT * pChapt, CI_TBL_BMK * pBmk, DBCOUNTITEM * pcRows ); void ShrinkWatchRegion ( HWATCHREGION hRegion, CI_TBL_CHAPT chapt, CI_TBL_BMK bmk, LONG cRows ); void Refresh(); // // Methods supporting IRowsetWatchAll // void StartWatching(ULONG hCursor); void StopWatching (ULONG hCursor); // // Methods supporting IRowsetAsync // void StopAsynch (ULONG hCursor); // Method supporting IRowsetQueryStatus void GetQueryStatus( ULONG hCursor, DWORD & rdwStatus ); void GetQueryStatusEx( ULONG hCursor, DWORD & rdwStatus, DWORD & rcFilteredDocuments, DWORD & rcDocumentsToFilter, DBCOUNTITEM & rdwRatioFinishedDenominator, DBCOUNTITEM & rdwRatioFinishedNumerator, CI_TBL_BMK bmk, DBCOUNTITEM & riRowBmk, DBCOUNTITEM & rcRowsTotal ); BOOL FetchDeferredValue( WORKID wid, CFullPropSpec const & ps, PROPVARIANT & var ); BOOL CanDoWorkIdToPath() { return _fWorkIdUnique || !_fTrueSequential; } private: ~CSvcQueryProxy(); void ReExecuteSequentialQuery( ); CRequestClient & _client; // handles communication with cisvc long _ref; // reference count BOOL _fTrueSequential; // TRUE if a CSeqQuery BOOL _fWorkIdUnique; // TRUE if wid is backed by a catalog, // not by a fake wid in bigtable ULONG_PTR _ulServerCookie; // CRequestServer in cisvc CMutexSem _mutexFetchValue; // Serialize access to FetchValue XArray _xQuery; // binary stream for CreateQuery (cache for RestartPosition) XArray _xBindings; // binary stream for SetBindings (cache for RestartPosition) XArray _aCursors; // cursors (cache for RestartPosition) };