You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
4.2 KiB
137 lines
4.2 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997 - 1999.
|
|
//
|
|
// File: accbase.hxx
|
|
//
|
|
// Class: CAccessorBase
|
|
//
|
|
// Purpose: Base class for CAccessor and CDistributedAccessor. Handles
|
|
// accessor refcount, type, and tracks # of current rowsets
|
|
// have an inherited copy of the accessor.
|
|
//
|
|
// History: 22 Apr 1997 emilyb created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include <tbag.hxx>
|
|
|
|
class CAccessorBase
|
|
{
|
|
public:
|
|
enum EAccessorType {
|
|
eInvalidAccessor,
|
|
eRowDataAccessor,
|
|
eParamsDataAccessor,
|
|
};
|
|
|
|
CAccessorBase (void * pCreator, EAccessorType eType) :
|
|
_pCreator(pCreator), _hAccessorParent(0),
|
|
_type(eType), _cRef(1),
|
|
_cInheritors(0) {}
|
|
virtual ~CAccessorBase() {}
|
|
|
|
void * GetCreator() {return _pCreator;}
|
|
|
|
virtual ULONG AddRef()
|
|
{
|
|
return InterlockedIncrement( (LONG *) &_cRef );
|
|
}
|
|
virtual ULONG Release()
|
|
{
|
|
// CAccessorBag does the destroy
|
|
|
|
return InterlockedDecrement( (LONG *) &_cRef );
|
|
}
|
|
|
|
ULONG GetRefcount() { return _cRef; }
|
|
|
|
BOOL IsValidType() const { return _type == eRowDataAccessor ||
|
|
_type == eParamsDataAccessor; }
|
|
void SetInvalid( void ) { _type = eInvalidAccessor; };
|
|
EAccessorType GetAccessorType() const { return _type; }
|
|
BOOL IsRowDataAccessor() const { return eRowDataAccessor == _type; }
|
|
|
|
CAccessorBase * GetParent() {return _hAccessorParent;}
|
|
void SetParent(CAccessorBase * hParent) { _hAccessorParent = hParent;}
|
|
|
|
ULONG IncInheritors() { return ++_cInheritors; }
|
|
ULONG DecInheritors() { return --_cInheritors; }
|
|
ULONG GetInheritorCount() { return _cInheritors; }
|
|
|
|
virtual SCODE GetBindings( DBACCESSORFLAGS * pBindIo,
|
|
DBCOUNTITEM * pcBindings,
|
|
DBBINDING ** ppBindings) = 0 ;
|
|
|
|
protected:
|
|
ULONG _cRef;
|
|
|
|
private:
|
|
void *_pCreator; // this pointer of comamnd or rowset that
|
|
// called CreateAccessor to create this accessor
|
|
CAccessorBase * _hAccessorParent; // if this accessor was inherited from a command,
|
|
// then the HACCESSOR of the original accessor
|
|
|
|
ULONG _cInheritors; // count of current rowsets
|
|
// which inherited this accessor
|
|
EAccessorType _type;
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CAccessorBag
|
|
//
|
|
// Purpose: Holds a number of accessors
|
|
//
|
|
// History: 12 Jan 1995 dlee Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CAccessorBag : public TBag<CAccessorBase *>
|
|
{
|
|
public:
|
|
CAccessorBag(void * pOwner): _pOwner(pOwner) { }
|
|
|
|
CAccessorBase * Convert(HACCESSOR hAccessor)
|
|
{
|
|
Win4Assert( 0 == DB_INVALID_HACCESSOR );
|
|
|
|
if ( DB_INVALID_HACCESSOR == hAccessor )
|
|
THROW( CException( DB_E_BADACCESSORHANDLE) );
|
|
|
|
CAccessorBase * pAccBase = (CAccessorBase *) hAccessor;
|
|
|
|
if (_pOwner != pAccBase->GetCreator())
|
|
{ // see if we inherited
|
|
pAccBase = First();
|
|
while (pAccBase && (pAccBase->GetParent() != (CAccessorBase *)hAccessor ))
|
|
pAccBase = Next();
|
|
if (!pAccBase)
|
|
THROW( CException( DB_E_BADACCESSORHANDLE ) );
|
|
}
|
|
|
|
if( !pAccBase->IsValidType() || pAccBase->GetRefcount() <= 0 )
|
|
THROW( CException( DB_E_BADACCESSORHANDLE ) );
|
|
|
|
return pAccBase;
|
|
}
|
|
|
|
~CAccessorBag();
|
|
|
|
void AddRef( HACCESSOR hAccessor,
|
|
ULONG *pcRef );
|
|
|
|
void Release( HACCESSOR hAccessor,
|
|
ULONG *pcRef );
|
|
|
|
private:
|
|
void Destroy( CAccessorBase * pAccessor );
|
|
|
|
// This is the pointer of the rowset or command to which this bag belongs
|
|
|
|
void * _pOwner;
|
|
}; //CAccessorBag
|
|
|