windows-nt/Source/XPSP1/NT/published/sdk/inc/dao360/_dbdao.h
2020-09-26 16:20:57 +08:00

734 lines
21 KiB
C++

/************************************************************************
** _ D B D A O . H *
** *
*************************************************************************
** Copyright (C) 1996 by Microsoft Corporation *
** All Rights Reserved *
************************************************************************/
/*
_DBDAO.H
Internal definitions and prototypes for dbdao C++ classes
*/
#ifndef __DBDAO_H_
#define __DBDAO_H_
/*****************************************************************************
* Forwards
*/
class COleVariant;
class CdbBookmark;
class CdbException;
class CdbOleObject;
class CdbObject;
class CdbError;
class CdbProperty;
class CdbDBEngine;
class CdbWorkspace;
class CdbDatabase;
class CdbConnection;
class CdbRecordset;
class CdbGetRowsEx;
class CdbQueryDef;
class CdbTableDef;
class CdbField;
class CdbRelation;
class CdbIndex;
class CdbUser;
class CdbGroup;
class CdbDocument;
class CdbContainer;
class CdbParameter;
class CdbCollection;
class CdbErrors;
class CdbProperties;
class CdbWorkspaces;
class CdbDatabases;
class CdbConnections;
class CdbRecordsets;
class CdbQueryDefs;
class CdbTableDefs;
class CdbFields;
class CdbRelations;
class CdbIndexes;
class CdbUsers;
class CdbGroups;
class CdbDocuments;
class CdbContainers;
class CdbParameters;
class CdbBStr;
/*****************************************************************************
* DAO runtime key
*/
const char szKEY[] = "mbmabptebkjcdlgtjmskjwtsdhjbmkmwtrak";
/*****************************************************************************
* Miscellaneous defines
*/
#define DAO_MAXSEEKFIELDS 13
/*****************************************************************************
* CdbBSTR (OLE BSTR helper)
*/
class DLLEXPORT CdbBSTR
{
public:
CONSTRUCTOR CdbBSTR (BSTR=NULL);
DESTRUCTOR ~CdbBSTR (VOID);
operator BSTR * (VOID);
operator LPCTSTR (VOID);
private:
BSTR m_bstr;
};
/*****************************************************************************
* CdbVariant (OLE Variant helper)
*/
class CdbVariant : public COleVariant
{
public:
CONSTRUCTOR CdbVariant (LONG l);
CONSTRUCTOR CdbVariant (VOID);
CONSTRUCTOR CdbVariant (LPCTSTR pstr);
CONSTRUCTOR CdbVariant (SHORT s, BOOL bIsBool = FALSE);
CONSTRUCTOR CdbVariant (LPVARIANT pv);
CONSTRUCTOR CdbVariant (LPSAFEARRAY psa);
VOID operator = (LPVARIANT pv);
VOID operator = (LPCTSTR pstr);
VOID operator = (SHORT s);
VOID operator = (const int i);
VOID operator = (LONG l);
};
inline CONSTRUCTOR CdbVariant::CdbVariant(
VOID) : COleVariant()
{
vt = VT_ERROR;
scode = DISP_E_PARAMNOTFOUND;
}
inline CdbVariant::CdbVariant (LONG l)
{
if (l == -1)
{
vt = VT_ERROR;
scode = DISP_E_PARAMNOTFOUND;
}
else
{
vt = VT_I4;
lVal = l;
}
}
inline CONSTRUCTOR CdbVariant::CdbVariant(
LPCTSTR pstr): COleVariant(pstr,VT_BSTRT)
{
if (!pstr)
{
VariantClear(this);
vt = VT_ERROR;
scode = DISP_E_PARAMNOTFOUND;
}
}
inline CONSTRUCTOR CdbVariant::CdbVariant(
SHORT s, BOOL bIsBool) : COleVariant(s)
{
if (bIsBool)
{
vt = VT_BOOL;
boolVal = s;
}
else if (s==-1)
{
vt = VT_ERROR;
scode = DISP_E_PARAMNOTFOUND;
}
}
inline CONSTRUCTOR CdbVariant::CdbVariant(
LPVARIANT pv)
{
if (!pv)
{
vt = VT_ERROR;
scode = DISP_E_PARAMNOTFOUND;
}
else
VariantCopy(this, pv);
}
inline CONSTRUCTOR CdbVariant::CdbVariant(
LPSAFEARRAY psa)
{
if (!psa)
{
vt = VT_ERROR;
scode = DISP_E_PARAMNOTFOUND;
}
else
{
vt = VT_ARRAY|VT_UI1;
parray = psa;
}
}
inline VOID CdbVariant::operator =(
LPVARIANT pv)
{
if (!pv)
{
vt = VT_ERROR;
scode = DISP_E_PARAMNOTFOUND;
}
else
VariantCopy(this, pv);
}
inline VOID CdbVariant::operator =(
LPCTSTR pstr)
{
if (!pstr)
{
VariantClear(this);
vt = VT_ERROR;
scode = DISP_E_PARAMNOTFOUND;
}
else
{
#ifdef UNICODE
bstrVal = SysAllocString(pstr);
#else
bstrVal = SysAllocStringByteLen(pstr, strlen(pstr));
#endif
vt = VT_BSTR;
}
}
inline VOID CdbVariant::operator =(
SHORT s)
{
if (s==-1)
{
vt = VT_ERROR;
scode = DISP_E_PARAMNOTFOUND;
}
else
{
vt = VT_I2;
iVal = s;
}
}
inline VOID CdbVariant::operator =(
const int i)
{
if (i==-1)
{
vt = VT_ERROR;
scode = DISP_E_PARAMNOTFOUND;
}
else
{
vt = VT_I2;
iVal = (SHORT)i;
}
}
inline VOID CdbVariant::operator =(
LONG l)
{
if (l==-1)
{
vt = VT_ERROR;
scode = DISP_E_PARAMNOTFOUND;
}
else
{
vt = VT_I4;
lVal = l;
}
}
/*****************************************************************************
* CdbWide
*/
HRESULT CdbWideFromAnsi(LPSTR, unsigned int, BSTR *);
class CdbWide
{
public:
CONSTRUCTOR CdbWide (LPSTR pstr, unsigned int cb=0)
{
CdbWideFromAnsi(pstr, (pstr ? (cb==0 ? strlen(pstr) : cb) : 0), &m_bstr);
}
DESTRUCTOR ~CdbWide ()
{
SysFreeString(m_bstr);
}
operator LPWSTR ()
{
return (LPWSTR)m_bstr;
}
operator LPSTR ()
{
return (LPSTR)m_bstr;
}
ULONG cBytes ()
{
return SysStringByteLen(m_bstr);
}
private:
BSTR m_bstr;
};
/*****************************************************************************
* CdbOleObject
*/
class DLLEXPORT CdbOleObject : public CObject
{
public:
CONSTRUCTOR CdbOleObject (VOID);
virtual DESTRUCTOR ~CdbOleObject (VOID);
BOOL Exists (VOID);
CdbOleObject & operator = (CdbOleObject &o);
operator LPUNKNOWN (){ return GetInterface();}
VOID SetInterface (LPUNKNOWN punk, BOOL bAddRef=FALSE);
VOID SetInterface (REFIID riidClass, REFIID riidInterface);
VOID SetInterfaceLic (REFIID riidClass, REFIID riidInterface);
LPUNKNOWN GetInterface (BOOL bAddRef=FALSE, BOOL bThrowException=TRUE) const;
virtual VOID OnInterfaceChange (VOID);
VOID SetRichErrorInfo (LPOLESTR pstrSource, LPOLESTR pstrDescription, LPOLESTR pstrHelpFile, ULONG ulHelpID) const;
protected:
BOOL StartOLE (VOID);
LPUNKNOWN m_punkInterface;
};
/*****************************************************************************
* CdbCollection
*/
class DLLEXPORT CdbCollection : public CdbOleObject
{
public:
// Methods
virtual CdbObject ObItem (LONG i) = 0;
virtual CdbObject ObItem (LPCTSTR pstr) = 0;
virtual LONG GetCount (VOID) = 0;
virtual VOID ObAppend (CdbObject &obj) = 0;
virtual VOID Delete (LPCTSTR pstr) = 0;
virtual VOID Refresh (VOID) = 0;
};
class DLLEXPORT CdbStaticCollection : public CdbCollection
{
public:
CdbObject ObItem (LONG i);
CdbObject ObItem (LPCTSTR pstr);
LONG GetCount (VOID);
VOID ObAppend (CdbObject &obj);
VOID Delete (LPCTSTR pstr);
VOID Refresh (VOID) ;
};
class DLLEXPORT CdbDynamicCollection : public CdbCollection
{
public:
CdbObject ObItem (LONG i);
CdbObject ObItem (LPCTSTR pstr);
LONG GetCount (VOID);
VOID ObAppend (CdbObject &obj);
VOID Delete (LPCTSTR pstr);
VOID Refresh (VOID);
};
#define DAOMFC_STATIC_COLLECTION_DECL(objColl, objSingle, intSingle) \
class DLLEXPORT objColl : public CdbStaticCollection \
{ \
public: \
\
objSingle Item (LONG i); \
objSingle Item (LPCTSTR pstr); \
objSingle operator[] (LONG i); \
objSingle operator[] (LPCTSTR pstr); \
}
#define DAOMFC_DYNAMIC_COLLECTION_DECL(objColl, objSingle, intSingle) \
class DLLEXPORT objColl : public CdbDynamicCollection \
{ \
public: \
\
objSingle Item (LONG i); \
objSingle Item (LPCTSTR pstr); \
VOID Append (objSingle &o); \
objSingle operator[] (LONG i); \
objSingle operator[] (LPCTSTR pstr); \
}
DAOMFC_STATIC_COLLECTION_DECL(CdbErrors, CdbError, DAOError);
DAOMFC_STATIC_COLLECTION_DECL(CdbDatabases, CdbDatabase, DAODatabase);
//Connections are special cased so we can trap the copy constructor
DAOMFC_STATIC_COLLECTION_DECL(CdbRecordsets, CdbRecordset, DAORecordset);
DAOMFC_STATIC_COLLECTION_DECL(CdbParameters, CdbParameter, DAOParameter);
DAOMFC_STATIC_COLLECTION_DECL(CdbDocuments, CdbDocument, DAODocument);
DAOMFC_STATIC_COLLECTION_DECL(CdbContainers, CdbContainer, DAOContainer);
DAOMFC_DYNAMIC_COLLECTION_DECL(CdbProperties, CdbProperty, DAOProperty);
DAOMFC_DYNAMIC_COLLECTION_DECL(CdbFields, CdbField, DAOField);
DAOMFC_DYNAMIC_COLLECTION_DECL(CdbQueryDefs, CdbQueryDef, DAOQueryDef);
DAOMFC_DYNAMIC_COLLECTION_DECL(CdbTableDefs, CdbTableDef, DAOTableDef);
DAOMFC_DYNAMIC_COLLECTION_DECL(CdbIndexes, CdbIndex, DAOIndex);
DAOMFC_DYNAMIC_COLLECTION_DECL(CdbRelations, CdbRelation, DAORelation);
DAOMFC_DYNAMIC_COLLECTION_DECL(CdbUsers, CdbUser, DAOUser);
DAOMFC_DYNAMIC_COLLECTION_DECL(CdbGroups, CdbGroup, DAOGroup);
//Need some extra functions in CdbWorkspaces to support the delay in creating the
//default workspace needed to support the JET/ODBC option.
class DLLEXPORT CdbWorkspaces : public CdbDynamicCollection
{
friend CdbDBEngine;
private:
DAODBEngine * pDBEng;
BOOL m_bDontStart;
public:
CONSTRUCTOR CdbWorkspaces (VOID){pDBEng = NULL;}
CdbWorkspace Item (LONG i);
CdbWorkspace Item (LPCTSTR pstr);
VOID Append (CdbWorkspace &o);
CdbWorkspace operator[] (LONG i);
CdbWorkspace operator[] (LPCTSTR pstr);
VOID SetDBEngine (DAODBEngine *peng){pDBEng = peng;}
VOID GetDelayedInterface ();
};
//Need to trap Connections in the copy constructor so the user can't
//get a "sorta-kinda" working Connections collection on a Jet workspace
class DLLEXPORT CdbConnections : public CdbStaticCollection
{
public:
CONSTRUCTOR CdbConnections (CdbConnections &Connections);
CONSTRUCTOR CdbConnections (){pwrk = NULL;}
CdbConnection Item (LONG i);
CdbConnection Item (LPCTSTR pstr);
CdbConnection operator[] (LONG i);
CdbConnection operator[] (LPCTSTR pstr);
CdbConnections & operator = (CdbConnections &o);
LONG GetCount (VOID);
VOID Refresh (VOID) ;
VOID SetWorkspace (DAOWorkspace * pParent){pwrk = pParent;}
private:
VOID CheckInterface();
DAOWorkspace * pwrk;
};
/*****************************************************************************
* CdbObject
*/
class DLLEXPORT CdbObject : public CdbOleObject
{
public:
CONSTRUCTOR CdbObject (VOID);
CONSTRUCTOR CdbObject (LPUNKNOWN punk, BOOL bAddRef=FALSE);
virtual CString GetName (VOID);
virtual VOID SetName (LPCTSTR pstr);
CdbProperties Properties;
};
/*****************************************************************************
* CdbGetRowsEx (holds GetRowsEx for Recordset)
*/
class DLLEXPORT CdbGetRowsEx : public CdbObject
{
public:
// Administration
CONSTRUCTOR CdbGetRowsEx (VOID);
CONSTRUCTOR CdbGetRowsEx (ICDAORecordset *pGetRows, BOOL bAddRef=FALSE);
CONSTRUCTOR CdbGetRowsEx (const CdbGetRowsEx &);
CdbGetRowsEx & operator = (const CdbGetRowsEx &);
VOID OnInterfaceChange (VOID);
};
/*****************************************************************************
* Helper macros
*/
//Initialize a variant
#define DAOVINIT(var) \
do \
{ \
(var).vt = VT_ERROR; \
(var).scode = DISP_E_PARAMNOTFOUND; \
} \
while (0)
// LPTSTR to VARIANT
#define STV(pstr) CdbVariant(pstr)
// LPTSTR to BSTR
#define STB(pstr) V_BSTR(((LPVARIANT)STV(pstr)))
// LONG to VARIANT
#define LTV(l) CdbVariant(l)
// Optional LONG to VARIANT
#define OLTV(l) CdbVariant((l))
// C/C++ bool to DAO bool
#define BTB(b) ((VARIANT_BOOL)(b?-1:0))
// C/C++ bool to VARIANT
#define BTV(b) CdbVariant(BTB(b), TRUE)
// C/C++ short to VARIANT
#define SHTV(s) CdbVariant((SHORT)s)
// OLE variant to VARIANT
#define VTV(pv) CdbVariant(pv)
// SAFEARRAY to VARIANT
#define ATV(psa, var) \
do \
{ \
if (!psa) \
{ \
var.vt = VT_ERROR; \
var.scode = DISP_E_PARAMNOTFOUND; \
} \
else \
{ \
var.vt = VT_ARRAY|VT_UI1; \
SafeArrayCopy(psa, &var.parray); \
} \
} \
while (0)
#define DAOMFC_CALL(hr) \
do \
{ \
HRESULT hresult = (hr); \
if(FAILED(hresult)) \
{ \
TRACE0("\nDBDAO Call Failed.\n\t"); \
TRACE2("\nIn file %s on line %d\n", _T("DBDAO.CPP"), __LINE__); \
TRACE1("hResult = %X\n", hresult); \
if (GetScode(hresult) == E_OUTOFMEMORY) \
AfxThrowMemoryException(); \
else \
throw CdbException(hresult); \
} \
} while (0)
/*****************************************************************************
* Property Set/Get helper macros
*/
// Get a LONG property
#define LPROPGET(intDAO, meth) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
LONG l = 0; \
\
DAOMFC_CALL(p->meth(&l)); \
\
return l; \
} \
while (0)
// Set a LONG property
#define LPROPSET(intDAO, meth, l) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
\
DAOMFC_CALL(p->meth(l)); \
} \
while(0)
// Get a SHORT property
#define WPROPGET(intDAO, meth) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
SHORT s = 0; \
\
DAOMFC_CALL(p->meth(&s)); \
\
return s; \
} \
while (0)
// Set a SHORT property
#define WPROPSET(intDAO, meth, s) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
\
DAOMFC_CALL(p->meth(s)); \
} \
while(0)
// Get a STRING property
#define SPROPGET(intDAO, meth) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
CdbBSTR bstr; \
\
DAOMFC_CALL(p->meth(bstr)); \
\
return bstr; \
} \
while (0)
// Set a STRING property
#define SPROPSET(intDAO, meth, s) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
\
DAOMFC_CALL(p->meth(STB(s))); \
} \
while(0)
// Get a DATETIME property
#define DPROPGET(intDAO, meth) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
VARIANT Var; \
\
VariantInit(&Var); \
DAOMFC_CALL(p->meth(&Var)); \
return Var; \
} \
while (0)
// Set a DATETIME property
#define DPROPSET(intDAO, meth, pv) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
\
DAOMFC_CALL(p->meth(*pv)); \
} \
while(0)
// Get a BOOLEAN property
#define BPROPGET(intDAO, meth) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
VARIANT_BOOL vb = 0; \
\
DAOMFC_CALL(p->meth(&vb)); \
\
return (BOOL)vb; \
} \
while (0)
// Set a BOOLEAN property
#define BPROPSET(intDAO, meth, b) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
\
DAOMFC_CALL(p->meth(BTB(b))); \
} \
while(0)
// Get a VARIANT property
#define VPROPGET(intDAO, meth) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
COleVariant v; \
\
VariantInit(&v); \
DAOMFC_CALL(p->meth(&v)); \
\
return &v; \
} \
while (0)
// Set a VARIANT property
#define VPROPSET(intDAO, meth, pv) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
\
DAOMFC_CALL(p->meth(*pv)); \
} \
while(0)
// Get a DWORD property
#define DWPROPGET(intDAO, meth) \
do \
{ \
intDAO * p = (intDAO *)GetInterface(); \
DWORD dw = 0; \
\
DAOMFC_CALL(p->meth(&dw)); \
\
return dw; \
} \
while (0)
#define DAOMFC_STATIC_COLLECTION_IMPL(objColl, objSingle, intColl, intSingle) \
objSingle objColl::Item (LONG i) { return (intSingle *)(ObItem(i).GetInterface(TRUE)); } \
objSingle objColl::Item (LPCTSTR pstr) { return (intSingle *)(ObItem(pstr).GetInterface(TRUE)); } \
objSingle objColl::operator[] (LONG i) { return (intSingle *)(Item(i).GetInterface(TRUE)); } \
objSingle objColl::operator[] (LPCTSTR pstr) { return (intSingle *)(Item(pstr).GetInterface(TRUE)); }
#define DAOMFC_DYNAMIC_COLLECTION_IMPL(objColl, objSingle, intColl, intSingle) \
objSingle objColl::Item (LONG i) { return (intSingle *)(ObItem(i).GetInterface(TRUE)); } \
objSingle objColl::Item (LPCTSTR pstr) { return (intSingle *)(ObItem(pstr).GetInterface(TRUE)); } \
VOID objColl::Append (objSingle &o) { ObAppend(o); } \
objSingle objColl::operator[] (LONG i) { return (intSingle *)(Item(i).GetInterface(TRUE)); } \
objSingle objColl::operator[] (LPCTSTR pstr) { return (intSingle *)(Item(pstr).GetInterface(TRUE)); }
DECLARE_INTERFACE_(DAOMFCSCollection, _DAOCollection)
{
STDMETHOD(get_Item) (VARIANT index, LPUNKNOWN *ppunk);
};
DECLARE_INTERFACE_(DAOMFCDCollection, _DAODynaCollection)
{
STDMETHOD(get_Item) (VARIANT index, LPUNKNOWN *ppunk);
};
#endif // __DBDAO_H_