• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
CdbVariant(VOID)84 inline CONSTRUCTOR CdbVariant::CdbVariant(VOID) : COleVariant() {
85   vt = VT_ERROR;
86   scode = DISP_E_PARAMNOTFOUND;
87 }
88 
CdbVariant(LONG l)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 
CdbVariant(LPCTSTR pstr)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 
CdbVariant(SHORT s,WINBOOL bIsBool)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 
CdbVariant(LPVARIANT pv)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 
CdbVariant(LPSAFEARRAY psa)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   }
~CdbWide()195   DESTRUCTOR ~CdbWide() {
196     SysFreeString(m_bstr);
197   }
LPWSTR()198   operator LPWSTR() { return (LPWSTR)m_bstr; }
LPSTR()199   operator LPSTR() { return (LPSTR)m_bstr; }
cBytes()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);
LPUNKNOWN()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:
CdbWorkspaces(VOID)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);
SetDBEngine(DAODBEngine * peng)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);
CdbConnections()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);
SetWorkspace(DAOWorkspace * pParent)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
DECLARE_INTERFACE_(DAOMFCSCollection,_DAOCollection)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
DECLARE_INTERFACE_(DAOMFCDCollection,_DAODynaCollection)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