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 13class COleVariant; 14class CdbBookmark; 15class CdbException; 16class CdbOleObject; 17class CdbObject; 18class CdbError; 19class CdbProperty; 20class CdbDBEngine; 21class CdbWorkspace; 22class CdbDatabase; 23class CdbConnection; 24class CdbRecordset; 25class CdbGetRowsEx; 26class CdbQueryDef; 27class CdbTableDef; 28class CdbField; 29class CdbRelation; 30class CdbIndex; 31class CdbUser; 32class CdbGroup; 33class CdbDocument; 34class CdbContainer; 35class CdbParameter; 36class CdbCollection; 37class CdbErrors; 38class CdbProperties; 39class CdbWorkspaces; 40class CdbDatabases; 41class CdbConnections; 42class CdbRecordsets; 43class CdbQueryDefs; 44class CdbTableDefs; 45class CdbFields; 46class CdbRelations; 47class CdbIndexes; 48class CdbUsers; 49class CdbGroups; 50class CdbDocuments; 51class CdbContainers; 52class CdbParameters; 53class CdbBStr; 54 55const char szKEY[] = "mbmabptebkjcdlgtjmskjwtsdhjbmkmwtrak"; 56 57#define DAO_MAXSEEKFIELDS 13 58 59class DLLEXPORT CdbBSTR { 60public: 61 CONSTRUCTOR CdbBSTR(BSTR=NULL); 62 DESTRUCTOR ~CdbBSTR(VOID); 63 operator BSTR *(VOID); 64 operator LPCTSTR(VOID); 65private: 66 BSTR m_bstr; 67}; 68 69class CdbVariant : public COleVariant { 70public: 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 84inline CONSTRUCTOR CdbVariant::CdbVariant(VOID) : COleVariant() { 85 vt = VT_ERROR; 86 scode = DISP_E_PARAMNOTFOUND; 87} 88 89inline 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 99inline 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 107inline 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 117inline 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 125inline 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 135inline 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 143inline 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 158inline 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 168inline 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 178inline 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 188HRESULT CdbWideFromAnsi(LPSTR,unsigned int,BSTR *); 189 190class CdbWide { 191public: 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); } 201private: 202 BSTR m_bstr; 203}; 204 205class DLLEXPORT CdbOleObject : public CObject { 206public: 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; 218protected: 219 WINBOOL StartOLE(VOID); 220 LPUNKNOWN m_punkInterface; 221}; 222 223class DLLEXPORT CdbCollection : public CdbOleObject { 224public: 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 233class DLLEXPORT CdbStaticCollection : public CdbCollection { 234public: 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 243class DLLEXPORT CdbDynamicCollection : public CdbCollection { 244public: 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 256DAOMFC_STATIC_COLLECTION_DECL(CdbErrors,CdbError,DAOError); 257DAOMFC_STATIC_COLLECTION_DECL(CdbDatabases,CdbDatabase,DAODatabase); 258DAOMFC_STATIC_COLLECTION_DECL(CdbRecordsets,CdbRecordset,DAORecordset); 259DAOMFC_STATIC_COLLECTION_DECL(CdbParameters,CdbParameter,DAOParameter); 260DAOMFC_STATIC_COLLECTION_DECL(CdbDocuments,CdbDocument,DAODocument); 261DAOMFC_STATIC_COLLECTION_DECL(CdbContainers,CdbContainer,DAOContainer); 262DAOMFC_DYNAMIC_COLLECTION_DECL(CdbProperties,CdbProperty,DAOProperty); 263DAOMFC_DYNAMIC_COLLECTION_DECL(CdbFields,CdbField,DAOField); 264DAOMFC_DYNAMIC_COLLECTION_DECL(CdbQueryDefs,CdbQueryDef,DAOQueryDef); 265DAOMFC_DYNAMIC_COLLECTION_DECL(CdbTableDefs,CdbTableDef,DAOTableDef); 266DAOMFC_DYNAMIC_COLLECTION_DECL(CdbIndexes,CdbIndex,DAOIndex); 267DAOMFC_DYNAMIC_COLLECTION_DECL(CdbRelations,CdbRelation,DAORelation); 268DAOMFC_DYNAMIC_COLLECTION_DECL(CdbUsers,CdbUser,DAOUser); 269DAOMFC_DYNAMIC_COLLECTION_DECL(CdbGroups,CdbGroup,DAOGroup); 270 271class DLLEXPORT CdbWorkspaces : public CdbDynamicCollection { 272 friend CdbDBEngine; 273private: 274 DAODBEngine *pDBEng; 275 WINBOOL m_bDontStart; 276public: 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 287class DLLEXPORT CdbConnections : public CdbStaticCollection { 288public: 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; } 299private: 300 VOID CheckInterface(); 301 DAOWorkspace *pwrk; 302}; 303 304class DLLEXPORT CdbObject : public CdbOleObject { 305public: 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 313class DLLEXPORT CdbGetRowsEx : public CdbObject { 314public: 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 351DECLARE_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 372DECLARE_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