418 lines
12 KiB
C++
418 lines
12 KiB
C++
///////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft WMIOLE DB Provider
|
|
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
// @module ROW.H | CRow base object and contained interface
|
|
//
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _ROW_H_
|
|
#define _ROW_H_
|
|
|
|
|
|
|
|
typedef enum tagROWCREATEBINDFLAG
|
|
{
|
|
ROWOPEN =0,ROWCREATE =1 , ROWOVERWRITE = 1
|
|
|
|
}ROWCREATEBINDFLAG;
|
|
|
|
typedef enum tagROWTYPE
|
|
{
|
|
ROW_SCOPE =0,ROW_INSTANCE =1
|
|
|
|
}ROWTYPE;
|
|
|
|
|
|
#include "baserowobj.h"
|
|
class CImpIRowChange;
|
|
class CImpIColumnsInfo;
|
|
class CImpIGetSession;
|
|
class CImpIRow;
|
|
class CImpIScopedOperations;
|
|
|
|
//class CRowFetchObj;
|
|
|
|
|
|
typedef CImpIRowChange* PIMPIROWCHANGE;
|
|
typedef CImpIRow* PIMPIROW;
|
|
typedef CImpIGetSession* PIMPIGETSESSION;
|
|
typedef CImpIScopedOperations* PIMPISCOPEDOPERATIONS;
|
|
|
|
typedef CRowFetchObj* PROWFETCHOBJ;
|
|
|
|
|
|
class CRow : public CBaseRowObj
|
|
{
|
|
friend class CImpIRowChange;
|
|
friend class CImpIRow;
|
|
friend class CImpIGetSession;
|
|
friend class CImpIScopedOperations;
|
|
|
|
friend class CRowFetchObj;
|
|
friend class CDBSession;
|
|
|
|
PIMPIROW m_pIRow; // Contained IRow
|
|
PIMPIGETSESSION m_pIGetSession; // Contained IGetSession
|
|
PIMPIROWCHANGE m_pIRowChange; // Contained IRowChange;
|
|
PIMPISCOPEDOPERATIONS m_pIScopedOperations; // Contained IScopedOperations
|
|
|
|
|
|
UDWORD m_dwStatus; // status word for the entire cursor
|
|
cRowColumnInfoMemMgr * m_pRowColumns; // column information for all the columns other than
|
|
// than the source rowset
|
|
|
|
WCHAR * m_strURL; // URL of the row
|
|
WCHAR * m_strKey; // Key of the row
|
|
CWbemClassInstanceWrapper * m_pInstance; // Pointer to the instance corresponding to the row
|
|
|
|
|
|
BOOL m_bHelperFunctionCreated; // flag to indicate whethe helper function are created or not
|
|
BOOL m_bClassChanged; // flag which stores if the instance being represented, is
|
|
// is of different type ( belong to different class) as
|
|
// compared to the rowset which created it. This will
|
|
// have meaning only when row is created from rowset
|
|
|
|
CRowset * m_pSourcesRowset; // Pointer to the rowset , if it this row is created by the row
|
|
ROWTYPE m_rowType; // type of the object which the row represents
|
|
|
|
void InitVars();
|
|
HRESULT GetColumns(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[ ]);
|
|
HRESULT GetColumnsFromRowset(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[]);
|
|
HRESULT UpdateRow(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[ ]);
|
|
HRESULT UpdateColumnsFromRowset(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[ ]);
|
|
|
|
HRESULT GetColumnInfo(DBORDINAL* pcColumns, DBCOLUMNINFO** prgInfo,WCHAR** ppStringsBuffer);
|
|
HRESULT GetRowColumnInfo();
|
|
HRESULT GatherColumnInfo();
|
|
HRESULT GetColumnInfo();
|
|
HRESULT GetColumnData(DBCOLUMNACCESS &col);
|
|
HRESULT SetColumnData(DBCOLUMNACCESS &col , BOOL bNewRow = FALSE);
|
|
|
|
|
|
HRESULT GetRowData(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[]);
|
|
HRESULT SetRowData(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[]);
|
|
|
|
HRESULT OpenChild(IUnknown *pUnkOuter,WCHAR *strColName ,REFIID riid, IUnknown **ppUnk,BOOL bIsChildRowset);
|
|
WCHAR * GetPropertyNameFromColName(WCHAR *pColName);
|
|
HRESULT GetEmbededInstancePtrAndSetMapClass(CURLParser *urlParser);
|
|
|
|
HRESULT GetChildRowet( IUnknown *pUnkOuter,
|
|
WCHAR *strColName,
|
|
DBPROPSET *rgPropertySets,
|
|
ULONG cPropSets,
|
|
REFIID riid,
|
|
IUnknown **ppUnk);
|
|
|
|
HRESULT GetChildRow(IUnknown *pUnkOuter,
|
|
WCHAR *strColName,
|
|
DBPROPSET *rgPropertySets,
|
|
ULONG cPropSets,
|
|
REFIID riid,
|
|
IUnknown **ppUnk);
|
|
|
|
HRESULT CreateNewRow(CWbemClassInstanceWrapper **pNewInst);
|
|
HRESULT AllocateInterfacePointers();
|
|
HRESULT InitializeWmiOledbMap(LPWSTR strPath,
|
|
LPWSTR strTableID ,
|
|
DWORD dwFlags);
|
|
HRESULT AddInterfacesForISupportErrorInfo();
|
|
|
|
HRESULT OpenRow(LPCOLESTR pwszURL,IUnknown * pUnkOuter,REFIID riid,IUnknown** ppOut);
|
|
HRESULT OpenRowset(LPCOLESTR pwszURL,
|
|
IUnknown * pUnkOuter,
|
|
REFIID riid,
|
|
BOOL bContainer ,
|
|
IUnknown** ppOut,
|
|
ULONG cPropertySets = 0,
|
|
DBPROPSET __RPC_FAR rgPropertySets[] = NULL);
|
|
|
|
|
|
HRESULT SetRowProperties(const ULONG cPropertySets, const DBPROPSET rgPropertySets[] );
|
|
HRESULT Delete(LPCOLESTR lpszURL,DWORD dwDeleteFlags,DBSTATUS &dbStatus);
|
|
HRESULT MoveObjects(WCHAR * pStrDstURL,WCHAR * pstrSrcURL, WCHAR *& pstrUrl,DBSTATUS &dbStatus);
|
|
HRESULT CopyObjects(WCHAR * pStrDstURL,WCHAR * pstrSrcURL, WCHAR *& pNewURL,DBSTATUS &dbStatus);
|
|
BOOL GetPathFromURL(BSTR &str);
|
|
BOOL IsContainer();
|
|
HRESULT GetIUnknownColumnValue(DBORDINAL iCol,REFIID riid,IUnknown ** ppUnk,LPCWSTR pStrColName);
|
|
|
|
|
|
public:
|
|
|
|
CRow(LPUNKNOWN,CRowset *pRowset,PCDBSESSION pObj,CWbemConnectionWrapper *pCon = NULL);
|
|
CRow(LPUNKNOWN pUnkOuter, PCDBSESSION pObj);
|
|
~CRow();
|
|
|
|
HRESULT InitRow(HROW hRow = 0,
|
|
CWbemClassWrapper *pInst = NULL,
|
|
ROWCREATEBINDFLAG rowCreateFlag = ROWOPEN);
|
|
|
|
HRESULT InitRow(LPWSTR strPath ,
|
|
LPWSTR strTableID ,
|
|
DWORD dwFlags = -1,
|
|
ROWCREATEBINDFLAG rowCreateFlag = ROWOPEN);
|
|
|
|
HRESULT UpdateKeysForNewInstance();
|
|
|
|
STDMETHODIMP QueryInterface(REFIID, LPVOID *);
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
|
|
};
|
|
|
|
|
|
|
|
class CImpIGetSession:public IGetSession
|
|
{
|
|
private:
|
|
CRow *m_pObj;
|
|
DEBUGCODE(ULONG m_cRef);
|
|
|
|
public:
|
|
CImpIGetSession( CRow *pObj )
|
|
{
|
|
DEBUGCODE(m_cRef = 0L);
|
|
m_pObj = pObj;
|
|
}
|
|
~CImpIGetSession()
|
|
{
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) AddRef(void)
|
|
{
|
|
DEBUGCODE(InterlockedIncrement((long*)&m_cRef));
|
|
return m_pObj->GetOuterUnknown()->AddRef();
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) Release(void)
|
|
{
|
|
DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef);
|
|
if( lRef < 0 ){
|
|
ASSERT("Reference count on Object went below 0!")
|
|
})
|
|
|
|
return m_pObj->GetOuterUnknown()->Release();
|
|
}
|
|
|
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv)
|
|
{
|
|
return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv);
|
|
}
|
|
|
|
STDMETHODIMP GetSession(REFIID riid,IUnknown ** ppSession);
|
|
|
|
|
|
};
|
|
|
|
|
|
class CImpIRow:public IRow
|
|
{
|
|
private:
|
|
CRow *m_pObj;
|
|
DEBUGCODE(ULONG m_cRef);
|
|
|
|
|
|
public:
|
|
CImpIRow( CRow *pObj )
|
|
{
|
|
DEBUGCODE(m_cRef = 0L);
|
|
m_pObj = pObj;
|
|
}
|
|
~CImpIRow()
|
|
{
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) AddRef(void)
|
|
{
|
|
DEBUGCODE(InterlockedIncrement((long*)&m_cRef));
|
|
return m_pObj->GetOuterUnknown()->AddRef();
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) Release(void)
|
|
{
|
|
DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef);
|
|
if( lRef < 0 ){
|
|
ASSERT("Reference count on Object went below 0!")
|
|
})
|
|
|
|
return m_pObj->GetOuterUnknown()->Release();
|
|
}
|
|
|
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv)
|
|
{
|
|
return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv);
|
|
}
|
|
|
|
STDMETHODIMP GetColumns(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[ ]);
|
|
|
|
STDMETHODIMP GetSourceRowset(REFIID riid,IUnknown ** ppRowset,HROW *phRow);
|
|
STDMETHODIMP Open( IUnknown * pUnkOuter,
|
|
DBID * pColumnID,
|
|
REFGUID rguidColumnType,
|
|
DWORD dwFlags,
|
|
REFIID riid,
|
|
IUnknown ** ppUnk);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
class CImpIRowChange:public IRowChange
|
|
{
|
|
private:
|
|
CRow *m_pObj;
|
|
DEBUGCODE(ULONG m_cRef);
|
|
|
|
public:
|
|
CImpIRowChange( CRow *pObj )
|
|
{
|
|
DEBUGCODE(m_cRef = 0L);
|
|
m_pObj = pObj;
|
|
}
|
|
~CImpIRowChange()
|
|
{
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) AddRef(void)
|
|
{
|
|
DEBUGCODE(InterlockedIncrement((long*)&m_cRef));
|
|
return m_pObj->GetOuterUnknown()->AddRef();
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) Release(void)
|
|
{
|
|
DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef);
|
|
if( lRef < 0 ){
|
|
ASSERT("Reference count on Object went below 0!")
|
|
})
|
|
|
|
return m_pObj->GetOuterUnknown()->Release();
|
|
}
|
|
|
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv)
|
|
{
|
|
return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv);
|
|
}
|
|
|
|
STDMETHODIMP SetColumns(DBORDINAL cColumns,DBCOLUMNACCESS rgColumns[ ]);
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
class CImpIScopedOperations:public IScopedOperations
|
|
{
|
|
private:
|
|
CRow *m_pObj;
|
|
DEBUGCODE(ULONG m_cRef);
|
|
|
|
BOOL CheckBindURLFlags(DBBINDURLFLAG dwBindURLFlags , REFGUID rguid); // Function to check if proper flags are
|
|
// are set for the require object
|
|
// To check if URL Matches the requested type of object
|
|
HRESULT CheckIfProperURL(LPOLESTR & lpszURL,REFGUID rguid);
|
|
|
|
HRESULT BindURL(IUnknown * pUnkOuter,
|
|
LPCOLESTR pwszURL,
|
|
DBBINDURLFLAG dwBindURLFlags,
|
|
REFGUID rguid,
|
|
REFIID riid,
|
|
DBIMPLICITSESSION * pImplSession,
|
|
DBBINDURLSTATUS * pdwBindStatus,
|
|
IUnknown ** ppUnk);
|
|
|
|
// Copy or move objects from one scope/container to another
|
|
HRESULT ManipulateObjects(DBCOUNTITEM cRows,
|
|
LPCOLESTR __RPC_FAR rgpwszSourceURLs[ ],
|
|
LPCOLESTR __RPC_FAR rgpwszDestURLs[ ],
|
|
DBSTATUS __RPC_FAR rgdwStatus[ ],
|
|
LPOLESTR __RPC_FAR rgpwszNewURLs[ ],
|
|
OLECHAR __RPC_FAR *__RPC_FAR *ppStringsBuffer,
|
|
BOOL bMoveObjects);
|
|
|
|
|
|
public:
|
|
CImpIScopedOperations( CRow *pObj )
|
|
{
|
|
DEBUGCODE(m_cRef = 0L);
|
|
m_pObj = pObj;
|
|
}
|
|
~CImpIScopedOperations()
|
|
{
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) AddRef(void)
|
|
{
|
|
DEBUGCODE(InterlockedIncrement((long*)&m_cRef));
|
|
return m_pObj->GetOuterUnknown()->AddRef();
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) Release(void)
|
|
{
|
|
DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef);
|
|
if( lRef < 0 ){
|
|
ASSERT("Reference count on Object went below 0!")
|
|
})
|
|
|
|
return m_pObj->GetOuterUnknown()->Release();
|
|
}
|
|
|
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv)
|
|
{
|
|
return m_pObj->GetOuterUnknown()->QueryInterface(riid, ppv);
|
|
}
|
|
|
|
|
|
STDMETHODIMP Bind(IUnknown * pUnkOuter,
|
|
LPCOLESTR pwszURL,
|
|
DBBINDURLFLAG dwBindURLFlags,
|
|
REFGUID rguid,
|
|
REFIID riid,
|
|
IAuthenticate * pAuthenticate,
|
|
DBIMPLICITSESSION * pImplSession,
|
|
DBBINDURLSTATUS * pdwBindStatus,
|
|
IUnknown ** ppUnk);
|
|
|
|
|
|
|
|
|
|
|
|
STDMETHODIMP Copy(DBCOUNTITEM cRows,
|
|
LPCOLESTR __RPC_FAR rgpwszSourceURLs[ ],
|
|
LPCOLESTR __RPC_FAR rgpwszDestURLs[ ],
|
|
DWORD dwCopyFlags,
|
|
IAuthenticate __RPC_FAR *pAuthenticate,
|
|
DBSTATUS __RPC_FAR rgdwStatus[ ],
|
|
LPOLESTR __RPC_FAR rgpwszNewURLs[ ],
|
|
OLECHAR __RPC_FAR *__RPC_FAR *ppStringsBuffer);
|
|
|
|
STDMETHODIMP Move(DBCOUNTITEM cRows,
|
|
LPCOLESTR __RPC_FAR rgpwszSourceURLs[ ],
|
|
LPCOLESTR __RPC_FAR rgpwszDestURLs[ ],
|
|
DWORD dwMoveFlags,
|
|
IAuthenticate __RPC_FAR *pAuthenticate,
|
|
DBSTATUS __RPC_FAR rgdwStatus[ ],
|
|
LPOLESTR __RPC_FAR rgpwszNewURLs[ ],
|
|
OLECHAR __RPC_FAR *__RPC_FAR *ppStringsBuffer);
|
|
|
|
STDMETHODIMP Delete(DBCOUNTITEM cRows,
|
|
LPCOLESTR __RPC_FAR rgpwszURLs[ ],
|
|
DWORD dwDeleteFlags,
|
|
DBSTATUS __RPC_FAR rgdwStatus[ ]);
|
|
|
|
STDMETHODIMP OpenRowset(IUnknown __RPC_FAR *pUnkOuter,
|
|
DBID __RPC_FAR *pTableID,
|
|
DBID __RPC_FAR *pIndexID,
|
|
REFIID riid,
|
|
ULONG cPropertySets,
|
|
DBPROPSET __RPC_FAR rgPropertySets[ ],
|
|
IUnknown __RPC_FAR *__RPC_FAR *ppRowset);
|
|
};
|
|
|
|
|
|
|
|
#endif
|