302 lines
9.7 KiB
C++
302 lines
9.7 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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 <proprst.hxx>
|
||
|
#include <impiunk.hxx>
|
||
|
#include <accbase.hxx>
|
||
|
#include <conpt.hxx>
|
||
|
|
||
|
#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<IConnectionPoint> > _xArrChildWatchCP;
|
||
|
XArray< XInterface<IConnectionPoint> > _xArrChildAsynchCP;
|
||
|
|
||
|
// Array of child rowsets watch regions
|
||
|
XArray< XInterface<IRowsetWatchRegion> > _xArrChildRowsetWatchRegion;
|
||
|
|
||
|
// Array of child rowsets advise cookies
|
||
|
XArray<DWORD> _xArrWatchAdvise;
|
||
|
XArray<DWORD> _xArrAsynchAdvise;
|
||
|
|
||
|
// Distributed rowset connection point container which is
|
||
|
// returned to the clients which try to connect to it
|
||
|
XPtr<CConnectionPointContainer> _xServerCPC;
|
||
|
|
||
|
// The sink which receives notifications from the child rowsets.
|
||
|
// Also the Connection point to which the clients of distributed rowset
|
||
|
// connect to.
|
||
|
XPtr<CDistributedRowsetWatchNotify> _xChildNotify;
|
||
|
|
||
|
// Distributed Bookmark Accessors
|
||
|
XPtr<CDistributedBookmarkAccessor> _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<CDistributedRowset>;
|
||
|
|
||
|
CImpIUnknown<CDistributedRowset> _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 );
|
||
|
};
|
||
|
|