402 lines
11 KiB
C++
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_
|
||
|
|