//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 - 2000. // // File: Distrib.hxx // // Contents: Base class for distributed rowset // // Classes: CDistributedRowset // // History: 23-Feb-95 KyleP Created // //---------------------------------------------------------------------------- #pragma once #include #include #include #include #include "rowman.hxx" #include "disnotfy.hxx" #include "bmkacc.hxx" //+--------------------------------------------------------------------------- // // Class: CDistributedRowset // // Purpose: Base class for distributed rowset. Only implements // sequential methods. // // History: 05-Jun-95 KyleP Created. // //---------------------------------------------------------------------------- class CDistributedRowset : public IRowset, public IColumnsInfo, public IRowsetIdentity, public IAccessor, public IRowsetInfo, public IConvertType, public IRowsetQueryStatus { public: // // IUnknown methods. // STDMETHOD(QueryInterface) ( THIS_ REFIID riid, LPVOID *ppiuk ) { return _pControllingUnknown->QueryInterface(riid,ppiuk); } STDMETHOD_(ULONG, AddRef) (THIS) { return _pControllingUnknown->AddRef();} STDMETHOD_(ULONG, Release) (THIS) {return _pControllingUnknown->Release(); } // // IAccessor methods // STDMETHOD(AddRefAccessor) (HACCESSOR hAccessor, ULONG * pcRefCount); STDMETHOD(CreateAccessor) (DBACCESSORFLAGS dwAccessorFlags, DBCOUNTITEM cBindings, const DBBINDING rgBindings[], DBLENGTH cbRowSize, HACCESSOR * phAccessor, DBBINDSTATUS rgStatus[]); STDMETHOD(GetBindings) (HACCESSOR hAccessor, DBACCESSORFLAGS * pdwAccessorFlags, DBCOUNTITEM * pcBindings, DBBINDING * * prgBindings); STDMETHOD(ReleaseAccessor) (HACCESSOR hAccessor, ULONG * pcRefCount); // // IRowsetInfo methods // STDMETHOD(GetProperties) (const ULONG cPropertyIDSets, const DBPROPIDSET rgPropertyIDSets[], ULONG * pcProperties, DBPROPSET ** prgProperties); STDMETHOD(GetReferencedRowset) (DBORDINAL iOrdinal, REFIID riid, IUnknown ** ppReferencedRowset); // // IRowset methods // STDMETHOD(AddRefRows) (DBCOUNTITEM cRows, const HROW rghRows [], DBREFCOUNT rgRefCounts[], DBROWSTATUS rgRowStatus[]); STDMETHOD(GetData) (HROW hRow, HACCESSOR hAccessor, void * pData); STDMETHOD(GetNextRows) (HCHAPTER hChapter, DBROWOFFSET cRowsToSkip, DBROWCOUNT cRows, DBCOUNTITEM * pcRowsObtained, HROW ** pphRows); STDMETHOD(GetSpecification) (REFIID riid, IUnknown ** ppSpecification); STDMETHOD(ReleaseChapter) (HCHAPTER hChapter); STDMETHOD(ReleaseRows) (DBCOUNTITEM cRows, const HROW rghRows [], DBROWOPTIONS rgRowOptions[], DBREFCOUNT rgRefCounts[], DBROWSTATUS rgRowStatus[]); STDMETHOD(RestartPosition) (HCHAPTER hChapter); // // IColumnsInfo methods // STDMETHOD(GetColumnInfo) (DBORDINAL* pcColumns, DBCOLUMNINFO * * rrgInfo, WCHAR * * ppwchInfo ); STDMETHOD(MapColumnIDs) (DBORDINAL cColumnIDs, const DBID rgColumnIDs[], DBORDINAL rgColumns[]); // // IRowsetIdentity methods // STDMETHOD(IsSameRow) ( HROW hThisRow, HROW hThatRow ); // // IConvertType methods // STDMETHOD(CanConvert) ( DBTYPE wFromType, DBTYPE wToType, DBCONVERTFLAGS dwConvertFlags); // // IRowsetQueryStatus methods // STDMETHOD(GetStatus) (DWORD * pStatus); STDMETHOD(GetStatusEx) (DWORD * pStatus, DWORD * pcFilteredDocuments, DWORD * pcDocumentsToFilter, DBCOUNTITEM * pdwRatioFinishedDenominator, DBCOUNTITEM * pdwRatioFinishedNumerator, DBBKMARK cbBmk, const BYTE * pBmk, DBCOUNTITEM * piRowCurrent, DBCOUNTITEM * pcRowsTotal ); // // Local methods // CDistributedRowset( IUnknown * pUnkOuter, IUnknown ** ppMyUnk, IRowset ** aChild, unsigned cChild, CMRowsetProps const & Props, unsigned cColumns, CAccessorBag & aAccessors, CCIOleDBError & DBErrorObj ); protected: virtual ~CDistributedRowset(); SCODE RealQueryInterface ( REFIID riid, LPVOID *ppiuk ); // used by _pControllingUnknown // in aggregation - does QI without delegating to outer unknown STDMETHOD(_GetNextRows) (HCHAPTER hChapter, DBROWOFFSET cRowsToSkip, DBROWCOUNT cRows, DBCOUNTITEM * pcRowsObtained, HROW ** pphRows) = 0; // This implementation includes all the extra columns that // we add for sorting, etc. STDMETHOD(_GetFullColumnInfo) (DBORDINAL* pcColumns, DBCOLUMNINFO * * rrgInfo, WCHAR * * ppwchInfo ); CMutexSem _mutex; // // Event Notification Stuff... // // Array of child rowsets connection points XArray< XInterface > _xArrChildWatchCP; XArray< XInterface > _xArrChildAsynchCP; // Array of child rowsets watch regions XArray< XInterface > _xArrChildRowsetWatchRegion; // Array of child rowsets advise cookies XArray _xArrWatchAdvise; XArray _xArrAsynchAdvise; // Distributed rowset connection point container which is // returned to the clients which try to connect to it XPtr _xServerCPC; // The sink which receives notifications from the child rowsets. // Also the Connection point to which the clients of distributed rowset // connect to. XPtr _xChildNotify; // Distributed Bookmark Accessors XPtr _xDistBmkAcc; // // Child rowsets. One per point of distribution. // IRowset ** _aChild; unsigned _cChild; // // Number of columns originally given in Execute. We may add some for // management of the rowset, but these shouldn't be exposed to the client. // unsigned _cColumns; // // Distributed row manager, manages HROWs. // CHRowManager _RowManager; // // Cached info for IColumnsInfo::GetColumnInfo. This implementation needs // it. Why fetch it again for client? // DBORDINAL _cColInfo; DBCOLUMNINFO * _aColInfo; WCHAR * _awchInfo; // // Ordinal of bookmark column. Remove when ordinal 0 == bookmark. // DBORDINAL _iColumnBookmark; DBBKMARK _cbBookmark; // // Accessors created on rowset // CAccessorBag _aAccessors; // // Rowset Properties for base rowset. // CMRowsetProps _Props; CCIOleDBError & _DBErrorObj; // db error object IUnknown * _pControllingUnknown; // outer unknown friend class CImpIUnknown; CImpIUnknown _impIUnknown; DBROWCOUNT _cMaxResults; // The max row limit DBROWCOUNT _cFirstRows; DBROWCOUNT _iCurrentRow; // Used to limit rows in sequential rowsets private: friend class CScrollableSorted; void _SetupChildNotifications( BOOL fAsynchOnly ); SCODE _SetupConnectionPointContainer( IRowset * pRowset, VOID * * ppiuk ); };