158 lines
4 KiB
C++
158 lines
4 KiB
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1995.
|
|
//
|
|
// File: CRSEmbed.hxx
|
|
//
|
|
// Contents: IUnknown embedder for temptable.
|
|
//
|
|
// Functions:
|
|
//
|
|
// Notes:
|
|
//
|
|
//
|
|
// History: 08/30/96 | RenatoB | Created
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifndef _CREMBED_H_
|
|
#define _CREMBED_H_
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// @class CRowsetInfo | ADSI embedding of Rowset,
|
|
// to give our IrowsetInfo interface
|
|
//
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
class CRowProvider;
|
|
class CRowsetInfo;
|
|
class CCommandObject;
|
|
class CSessionObject;
|
|
|
|
class CRowsetInfo : INHERIT_TRACKING,
|
|
public IRowsetInfo
|
|
{
|
|
friend HRESULT CreateTempTable(
|
|
IRowProvider*,
|
|
IUnknown*, IUnknown* ,
|
|
CSessionObject* ,
|
|
CCommandObject* ,
|
|
ULONG,DBPROPSET[],
|
|
ULONG,
|
|
HACCESSOR[],
|
|
REFIID,
|
|
IUnknown**
|
|
);
|
|
|
|
public:
|
|
|
|
DECLARE_STD_REFCOUNTING
|
|
|
|
DECLARE_IRowsetInfo_METHODS
|
|
|
|
STDMETHODIMP QueryInterface(REFIID, LPVOID *);
|
|
|
|
CRowsetInfo(
|
|
IUnknown *pUnkOuter,
|
|
IUnknown *pParentObject,
|
|
CSessionObject *pCSession,
|
|
CCommandObject *pCCommand
|
|
);
|
|
|
|
~CRowsetInfo();
|
|
|
|
STDMETHODIMP FInit(
|
|
IUnknown *pRowset //@parm IN| TmpTable interface
|
|
);
|
|
|
|
private:
|
|
|
|
|
|
STDMETHODIMP InitProperties(void);
|
|
|
|
// Frees the memory of an array of PropertySets
|
|
STDMETHODIMP_(void)
|
|
FreePropertySets(
|
|
ULONG cPropertySets, // Count of property sets
|
|
DBPROPSET *rgPropertySets // Array of property sets to be freed
|
|
);
|
|
|
|
STDMETHODIMP_(LONG )SearchGuid(
|
|
GUID riid // GUID of the DBPROPSET
|
|
);
|
|
STDMETHODIMP_(LONG )SearchPropid(
|
|
ULONG ibPropertySet,
|
|
DWORD dwPropertyID
|
|
);
|
|
|
|
IUnknown *_pUnkOuter;
|
|
IUnknown *_pRowset;
|
|
IUnknown *_pParentObject;
|
|
CSessionObject *_pCSession;
|
|
CCommandObject *_pCCommand;
|
|
CRITICAL_SECTION _csRowsetInfo;
|
|
|
|
IMalloc* _pMalloc;
|
|
ULONG _cPropertySets;
|
|
DBPROPSET *_pPropertySets;
|
|
|
|
// Status word.
|
|
enum Status {
|
|
STAT_UNINIT = 0x0000, //GetProperties Not initialized
|
|
STAT_DIDINIT = 0x0001, //Get Properties initialized successfully
|
|
STAT_INITERROR = 0x0002, //Get Properties Failed initialization
|
|
};
|
|
DWORD _dwStatus;
|
|
|
|
};
|
|
|
|
class CAutoBlock {
|
|
friend class CRowsetInfo;
|
|
friend class CRowsetInfo;
|
|
friend class CImpIAccessor;
|
|
private:
|
|
CAutoBlock( CRITICAL_SECTION *pCrit );
|
|
~CAutoBlock();
|
|
void UnBlock();
|
|
CRITICAL_SECTION *_pCrit;
|
|
};
|
|
|
|
inline CAutoBlock::CAutoBlock(
|
|
CRITICAL_SECTION *pCrit ) //@parm IN | The critical section.
|
|
{
|
|
// It is OK to pass a NULL ptr to this routine. It is a NOOP.
|
|
// Note that passing NULL to EnterCriticalSection blows up.
|
|
|
|
if (pCrit)
|
|
::EnterCriticalSection( pCrit );
|
|
_pCrit = pCrit;
|
|
};
|
|
|
|
|
|
inline CAutoBlock::~CAutoBlock()
|
|
{
|
|
if (_pCrit)
|
|
::LeaveCriticalSection( _pCrit );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// @mfunc
|
|
// Ends blocking explicitly. Thereafter, the destructor does nothing.
|
|
//-----------------------------------------------------------------------------------
|
|
|
|
inline void CAutoBlock::UnBlock()
|
|
{
|
|
// Clear the critical-section member,
|
|
// so that the destructor doesn't do anything.
|
|
|
|
if (_pCrit)
|
|
::LeaveCriticalSection( _pCrit );
|
|
_pCrit = NULL;
|
|
}
|
|
|
|
|
|
#endif //_CRSEMBED_H_
|