|
|
/////////////////////////////////////////////////////////////////////////////////////////
//
// Microsoft WMIOLE DB Provider
//
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
// Class Definitions for CHashTbl Class and miscellaneous bookmark functions
//
/////////////////////////////////////////////////////////////////////////////////////////
#ifndef _HASHTBL_H_
#define _HASHTBL_H_
#include "bitarray.h"
#include "dataconvert.h"
#define SIZE_64K 65535 // Actually 64*1024-1
#define HASHTBLSIZE 500
#define BOOKMARKSIZE sizeof(ULONG_PTR)
/////////////////////////////////////////////////////////////////////////////////////////
// This defines the data as stored within the row buffer. Each row has columns laid out
// sequentially. Use 'offsetof' when doing pointer addition. Note that it is important
// to align these. Suggest ensuring quadword alignment for double and __int64.
/////////////////////////////////////////////////////////////////////////////////////////
typedef struct _COLUMNDATA{
_COLUMNDATA(); ~_COLUMNDATA(); HRESULT SetData(CVARIANT & vVar, DWORD dwColType); void ReleaseColumnData();
DBLENGTH dwLength; // length of data
DBSTATUS dwStatus; // status of column
DBTYPE dwType; BYTE * pbData; // data here and beyond
} COLUMNDATA, *PCOLUMNDATA;
/////////////////////////////////////////////////////////////////////////////////////////
// This is the layout of a row.
//
// Note the unique arrangement of the hash chain pointers inside the row itself.
//
// Note also that the structure for columns is defined, and each row contains an array
// of columns.
// Bookmarks are named separately from ColumnData, for clarity of usage. The layout
// directly matches COLUMNDATA, however. There are asserts which enforce this.
/////////////////////////////////////////////////////////////////////////////////////////
typedef struct tagRowBuff { ULONG ulRefCount; // reference count of outstanding handles
HSLOT ulSlot; tagRowBuff *prowbuffNext; // next row in bookmark hash chain
USHORT wBmkHash; // hash value (redundant)
VOID *pbBmk; // ptr to bookmark
ULONG cbBmk; // (dwLength) bookmark size, in bytes
ULONG dwBmkStatus; // (dwStatus) bookmark status
DBBKMARK dwBmk; // (bData) bookmark value, , maybe row count
// COLUMNDATA cdData[1]; // Column data here and beyond (Bookmark should be here)
COLUMNDATA *pdData; // Column data here and beyond (Bookmark should be here)
PCOLUMNDATA GetColumnData(int iCol); // Get PCOLUMNDATA pointer for a particlular column
HRESULT SetRowData(PCOLUMNDATA pColData); // get the pointer to the COLUMNDATA member of the structure
} ROWBUFF, *PROWBUFF;
typedef struct tagSLOT { HSLOT islotNext; HSLOT islotPrev; HSLOT cslot; } SLOT, *PSLOT;
typedef struct tagLSTSLOT { HSLOT islotFirst; HSLOT islotRov; HSLOT islotMin; HSLOT islotMax; BYTE *rgslot; LPBITARRAY pbitsSlot; // bit array to mark active rows
ULONG_PTR cbExtra; ULONG_PTR cbslotLeftOver; ULONG_PTR cbSlot; ULONG_PTR cbPage; ULONG_PTR cbCommitCurrent; ULONG_PTR cbCommitMax; } LSTSLOT, *PLSTSLOT;
HRESULT GetNextSlots(PLSTSLOT plstslot, HSLOT cslot, HSLOT* pislot); VOID DecoupleSlot(PLSTSLOT plstslot, HSLOT islot, PSLOT pslot); VOID AddSlotToList(PLSTSLOT plstslot, HSLOT islot, PSLOT pslot); HRESULT ReleaseSlots(PLSTSLOT plstslot, HSLOT islot, ULONG_PTR cslot); HRESULT InitializeSlotList(ULONG_PTR cslotMax, ULONG_PTR cbSlot, ULONG_PTR cbPage, LPBITARRAY pbits, PLSTSLOT* pplstslot, BYTE** prgslot); HRESULT ResetSlotList(PLSTSLOT plstslot); HRESULT ReleaseSlotList(PLSTSLOT plstslot); ROWBUFF* GetRowBuffer(PLSTSLOT plstslot , HSLOT islot);
class IHashTbl {
public: virtual STDMETHODIMP InsertFindBmk ( BOOL fFindOnly, HSLOT irowbuff, ULONG_PTR cbBmk, BYTE *pbBmk, ULONG_PTR *pirowbuffFound ) = 0;
//@cmember Delete a row with the given bookmark from
//the hashtable.
virtual STDMETHODIMP DeleteBmk ( HSLOT irowbuff ) = 0;
};
class CHashTbl:public IHashTbl { USHORT *m_rgwHash; //@cmember hash array
ULONG m_ulTableSize; //@cmember use this # of elements of the hash array
PLSTSLOT m_pLstSlot; // Pointer to the slot list
public: CHashTbl(); ~CHashTbl(void); //@cmember Initialize hashtable object.
BOOL FInit(PLSTSLOT pLstSlot);
//@cmember Find or if not found insert a row with the
//given bookmark into the hashtable.
STDMETHODIMP InsertFindBmk ( BOOL fFindOnly, HSLOT irowbuff, ULONG_PTR cbBmk, BYTE *pbBmk, ULONG_PTR *pirowbuffFound ); //@cmember Delete a row with the given bookmark from
//the hashtable.
STDMETHODIMP DeleteBmk ( HSLOT iSlot );
STDMETHODIMP CHashTbl::HashBmk ( DBBKMARK cbBmk, const BYTE * pbBmk, DBHASHVALUE* pdwHashedValue );
};
#endif
|