windows-nt/Source/XPSP1/NT/ds/adsi/router/crowset.hxx
2020-09-26 16:20:57 +08:00

402 lines
11 KiB
C++

//-----------------------------------------------------------------------------
//
// 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_