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

378 lines
13 KiB
C++

///////////////////////////////////////////////////////////////////////////////////
//
// Microsoft WMIOLE DB Provider
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
// @module baseRowobj.h Header file of abstract base class of CRow and CRowset
//
//
///////////////////////////////////////////////////////////////////////////////////
#ifndef _ROWSETBASE_H_
#define _ROWSETBASE_H_
#include "headers.h"
#include "bitarray.h"
#include "extbuff.h"
#include "hashtbl.h"
#define NUMBER_OF_COLUMNS_IN_QUALIFERROWSET 4
#define COLNAMESIZE 255
#define QUALIFERNAMECOL 0
#define ONE_ROW 1
#define QUALIFIERNAMECOL 1
#define QUALIFIERTYPECOL 2
#define QUALIFIERVALCOL 3
#define QUALIFIERFLAVOR 4
class CImpIRowsetLocate;
class CImpIRowsetChange;
class CImpIColumnsInfo;
class CImpIAccessor;
class CImpIRowsetInfo;
class CImpIRowsetIdentity;
class CImpIConvertType;
class CImpIChapteredRowset;
class CRowFetchObj;
class CInstanceRowFetchObj;
class CQualifierRowFetchObj;
class CRowset;
class CChapterMgr;
class CInstance;
class CWMIInstanceMgr;
typedef CImpIRowsetLocate* PIMPIROWSET;
typedef CImpIRowsetLocate* PIMPIROWSETLOCATE;
typedef CImpIRowsetChange* PIMPIROWSETCHANGE;
typedef CImpIColumnsInfo* PIMPICOLUMNSINFO;
typedef CImpIAccessor * PIMPIACCESSOR;
typedef CImpIRowsetIdentity*PIMPIROWSETIDENTITY;
typedef CImpIRowsetInfo* PIMPIROWSETINFO;
typedef CImpIConvertType* PIMPICONVERTTYPE;
typedef CImpIChapteredRowset* PICHAPTEREDROWSET;
typedef CRowFetchObj* PROWFETCHOBJ;
//=====================================================
// Struct to hold column information for Rowsets/row
// showing qualifiers
//=====================================================
struct _qualifierColInfo
{
PWSTR pwszName;
DBTYPE wType;
DBLENGTH ulSize;
DBSTATUS dwStatus;
};
typedef _qualifierColInfo QUALIFIERCOLINFO;
/////////////////////////////////////////////////////////////////////////////////////////////////////
// Class to manage Row Data
/////////////////////////////////////////////////////////////////////////////////////////////////////
class CRowDataMemMgr
{
public:
CRowDataMemMgr();
~CRowDataMemMgr();
HRESULT SetColumnBind( DBORDINAL dwCol, PCOLUMNDATA pColumn );
HRESULT ReAllocRowData();
HRESULT AllocRowData(ULONG_PTR);
HRESULT ResetColumns();
HRESULT CommitColumnToRowData(CVARIANT & vVar,DBTYPE lType);
HRESULT CommitColumnToRowData(CVARIANT & vVar, DBORDINAL nIndex,DBTYPE lType);
void ReleaseRowData();
void ReleaseBookMarkColumn();
private:
PCOLUMNDATA *m_prgpColumnData;
DBCOUNTITEM m_cbTotalCols;
DBORDINAL m_nCurrentIndex;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////
// Class to manage column information
/////////////////////////////////////////////////////////////////////////////////////////////////////
class cRowColumnInfoMemMgr
{
public:
cRowColumnInfoMemMgr(cRowColumnInfoMemMgr *pSrcRsColInfo = NULL);
~cRowColumnInfoMemMgr();
DBTYPE ColumnType(DBORDINAL icol);
WCHAR * ColumnName(DBORDINAL icol);
DBCOLUMNFLAGS ColumnFlags(DBORDINAL icol);
DBORDINAL GetColOrdinal(WCHAR *pColName);
LONG GetCIMType(DBORDINAL icol);
ULONG_PTR SetRowSize();
DBBYTEOFFSET GetDataOffset(DBORDINAL icol);
WCHAR * ColumnNameListStartingPoint();
DBORDINAL GetCurrentIndex();
HRESULT CopyColumnInfoList(DBCOLUMNINFO *& pNew,BOOL bBookMark = TRUE);
HRESULT CopyColumnNamesList(WCHAR *& pNew);
DBCOLUMNINFO ** CurrentColInfo();
DBCOLUMNINFO * GetColInfo(DBORDINAL icol);
WCHAR * ColumnNameListStartingPointOfSrcRs();
DBLENGTH GetCountOfBytesCopiedForSrcRs();
HRESULT AddColumnNameToList(WCHAR * pColumnName, DBCOLUMNINFO ** pCol);
// NTRaid:111762
// 06/13/00
HRESULT CommitColumnInfo();
HRESULT ResetColumns();
HRESULT ReAllocColumnInfoList();
HRESULT AllocColumnInfoList(DBCOUNTITEM cCols);
HRESULT AllocColumnNameList(DBCOUNTITEM nCols);
HRESULT FreeUnusedMemory();
HRESULT FreeColumnNameList();
HRESULT FreeColumnInfoList();
HRESULT InitializeBookMarkColumn();
DBCOUNTITEM GetTotalNumberOfColumns(); // This includes all the columns including the sources rowsets
DBCOUNTITEM GetNumberOfColumnsInSourceRowset();
void SetCIMType(ULONG dwCIMType,DBORDINAL lIndex = -1); // IF index is -1 then set the CIMTYPE of the current col
protected:
WCHAR * m_pbColumnNames; //Pointer to Info Array Heap (heap of column name strings)
WCHAR * m_lpCurrentName; //Pointer to Info Array Heap (heap of column name strings)
DBCOUNTITEM m_cbFreeColumnNameBytes; // how many bytes of the column names heap is in use
DBCOUNTITEM m_cbColumnInfoBytesUsed; // count of bytes used for column information
DBCOLUMNINFO* m_DBColInfoList; // ColumnInfo array
DBBYTEOFFSET* m_rgdwDataOffsets; // column offsets in buffer
DBORDINAL m_cbCurrentIndex; // The current index of column information
DBCOUNTITEM m_cbTotalCols; // number of columns
DBCOLUMNINFO * m_pCurrentColInfo; // Pointer to the current column information
DBBYTEOFFSET m_dwOffset;
cRowColumnInfoMemMgr * m_pSrcRsColInfo; // pointer to the the rowset that created this
// Mainly used with row objects. If there are any
// new rows apart from the source rowset
DBORDINAL m_nFirstIndex; // Index of the first column if there is any source
// rowset for the row
ULONG * m_rgCIMType; // array to store the base CIMTYP of the property
};
/////////////////////////////////////////////////////////////////////////////////////////////////////
// Abstract Base class for CRow and CRowset class
/////////////////////////////////////////////////////////////////////////////////////////////////////
class CBaseRowObj:public CBaseObj
{
friend class CImpIColumnsInfo;
friend class CImpIConvertType;
friend class CRowFetchObj;
friend class CInstanceRowFetchObj;
friend class CQualifierRowFetchObj;
friend class CRowset;
protected:
CWmiOleDBMap * m_pMap; // CWmiOleDBMap class pointer to interact with WMI
cRowColumnInfoMemMgr m_Columns; // Column information class
CRowDataMemMgr * m_pRowData; // pointer to Row data manager to manage row data
CChapterMgr * m_pChapterMgr; // chapter manager of the rowset to manage chapters
DBCOUNTITEM m_cTotalCols; // Total number of columns
DBCOUNTITEM m_cCols; // Count of Parent Columns in Result Set
DBCOUNTITEM m_cNestedCols; // Number of child rowsets ( chaptered columns)
BYTE * m_rgbRowData; // Pointer to row data of the current row that rowset/row is dealing
PCUTILPROP m_pUtilProp; // Utility object to manage properties
PIMPICOLUMNSINFO m_pIColumnsInfo; // Contained IColumnsInfo
PIMPICONVERTTYPE m_pIConvertType; // Contained IConvertType
PLSTSLOT m_pIBuffer; // internal buffer structure
PIMPISUPPORTERRORINFO m_pISupportErrorInfo; // contained ISupportErrorInfo
DBLENGTH m_cbRowSize; // size of row data in the buffer
unsigned int m_uRsType; // Type of the rowset/row
ULONG m_ulProps; // member variable storing value of some commonly used rowset properties
HROW m_hRow; // member variable that stores the last HROW given out
//Back pointer to a creator object. Used in IRowssetInfo::GetSpecification
PCDBSESSION m_pCreator;
CWbemConnectionWrapper* m_pCon; // This used for remote/cross namespace objects to
// to store their IWbemServicesPointer
BOOL m_bNewConAllocated; // variable which indicates whether m_pCon was allocated or not
BOOL m_IsZoombie; // flag which indicates whether the object is in Zoombie state
HRESULT GatherColumnInfo(void); //Builds DBCOLINFO structures
HROW GetNextHRow() { return ++ m_hRow; };
HRESULT GetRowsetProperty(DBPROPID propId , VARIANT & varValue);
void GetCommonRowsetProperties();
HRESULT GetColumnInfo();
DBORDINAL GetOrdinalFromColName(WCHAR *pColName);
HRESULT SetRowsetProperty(DBPROPID propId , VARIANT varValue);
HRESULT RefreshInstance(CWbemClassWrapper *pInstance);
HRESULT SynchronizeDataSourceMode();
HRESULT GatherColumnInfoForQualifierRowset();
ULONG GetQualifierFlags();
DBLENGTH GetRowSize() { return m_cbRowSize;}
HRESULT SetProperties(const ULONG cPropertySets, const DBPROPSET rgPropertySets[] );
HRESULT SetSearchPreferences();
BOOL IsZoombie() { return m_IsZoombie; }
INSTANCELISTTYPE GetObjectTypeProp(const ULONG cPropertySets, const DBPROPSET rgPropertySets[]);
HRESULT InitializePropertiesForSchemaRowset();
HRESULT InitializePropertiesForCommandRowset();
HRESULT InitializePropertiesForMethodRowset();
// This function is to be overridden by derived classes
virtual HRESULT GetColumnInfo(DBORDINAL* pcColumns, DBCOLUMNINFO** prgInfo,WCHAR** ppStringsBuffer) = 0;
virtual HRESULT AddInterfacesForISupportErrorInfo() = 0;
public:
CBaseRowObj(LPUNKNOWN pUnkOuter);
~CBaseRowObj();
// IUnknown methods
STDMETHODIMP QueryInterface(REFIID, LPVOID *) = 0;
STDMETHODIMP_(ULONG) AddRef(void) = 0;
STDMETHODIMP_(ULONG) Release(void) = 0;
void SetStatusToZoombie() { m_IsZoombie = TRUE; }
};
/////////////////////////////////////////////////////////////////////////////////////////////////////
// A linked list class to store list of HROWS for a particular chapter
/////////////////////////////////////////////////////////////////////////////////////////////////////
class CHRowsForChapter
{
friend class CChapter;
friend class CChapterMgr;
HROW m_hRow;
CHRowsForChapter * m_pNext;
HSLOT m_hSlot;
CWbemClassWrapper * m_pInstance;
BSTR m_strKey;
DBSTATUS m_dwStatus;
CHRowsForChapter()
{
m_hRow = 0;
m_pNext = NULL;
m_hSlot = -1;
m_pInstance = NULL;
m_strKey = NULL;
m_dwStatus = DBROWSTATUS_S_OK;
}
~CHRowsForChapter()
{
if(m_strKey != NULL)
{
SysFreeString(m_strKey);
}
}
void SetRowStatus(DWORD dwStatus) { m_dwStatus = dwStatus ; };
DBSTATUS GetRowStatus() { return m_dwStatus; };
};
/////////////////////////////////////////////////////////////////////////////////////////////////////
// class to maintain HCHAPTER to Rowset mapping
/////////////////////////////////////////////////////////////////////////////////////////////////////
class CChapter
{
friend class CChapterMgr;
CChapter();
~CChapter();
HRESULT AddHRow(HROW hRow = 0, CWbemClassWrapper *pInstance = NULL, HSLOT hSlot = -1);
HRESULT DeleteHRow(HROW hRow);
HRESULT IsHRowOfThisChapter(HROW hRow);
HRESULT GetAllHRowsInList(HROW *pHRows);
HRESULT SetSlot(HROW hRow , HSLOT hSolt);
HSLOT GetSlot(HROW hRow);
HRESULT SetInstance(HROW hRow ,BSTR strInstKey , CWbemClassWrapper *pInstance); // This method is for chapter representing child rows of type Embeded classes
HRESULT GetInstanceKey(HROW hRow , BSTR *pstrKey);
void SetRowStatus(HROW hRow, DBSTATUS dwStatus);
DBSTATUS GetRowStatus(HROW hRow);
HROW GetHRow(BSTR strInstKey);
CWbemClassWrapper * GetInstance(HROW hRow); // This method is for chapter representing child rows of type Embeded classes
private:
CHRowsForChapter * m_pFirstRow;
HCHAPTER m_hChapter;
ULONG m_cRefChapter;
CWbemClassWrapper * m_pInstance;
BSTR m_strKey;
CChapter * m_pNext;
ULONG_PTR m_lCount; // count of HROWS in the list
DBSTATUS m_dwStatus;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////
// class to maintain Chapters for a rowset
/////////////////////////////////////////////////////////////////////////////////////////////////////
class CChapterMgr
{
CChapter * m_pHead;
ULONG_PTR m_lCount; // count of Chapters in the list
public:
CChapterMgr();
~CChapterMgr();
HRESULT AddChapter(HCHAPTER hChapter);
HRESULT DeleteChapter(HCHAPTER hChapter);
void SetInstance(HCHAPTER hChapter , CWbemClassWrapper *pInstance,BSTR strKey,HROW hRow = 0);
CWbemClassWrapper * GetInstance(HCHAPTER hChapter , HROW hRow = 0);
HRESULT GetInstanceKey(HCHAPTER hChapter, BSTR *pstrKey , HROW hRow = 0);
HRESULT AddHRowForChapter(HCHAPTER hChapter , HROW hRow, CWbemClassWrapper *pInstance = NULL, HSLOT hSlot = -1);
HRESULT SetSlot(HROW hRow , HSLOT hSlot);
HRESULT DeleteHRow(HROW hRow);
HCHAPTER GetChapterForHRow(HROW hRow);
HSLOT GetSlot(HROW hRow);
BOOL IsRowExists(HROW hRow);
BOOL IsExists(HCHAPTER hChapter);
BOOL IsInstanceExist(BSTR strKey);
BOOL IsInstanceExist(CWbemClassWrapper *pInstance);
ULONG AddRefChapter(HCHAPTER hChapter);
ULONG ReleaseRefChapter(HCHAPTER hChapter);
HRESULT GetAllHROWs(HROW *&prghRows , DBCOUNTITEM &cRows);
HRESULT IsRowExistsForChapter(HCHAPTER hChapter);
void SetRowStatus(HROW hRow , DWORD dwStatus);
DBSTATUS GetRowStatus(HROW hRow);
void SetChapterStatus(HCHAPTER hChapter , DBSTATUS dwStatus);
DBSTATUS GetChapterStatus(HCHAPTER hChapter);
HROW GetHRow(HCHAPTER hChapter ,BSTR strKey = Wmioledb_SysAllocString(NULL));
};
#endif