windows-nt/Source/XPSP1/NT/admin/wmi/wbem/adapters/oledb/hashtbl.h
2020-09-26 16:20:57 +08:00

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