|
|
///////////////////////////////////////////////////////////////////////////////////
//
// 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
|