CppSQLite3U.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. ////////////////////////////////////////////////////////////////////////////////
  2. // CppSQLite3U is a C++ unicode wrapper around the SQLite3 embedded database library.
  3. //
  4. // Copyright (c) 2006 Tyushkov Nikolay. All Rights Reserved. http://softvoile.com
  5. //
  6. //
  7. // Based on beautiful wrapper written by Rob Groves
  8. // (https://secure.codeproject.com/database/CppSQLite.asp).
  9. // Very good wrapper, but without unicode support unfortunately.
  10. // So, I have reconstructed it for unicode.
  11. //
  12. // CppSQLite3 wrapper:
  13. // Copyright (c) 2004 Rob Groves. All Rights Reserved. rob.groves@btinternet.com
  14. //
  15. // Permission to use, copy, modify, and distribute this software and its
  16. // documentation for any purpose, without fee, and without a written
  17. // agreement, is hereby granted, provided that the above copyright notice,
  18. // this paragraph and the following two paragraphs appear in all copies,
  19. // modifications, and distributions.
  20. //
  21. // IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT,
  22. // INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST
  23. // PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION,
  24. // EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. //
  26. // THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT
  27. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
  28. // PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
  29. // ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS". THE AUTHOR HAS NO OBLIGATION
  30. // TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  31. //
  32. // If you want to get some documentation look at
  33. // https://secure.codeproject.com/database/CppSQLite.asp
  34. // Note, not all features from CppSQLite3 were implemented in CppSQLite3U
  35. //
  36. // V1.0 11/06/2006 - Initial Public Version
  37. //
  38. // Noteses :
  39. // I have tested this wrapper only in unicode version, so I have no idea
  40. // about its work in ANSI configuration, I think it doesn't work without modification;)
  41. //
  42. // Home page : http://softvoile.com/development/CppSQLite3U/
  43. // Please send all bug report and comment to mail2@softvoile.com
  44. //
  45. //
  46. ////////////////////////////////////////////////////////////////////////////////
  47. #pragma once
  48. #include "stdafx.h"
  49. #include "sqlite3.h"
  50. namespace OTSSQLITE
  51. {
  52. #define SQL_MAXSIZE 2048
  53. #define CPPSQLITE_ERROR 1000
  54. static const bool DONT_DELETE_MSG = false;
  55. CString DoubleQuotes(CString in);
  56. class CppSQLite3DB;
  57. class CppSQLite3Query;
  58. class CppSQLite3Statement;
  59. typedef std::shared_ptr<CppSQLite3DB> CppSQLite3DBPtr;
  60. class CppSQLite3Exception
  61. {
  62. public:
  63. CppSQLite3Exception(const int a_nErrCode,
  64. LPTSTR a_sErrMess,
  65. bool a_bDeleteMsg = true);
  66. CppSQLite3Exception(const CppSQLite3Exception& ex);
  67. virtual ~CppSQLite3Exception();
  68. const int GetErrorCode() { return m_nErrCode; }
  69. LPCTSTR GetErrorMessage() { return m_sErrMessage; }
  70. static LPCTSTR GetErrorCodeAsString(int a_nErrCode);
  71. private:
  72. int m_nErrCode;
  73. CString m_sErrMessage;
  74. };
  75. class CppSQLite3Statement
  76. {
  77. public:
  78. CppSQLite3Statement();
  79. CppSQLite3Statement(const CppSQLite3Statement& rStatement);
  80. CppSQLite3Statement(CppSQLite3DBPtr a_pDB, sqlite3_stmt* pVM);
  81. void setDB(CppSQLite3DBPtr a_pDB) { m_pDBPtr = a_pDB; }
  82. virtual ~CppSQLite3Statement();
  83. CppSQLite3Statement& operator=(const CppSQLite3Statement& rStatement);
  84. int execDML();
  85. CppSQLite3Query execQuery();
  86. void bind(int nParam, LPCTSTR szValue);
  87. void bind(int nParam, const int nValue);
  88. void bind(int nParam, const double dwValue);
  89. void bind(int nParam, const unsigned char* blobValue, int nLen);
  90. void bindNull(int nParam);
  91. void reset();
  92. void finalize();
  93. private:
  94. void checkDB();
  95. void checkVM();
  96. CppSQLite3DBPtr m_pDBPtr;
  97. sqlite3_stmt* m_pVM;
  98. };
  99. typedef std::shared_ptr<CppSQLite3Statement> CppSQLite3StatementPtr;
  100. class CppSQLite3Query
  101. {
  102. public:
  103. CppSQLite3Query();
  104. CppSQLite3Query(const CppSQLite3Query& rQuery);
  105. CppSQLite3Query(CppSQLite3DBPtr a_pDB,
  106. sqlite3_stmt* pVM,
  107. bool bEof,
  108. bool bOwnVM=true);
  109. CppSQLite3Query& operator=(const CppSQLite3Query& rQuery);
  110. virtual ~CppSQLite3Query();
  111. int numFields();
  112. int fieldIndex(LPCTSTR szField);
  113. LPCTSTR fieldName(int nCol);
  114. LPCTSTR fieldDeclType(int nCol);
  115. int fieldDataType(int nCol);
  116. LPCTSTR fieldValue(int nField);
  117. LPCTSTR fieldValue(LPCTSTR szField);
  118. int getIntField(int nField, int nNullValue=0);
  119. int getIntField(LPCTSTR szField, int nNullValue=0);
  120. double getFloatField(int nField, double fNullValue=0.0);
  121. double getFloatField(LPCTSTR szField, double fNullValue=0.0);
  122. LPCTSTR getStringField(int nField, LPCTSTR szNullValue=_T(""));
  123. LPCTSTR getStringField(LPCTSTR szField, LPCTSTR szNullValue=_T(""));
  124. const unsigned char* getBlobField(int nField, int& nLen);
  125. const unsigned char* getBlobField(LPCTSTR szField, int& nLen);
  126. bool fieldIsNull(int nField);
  127. bool fieldIsNull(LPCTSTR szField);
  128. bool eof();
  129. void nextRow();
  130. void finalize();
  131. private:
  132. void checkVM();
  133. CppSQLite3DBPtr m_pDBPtr;
  134. sqlite3_stmt* m_pVM;
  135. bool m_bEof;
  136. int m_nCols;
  137. bool m_bOwnVM;
  138. };
  139. typedef std::shared_ptr<CppSQLite3Query> CppSQLite3QueryPtr;
  140. class CppSQLite3DB : public std::enable_shared_from_this<CppSQLite3DB>
  141. {
  142. // Construction
  143. public:
  144. CppSQLite3DB();
  145. // Operations
  146. public:
  147. virtual ~CppSQLite3DB();
  148. void open(LPCTSTR szFile);
  149. bool isOpened();
  150. void close();
  151. bool tableExists(LPCTSTR szTable);
  152. int execDML(LPCTSTR szSQL);
  153. CppSQLite3QueryPtr execQuery(LPCTSTR szSQL);
  154. int execScalar(LPCTSTR szSQL);
  155. CString execScalarStr(LPCTSTR szSQL);
  156. CppSQLite3StatementPtr compileStatement(LPCTSTR szSQL);
  157. sqlite_int64 lastRowId();
  158. void interrupt() { sqlite3_interrupt(m_pDB); }
  159. void setBusyTimeout(int nMillisecs);
  160. static const char* SQLiteVersion() { return SQLITE_VERSION; }
  161. private:
  162. CppSQLite3DB(const CppSQLite3DB& db);
  163. CppSQLite3DB& operator=(const CppSQLite3DB& db);
  164. sqlite3_stmt* compile(LPCTSTR szSQL);
  165. void checkDB();
  166. public:
  167. sqlite3* m_pDB;
  168. int m_nBusyTimeoutMs;
  169. };
  170. /////////////////////////////////////////////////////////////////////////////
  171. //
  172. // TCHAR based sqlite3 function names for Unicode/MCBS builds.
  173. //
  174. #if defined(_UNICODE) || defined(UNICODE)
  175. //#pragma message(Reminder "Unicode Selected.")
  176. #define _sqlite3_aggregate_context sqlite3_aggregate_context
  177. #define _sqlite3_aggregate_count sqlite3_aggregate_count
  178. #define _sqlite3_bind_blob sqlite3_bind_blob
  179. #define _sqlite3_bind_double sqlite3_bind_double
  180. #define _sqlite3_bind_int sqlite3_bind_int
  181. #define _sqlite3_bind_int64 sqlite3_bind_int64
  182. #define _sqlite3_bind_null sqlite3_bind_null
  183. #define _sqlite3_bind_parameter_count sqlite3_bind_parameter_count
  184. #define _sqlite3_bind_parameter_index sqlite3_bind_parameter_index
  185. #define _sqlite3_bind_parameter_name sqlite3_bind_parameter_name
  186. #define _sqlite3_bind_text sqlite3_bind_text16
  187. #define _sqlite3_bind_text16 sqlite3_bind_text16
  188. #define _sqlite3_busy_handler sqlite3_busy_handler
  189. #define _sqlite3_busy_timeout sqlite3_busy_timeout
  190. #define _sqlite3_changes sqlite3_changes
  191. #define _sqlite3_close sqlite3_close
  192. #define _sqlite3_collation_needed sqlite3_collation_needed16
  193. #define _sqlite3_collation_needed16 sqlite3_collation_needed16
  194. #define _sqlite3_column_blob sqlite3_column_blob
  195. #define _sqlite3_column_bytes sqlite3_column_bytes16
  196. #define _sqlite3_column_bytes16 sqlite3_column_bytes16
  197. #define _sqlite3_column_count sqlite3_column_count
  198. #define _sqlite3_column_decltype sqlite3_column_decltype16
  199. #define _sqlite3_column_decltype16 sqlite3_column_decltype16
  200. #define _sqlite3_column_double sqlite3_column_double
  201. #define _sqlite3_column_int sqlite3_column_int
  202. #define _sqlite3_column_int64 sqlite3_column_int64
  203. #define _sqlite3_column_name sqlite3_column_name16
  204. #define _sqlite3_column_name16 sqlite3_column_name16
  205. #define _sqlite3_column_text sqlite3_column_text16
  206. #define _sqlite3_column_text16 sqlite3_column_text16
  207. #define _sqlite3_column_type sqlite3_column_type
  208. #define _sqlite3_commit_hook sqlite3_commit_hook
  209. #define _sqlite3_complete sqlite3_complete16
  210. #define _sqlite3_complete16 sqlite3_complete16
  211. #define _sqlite3_create_collation sqlite3_create_collation16
  212. #define _sqlite3_create_collation16 sqlite3_create_collation16
  213. #define _sqlite3_create_function sqlite3_create_function16
  214. #define _sqlite3_create_function16 sqlite3_create_function16
  215. #define _sqlite3_data_count sqlite3_data_count
  216. #define _sqlite3_errcode sqlite3_errcode
  217. #define _sqlite3_errmsg sqlite3_errmsg16
  218. #define _sqlite3_errmsg16 sqlite3_errmsg16
  219. #define _sqlite3_exec sqlite3_exec
  220. #define _sqlite3_finalize sqlite3_finalize
  221. #define _sqlite3_free sqlite3_free
  222. #define _sqlite3_free_table sqlite3_free_table
  223. #define _sqlite3_get_table sqlite3_get_table
  224. #define _sqlite3_interrupt sqlite3_interrupt
  225. #define _sqlite3_last_insert_rowid sqlite3_last_insert_rowid
  226. #define _sqlite3_libversion sqlite3_libversion
  227. #define _sqlite3_mprintf sqlite3_mprintf
  228. #define _sqlite3_open sqlite3_open16
  229. #define _sqlite3_open16 sqlite3_open16
  230. #define _sqlite3_prepare sqlite3_prepare16
  231. #define _sqlite3_prepare16 sqlite3_prepare16
  232. #define _sqlite3_progress_handler sqlite3_progress_handler
  233. #define _sqlite3_reset sqlite3_reset
  234. #define _sqlite3_result_blob sqlite3_result_blob
  235. #define _sqlite3_result_double sqlite3_result_double
  236. #define _sqlite3_result_error sqlite3_result_error16
  237. #define _sqlite3_result_error16 sqlite3_result_error16
  238. #define _sqlite3_result_int sqlite3_result_int
  239. #define _sqlite3_result_int64 sqlite3_result_int64
  240. #define _sqlite3_result_null sqlite3_result_null
  241. #define _sqlite3_result_text sqlite3_result_text16
  242. #define _sqlite3_result_text16 sqlite3_result_text16
  243. #define _sqlite3_result_text16be sqlite3_result_text16be
  244. #define _sqlite3_result_text16le sqlite3_result_text16le
  245. #define _sqlite3_result_value sqlite3_result_value
  246. #define _sqlite3_set_authorizer sqlite3_set_authorizer
  247. #define _sqlite3_step sqlite3_step
  248. #define _sqlite3_total_changes sqlite3_total_changes
  249. #define _sqlite3_trace sqlite3_trace
  250. #define _sqlite3_user_data sqlite3_user_data
  251. #define _sqlite3_value_blob sqlite3_value_blob
  252. #define _sqlite3_value_bytes sqlite3_value_bytes16
  253. #define _sqlite3_value_bytes16 sqlite3_value_bytes16
  254. #define _sqlite3_value_double sqlite3_value_double
  255. #define _sqlite3_value_int sqlite3_value_int
  256. #define _sqlite3_value_int64 sqlite3_value_int64
  257. #define _sqlite3_value_text sqlite3_value_text16
  258. #define _sqlite3_value_text16 sqlite3_value_text16
  259. #define _sqlite3_value_text16be sqlite3_value_text16be
  260. #define _sqlite3_value_text16le sqlite3_value_text16le
  261. #define _sqlite3_value_type sqlite3_value_type
  262. #define _sqlite3_vmprintf sqlite3_vmprintf
  263. #else
  264. //#pragma message(Reminder "MCBS Selected.")
  265. #define _sqlite3_aggregate_context sqlite3_aggregate_context
  266. #define _sqlite3_aggregate_count sqlite3_aggregate_count
  267. #define _sqlite3_bind_blob sqlite3_bind_blob
  268. #define _sqlite3_bind_double sqlite3_bind_double
  269. #define _sqlite3_bind_int sqlite3_bind_int
  270. #define _sqlite3_bind_int64 sqlite3_bind_int64
  271. #define _sqlite3_bind_null sqlite3_bind_null
  272. #define _sqlite3_bind_parameter_count sqlite3_bind_parameter_count
  273. #define _sqlite3_bind_parameter_index sqlite3_bind_parameter_index
  274. #define _sqlite3_bind_parameter_name sqlite3_bind_parameter_name
  275. #define _sqlite3_bind_text sqlite3_bind_text
  276. #define _sqlite3_bind_text16 sqlite3_bind_text16
  277. #define _sqlite3_busy_handler sqlite3_busy_handler
  278. #define _sqlite3_busy_timeout sqlite3_busy_timeout
  279. #define _sqlite3_changes sqlite3_changes
  280. #define _sqlite3_close sqlite3_close
  281. #define _sqlite3_collation_needed sqlite3_collation_needed
  282. #define _sqlite3_collation_needed16 sqlite3_collation_needed16
  283. #define _sqlite3_column_blob sqlite3_column_blob
  284. #define _sqlite3_column_bytes sqlite3_column_bytes
  285. #define _sqlite3_column_bytes16 sqlite3_column_bytes16
  286. #define _sqlite3_column_count sqlite3_column_count
  287. #define _sqlite3_column_decltype sqlite3_column_decltype
  288. #define _sqlite3_column_decltype16 sqlite3_column_decltype16
  289. #define _sqlite3_column_double sqlite3_column_double
  290. #define _sqlite3_column_int sqlite3_column_int
  291. #define _sqlite3_column_int64 sqlite3_column_int64
  292. #define _sqlite3_column_name sqlite3_column_name
  293. #define _sqlite3_column_name16 sqlite3_column_name16
  294. #define _sqlite3_column_text sqlite3_column_text
  295. #define _sqlite3_column_text16 sqlite3_column_text16
  296. #define _sqlite3_column_type sqlite3_column_type
  297. #define _sqlite3_commit_hook sqlite3_commit_hook
  298. #define _sqlite3_complete sqlite3_complete
  299. #define _sqlite3_complete16 sqlite3_complete16
  300. #define _sqlite3_create_collation sqlite3_create_collation
  301. #define _sqlite3_create_collation16 sqlite3_create_collation16
  302. #define _sqlite3_create_function sqlite3_create_function
  303. #define _sqlite3_create_function16 sqlite3_create_function16
  304. #define _sqlite3_data_count sqlite3_data_count
  305. #define _sqlite3_errcode sqlite3_errcode
  306. #define _sqlite3_errmsg sqlite3_errmsg
  307. #define _sqlite3_errmsg16 sqlite3_errmsg16
  308. #define _sqlite3_exec sqlite3_exec
  309. #define _sqlite3_finalize sqlite3_finalize
  310. #define _sqlite3_free sqlite3_free
  311. #define _sqlite3_free_table sqlite3_free_table
  312. #define _sqlite3_get_table sqlite3_get_table
  313. #define _sqlite3_interrupt sqlite3_interrupt
  314. #define _sqlite3_last_insert_rowid sqlite3_last_insert_rowid
  315. #define _sqlite3_libversion sqlite3_libversion
  316. #define _sqlite3_mprintf sqlite3_mprintf
  317. #define _sqlite3_open sqlite3_open
  318. #define _sqlite3_open16 sqlite3_open16
  319. #define _sqlite3_prepare sqlite3_prepare
  320. #define _sqlite3_prepare16 sqlite3_prepare16
  321. #define _sqlite3_progress_handler sqlite3_progress_handler
  322. #define _sqlite3_reset sqlite3_reset
  323. #define _sqlite3_result_blob sqlite3_result_blob
  324. #define _sqlite3_result_double sqlite3_result_double
  325. #define _sqlite3_result_error sqlite3_result_error
  326. #define _sqlite3_result_error16 sqlite3_result_error16
  327. #define _sqlite3_result_int sqlite3_result_int
  328. #define _sqlite3_result_int64 sqlite3_result_int64
  329. #define _sqlite3_result_null sqlite3_result_null
  330. #define _sqlite3_result_text sqlite3_result_text
  331. #define _sqlite3_result_text16 sqlite3_result_text16
  332. #define _sqlite3_result_text16be sqlite3_result_text16be
  333. #define _sqlite3_result_text16le sqlite3_result_text16le
  334. #define _sqlite3_result_value sqlite3_result_value
  335. #define _sqlite3_set_authorizer sqlite3_set_authorizer
  336. #define _sqlite3_step sqlite3_step
  337. #define _sqlite3_total_changes sqlite3_total_changes
  338. #define _sqlite3_trace sqlite3_trace
  339. #define _sqlite3_user_data sqlite3_user_data
  340. #define _sqlite3_value_blob sqlite3_value_blob
  341. #define _sqlite3_value_bytes sqlite3_value_bytes
  342. #define _sqlite3_value_bytes16 sqlite3_value_bytes16
  343. #define _sqlite3_value_double sqlite3_value_double
  344. #define _sqlite3_value_int sqlite3_value_int
  345. #define _sqlite3_value_int64 sqlite3_value_int64
  346. #define _sqlite3_value_text sqlite3_value_text
  347. #define _sqlite3_value_text16 sqlite3_value_text16
  348. #define _sqlite3_value_text16be sqlite3_value_text16be
  349. #define _sqlite3_value_text16le sqlite3_value_text16le
  350. #define _sqlite3_value_type sqlite3_value_type
  351. #define _sqlite3_vmprintf sqlite3_vmprintf
  352. #endif
  353. } // namespace Datastore