_dbdao.h 14 KB

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