166 lines
4.9 KiB
C
166 lines
4.9 KiB
C
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// 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
|
||
|
|
||
|
|
||
|
|