Home | History | Annotate | Download | only in include
      1 /**
      2  * This file has no copyright assigned and is placed in the Public Domain.
      3  * This file is part of the mingw-w64 runtime package.
      4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
      5  */
      6 #ifndef __DBDAO_H_
      7 #define __DBDAO_H_
      8 
      9 #ifndef __cplusplus
     10 #error This file can be used only in C++
     11 #else
     12 
     13 class COleVariant;
     14 class CdbBookmark;
     15 class CdbException;
     16 class CdbOleObject;
     17 class CdbObject;
     18 class CdbError;
     19 class CdbProperty;
     20 class CdbDBEngine;
     21 class CdbWorkspace;
     22 class CdbDatabase;
     23 class CdbConnection;
     24 class CdbRecordset;
     25 class CdbGetRowsEx;
     26 class CdbQueryDef;
     27 class CdbTableDef;
     28 class CdbField;
     29 class CdbRelation;
     30 class CdbIndex;
     31 class CdbUser;
     32 class CdbGroup;
     33 class CdbDocument;
     34 class CdbContainer;
     35 class CdbParameter;
     36 class CdbCollection;
     37 class CdbErrors;
     38 class CdbProperties;
     39 class CdbWorkspaces;
     40 class CdbDatabases;
     41 class CdbConnections;
     42 class CdbRecordsets;
     43 class CdbQueryDefs;
     44 class CdbTableDefs;
     45 class CdbFields;
     46 class CdbRelations;
     47 class CdbIndexes;
     48 class CdbUsers;
     49 class CdbGroups;
     50 class CdbDocuments;
     51 class CdbContainers;
     52 class CdbParameters;
     53 class CdbBStr;
     54 
     55 const char szKEY[] = "mbmabptebkjcdlgtjmskjwtsdhjbmkmwtrak";
     56 
     57 #define DAO_MAXSEEKFIELDS 13
     58 
     59 class DLLEXPORT CdbBSTR {
     60 public:
     61   CONSTRUCTOR CdbBSTR(BSTR=NULL);
     62   DESTRUCTOR ~CdbBSTR(VOID);
     63   operator BSTR *(VOID);
     64   operator LPCTSTR(VOID);
     65 private:
     66   BSTR m_bstr;
     67 };
     68 
     69 class CdbVariant : public COleVariant {
     70 public:
     71   CONSTRUCTOR CdbVariant(LONG l);
     72   CONSTRUCTOR CdbVariant(VOID);
     73   CONSTRUCTOR CdbVariant(LPCTSTR pstr);
     74   CONSTRUCTOR CdbVariant(SHORT s,WINBOOL bIsBool = FALSE);
     75   CONSTRUCTOR CdbVariant(LPVARIANT pv);
     76   CONSTRUCTOR CdbVariant(LPSAFEARRAY psa);
     77   VOID operator =(LPVARIANT pv);
     78   VOID operator =(LPCTSTR pstr);
     79   VOID operator =(SHORT s);
     80   VOID operator =(const int i);
     81   VOID operator =(LONG l);
     82 };
     83 
     84 inline CONSTRUCTOR CdbVariant::CdbVariant(VOID) : COleVariant() {
     85   vt = VT_ERROR;
     86   scode = DISP_E_PARAMNOTFOUND;
     87 }
     88 
     89 inline CdbVariant::CdbVariant(LONG l) {
     90   if(l==-1) {
     91     vt = VT_ERROR;
     92     scode = DISP_E_PARAMNOTFOUND;
     93   } else {
     94     vt = VT_I4;
     95     lVal = l;
     96   }
     97 }
     98 
     99 inline CONSTRUCTOR CdbVariant::CdbVariant(LPCTSTR pstr): COleVariant(pstr,VT_BSTRT) {
    100   if(!pstr) {
    101     VariantClear(this);
    102     vt = VT_ERROR;
    103     scode = DISP_E_PARAMNOTFOUND;
    104   }
    105 }
    106 
    107 inline CONSTRUCTOR CdbVariant::CdbVariant(SHORT s,WINBOOL bIsBool) : COleVariant(s) {
    108   if(bIsBool) {
    109     vt = VT_BOOL;
    110     boolVal = s;
    111   } else if(s==-1) {
    112     vt = VT_ERROR;
    113     scode = DISP_E_PARAMNOTFOUND;
    114   }
    115 }
    116 
    117 inline CONSTRUCTOR CdbVariant::CdbVariant(LPVARIANT pv) {
    118   if(!pv) {
    119     vt = VT_ERROR;
    120     scode = DISP_E_PARAMNOTFOUND;
    121   } else
    122     VariantCopy(this,pv);
    123 }
    124 
    125 inline CONSTRUCTOR CdbVariant::CdbVariant(LPSAFEARRAY psa) {
    126   if(!psa) {
    127     vt = VT_ERROR;
    128     scode = DISP_E_PARAMNOTFOUND;
    129   } else {
    130     vt = VT_ARRAY|VT_UI1;
    131     parray = psa;
    132   }
    133 }
    134 
    135 inline VOID CdbVariant::operator =(LPVARIANT pv) {
    136   if(!pv) {
    137     vt = VT_ERROR;
    138     scode = DISP_E_PARAMNOTFOUND;
    139   } else
    140     VariantCopy(this,pv);
    141 }
    142 
    143 inline VOID CdbVariant::operator =(LPCTSTR pstr) {
    144   if(!pstr) {
    145     VariantClear(this);
    146     vt = VT_ERROR;
    147     scode = DISP_E_PARAMNOTFOUND;
    148   } else {
    149 #if defined(UNICODE)
    150     bstrVal = SysAllocString(pstr);
    151 #else
    152     bstrVal = SysAllocStringByteLen(pstr,strlen(pstr));
    153 #endif
    154     vt = VT_BSTR;
    155   }
    156 }
    157 
    158 inline VOID CdbVariant::operator =(SHORT s) {
    159   if(s==-1) {
    160     vt = VT_ERROR;
    161     scode = DISP_E_PARAMNOTFOUND;
    162   } else {
    163     vt = VT_I2;
    164     iVal = s;
    165   }
    166 }
    167 
    168 inline VOID CdbVariant::operator =(const int i) {
    169   if(i==-1) {
    170     vt = VT_ERROR;
    171     scode = DISP_E_PARAMNOTFOUND;
    172   } else {
    173     vt = VT_I2;
    174     iVal =(SHORT)i;
    175   }
    176 }
    177 
    178 inline VOID CdbVariant::operator =(LONG l) {
    179   if(l==-1) {
    180     vt = VT_ERROR;
    181     scode = DISP_E_PARAMNOTFOUND;
    182   } else {
    183     vt = VT_I4;
    184     lVal = l;
    185   }
    186 }
    187 
    188 HRESULT CdbWideFromAnsi(LPSTR,unsigned int,BSTR *);
    189 
    190 class CdbWide {
    191 public:
    192   CONSTRUCTOR CdbWide(LPSTR pstr,unsigned int cb=0) {
    193     CdbWideFromAnsi(pstr,(pstr ? (cb==0 ? strlen(pstr) : cb) : 0),&m_bstr);
    194   }
    195   DESTRUCTOR ~CdbWide() {
    196     SysFreeString(m_bstr);
    197   }
    198   operator LPWSTR() { return (LPWSTR)m_bstr; }
    199   operator LPSTR() { return (LPSTR)m_bstr; }
    200   ULONG cBytes() { return SysStringByteLen(m_bstr); }
    201 private:
    202   BSTR m_bstr;
    203 };
    204 
    205 class DLLEXPORT CdbOleObject : public CObject {
    206 public:
    207   CONSTRUCTOR CdbOleObject(VOID);
    208   virtual DESTRUCTOR ~CdbOleObject(VOID);
    209   WINBOOL Exists(VOID);
    210   CdbOleObject &operator = (CdbOleObject &o);
    211   operator LPUNKNOWN(){ return GetInterface();}
    212   VOID SetInterface(LPUNKNOWN punk,WINBOOL bAddRef=FALSE);
    213   VOID SetInterface(REFIID riidClass,REFIID riidInterface);
    214   VOID SetInterfaceLic(REFIID riidClass,REFIID riidInterface);
    215   LPUNKNOWN GetInterface(WINBOOL bAddRef=FALSE,WINBOOL bThrowException=TRUE) const;
    216   virtual VOID OnInterfaceChange(VOID);
    217   VOID SetRichErrorInfo(LPOLESTR pstrSource,LPOLESTR pstrDescription,LPOLESTR pstrHelpFile,ULONG ulHelpID) const;
    218 protected:
    219   WINBOOL StartOLE(VOID);
    220   LPUNKNOWN m_punkInterface;
    221 };
    222 
    223 class DLLEXPORT CdbCollection : public CdbOleObject {
    224 public:
    225   virtual CdbObject ObItem(LONG i) = 0;
    226   virtual CdbObject ObItem(LPCTSTR pstr) = 0;
    227   virtual LONG GetCount(VOID) = 0;
    228   virtual VOID ObAppend(CdbObject &obj) = 0;
    229   virtual VOID Delete(LPCTSTR pstr) = 0;
    230   virtual VOID Refresh(VOID) = 0;
    231 };
    232 
    233 class DLLEXPORT CdbStaticCollection : public CdbCollection {
    234 public:
    235   CdbObject ObItem(LONG i);
    236   CdbObject ObItem(LPCTSTR pstr);
    237   LONG GetCount(VOID);
    238   VOID ObAppend(CdbObject &obj);
    239   VOID Delete(LPCTSTR pstr);
    240   VOID Refresh(VOID);
    241 };
    242 
    243 class DLLEXPORT CdbDynamicCollection : public CdbCollection {
    244 public:
    245   CdbObject ObItem(LONG i);
    246   CdbObject ObItem(LPCTSTR pstr);
    247   LONG GetCount(VOID);
    248   VOID ObAppend(CdbObject &obj);
    249   VOID Delete(LPCTSTR pstr);
    250   VOID Refresh(VOID);
    251 };
    252 
    253 #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); }
    254 #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); }
    255 
    256 DAOMFC_STATIC_COLLECTION_DECL(CdbErrors,CdbError,DAOError);
    257 DAOMFC_STATIC_COLLECTION_DECL(CdbDatabases,CdbDatabase,DAODatabase);
    258 DAOMFC_STATIC_COLLECTION_DECL(CdbRecordsets,CdbRecordset,DAORecordset);
    259 DAOMFC_STATIC_COLLECTION_DECL(CdbParameters,CdbParameter,DAOParameter);
    260 DAOMFC_STATIC_COLLECTION_DECL(CdbDocuments,CdbDocument,DAODocument);
    261 DAOMFC_STATIC_COLLECTION_DECL(CdbContainers,CdbContainer,DAOContainer);
    262 DAOMFC_DYNAMIC_COLLECTION_DECL(CdbProperties,CdbProperty,DAOProperty);
    263 DAOMFC_DYNAMIC_COLLECTION_DECL(CdbFields,CdbField,DAOField);
    264 DAOMFC_DYNAMIC_COLLECTION_DECL(CdbQueryDefs,CdbQueryDef,DAOQueryDef);
    265 DAOMFC_DYNAMIC_COLLECTION_DECL(CdbTableDefs,CdbTableDef,DAOTableDef);
    266 DAOMFC_DYNAMIC_COLLECTION_DECL(CdbIndexes,CdbIndex,DAOIndex);
    267 DAOMFC_DYNAMIC_COLLECTION_DECL(CdbRelations,CdbRelation,DAORelation);
    268 DAOMFC_DYNAMIC_COLLECTION_DECL(CdbUsers,CdbUser,DAOUser);
    269 DAOMFC_DYNAMIC_COLLECTION_DECL(CdbGroups,CdbGroup,DAOGroup);
    270 
    271 class DLLEXPORT CdbWorkspaces : public CdbDynamicCollection {
    272   friend CdbDBEngine;
    273 private:
    274   DAODBEngine *pDBEng;
    275   WINBOOL m_bDontStart;
    276 public:
    277   CONSTRUCTOR CdbWorkspaces(VOID){pDBEng = NULL;}
    278   CdbWorkspace Item(LONG i);
    279   CdbWorkspace Item(LPCTSTR pstr);
    280   VOID Append(CdbWorkspace &o);
    281   CdbWorkspace operator[](LONG i);
    282   CdbWorkspace operator[](LPCTSTR pstr);
    283   VOID SetDBEngine(DAODBEngine *peng){pDBEng = peng;}
    284   VOID GetDelayedInterface();
    285 };
    286 
    287 class DLLEXPORT CdbConnections : public CdbStaticCollection {
    288 public:
    289   CONSTRUCTOR CdbConnections(CdbConnections &Connections);
    290   CONSTRUCTOR CdbConnections() { pwrk = NULL; }
    291   CdbConnection Item(LONG i);
    292   CdbConnection Item(LPCTSTR pstr);
    293   CdbConnection operator[](LONG i);
    294   CdbConnection operator[](LPCTSTR pstr);
    295   CdbConnections &operator = (CdbConnections &o);
    296   LONG GetCount(VOID);
    297   VOID Refresh(VOID);
    298   VOID SetWorkspace(DAOWorkspace *pParent) { pwrk = pParent; }
    299 private:
    300   VOID CheckInterface();
    301   DAOWorkspace *pwrk;
    302 };
    303 
    304 class DLLEXPORT CdbObject : public CdbOleObject {
    305 public:
    306   CONSTRUCTOR CdbObject(VOID);
    307   CONSTRUCTOR CdbObject(LPUNKNOWN punk,WINBOOL bAddRef=FALSE);
    308   virtual CString GetName(VOID);
    309   virtual VOID SetName(LPCTSTR pstr);
    310   CdbProperties Properties;
    311 };
    312 
    313 class DLLEXPORT CdbGetRowsEx : public CdbObject {
    314 public:
    315   CONSTRUCTOR CdbGetRowsEx(VOID);
    316   CONSTRUCTOR CdbGetRowsEx(ICDAORecordset *pGetRows,WINBOOL bAddRef=FALSE);
    317   CONSTRUCTOR CdbGetRowsEx(const CdbGetRowsEx &);
    318   CdbGetRowsEx &operator =(const CdbGetRowsEx &);
    319   VOID OnInterfaceChange(VOID);
    320 };
    321 
    322 #define DAOVINIT(var) do { (var).vt = VT_ERROR; (var).scode = DISP_E_PARAMNOTFOUND; } while (0)
    323 #define STV(pstr) CdbVariant(pstr)
    324 #define STB(pstr) V_BSTR(((LPVARIANT)STV(pstr)))
    325 #define LTV(l) CdbVariant(l)
    326 #define OLTV(l) CdbVariant((l))
    327 #define BTB(b) ((VARIANT_BOOL)(b?-1:0))
    328 #define BTV(b) CdbVariant(BTB(b),TRUE)
    329 #define SHTV(s) CdbVariant((SHORT)s)
    330 #define VTV(pv) CdbVariant(pv)
    331 #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)
    332 #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)
    333 #define LPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); LONG l = 0; DAOMFC_CALL(p->meth(&l)); return l; } while (0)
    334 #define LPROPSET(intDAO,meth,l) do { intDAO *p = (intDAO *)GetInterface(); DAOMFC_CALL(p->meth(l)); } while(0)
    335 #define WPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); SHORT s = 0; DAOMFC_CALL(p->meth(&s)); return s; } while (0)
    336 #define WPROPSET(intDAO,meth,s) do { intDAO *p = (intDAO *)GetInterface(); DAOMFC_CALL(p->meth(s)); } while(0)
    337 #define SPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); CdbBSTR bstr; DAOMFC_CALL(p->meth(bstr)); return bstr; } while (0)
    338 #define SPROPSET(intDAO,meth,s) do { intDAO *p = (intDAO *)GetInterface(); DAOMFC_CALL(p->meth(STB(s))); } while(0)
    339 #define DPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); VARIANT Var; VariantInit(&Var); DAOMFC_CALL(p->meth(&Var)); return Var; } while (0)
    340 #define DPROPSET(intDAO,meth,pv) do { intDAO *p = (intDAO *)GetInterface(); DAOMFC_CALL(p->meth(*pv)); } while(0)
    341 #define BPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); VARIANT_BOOL vb = 0; DAOMFC_CALL(p->meth(&vb)); return(WINBOOL)vb; } while (0)
    342 #define BPROPSET(intDAO,meth,b) do { intDAO *p = (intDAO *)GetInterface(); DAOMFC_CALL(p->meth(BTB(b))); } while(0)
    343 #define VPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); COleVariant v; VariantInit(&v); DAOMFC_CALL(p->meth(&v)); return &v; } while (0)
    344 #define VPROPSET(intDAO,meth,pv) do { intDAO *p = (intDAO *)GetInterface(); DAOMFC_CALL(p->meth(*pv)); } while(0)
    345 #define DWPROPGET(intDAO,meth) do { intDAO *p = (intDAO *)GetInterface(); DWORD dw = 0; DAOMFC_CALL(p->meth(&dw)); return dw; } while (0)
    346 #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)); }
    347 #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)); }
    348 
    349 #undef INTERFACE
    350 #define INTERFACE DAOMFCSCollection
    351 DECLARE_INTERFACE_(DAOMFCSCollection,_DAOCollection) {
    352 #ifndef __cplusplus
    353   /* IUnknown methods */
    354   STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
    355   STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    356   STDMETHOD_(ULONG, Release)(THIS) PURE;
    357   /*** IDispatch methods ***/
    358   STDMETHOD(GetTypeInfoCount)(THIS_ UINT *pctinfo);
    359   STDMETHOD(GetTypeInfo)(THIS_ UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
    360   STDMETHOD(GetIDsOfNames)(THIS_ REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
    361   STDMETHOD(Invoke)(THIS_ DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
    362   /*** _DAOCollection ***/
    363   STDMETHOD(get_Count) (THIS_ short *c) PURE;
    364   STDMETHOD(_NewEnum) (THIS_ IUnknown **ppunk) PURE;
    365   STDMETHOD(Refresh) (THIS) PURE;
    366 #endif
    367   STDMETHOD(get_Item) (THIS_ VARIANT index,LPUNKNOWN *ppunk);
    368 };
    369 
    370 #undef INTERFACE
    371 #define INTERFACE DAOMFCDCollection
    372 DECLARE_INTERFACE_(DAOMFCDCollection,_DAODynaCollection) {
    373 #ifndef __cplusplus
    374   /* IUnknown methods */
    375   STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppvObject) PURE;
    376   STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    377   STDMETHOD_(ULONG, Release)(THIS) PURE;
    378   /*** IDispatch methods ***/
    379   STDMETHOD(GetTypeInfoCount)(THIS_ UINT *pctinfo);
    380   STDMETHOD(GetTypeInfo)(THIS_ UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
    381   STDMETHOD(GetIDsOfNames)(THIS_ REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
    382   STDMETHOD(Invoke)(THIS_ DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
    383   /*** _DAOCollection ***/
    384   STDMETHOD(get_Count) (THIS_ short *c) PURE;
    385   STDMETHOD(_NewEnum) (THIS_ IUnknown **ppunk) PURE;
    386   STDMETHOD(Refresh) (THIS) PURE;
    387   /*** _DAODynaCollection ***/
    388   STDMETHOD(Append) (THIS_ IDispatch *Object) PURE;
    389   STDMETHOD(Delete) (THIS_ BSTR Name) PURE;
    390 #endif
    391   STDMETHOD(get_Item) (THIS_ VARIANT index,LPUNKNOWN *ppunk);
    392 };
    393 
    394 #endif /* __cplusplus */
    395 
    396 #endif
    397