]> Creatis software - creaImageIO.git/blob - src/CppSQLite3.h
c45c9cb81ee30eedd8d001cab8dec3ad1997142f
[creaImageIO.git] / src / CppSQLite3.h
1 ////////////////////////////////////////////////////////////////////////////////\r
2 // CppSQLite3 - A C++ wrapper around the SQLite3 embedded database library.\r
3 //\r
4 // Copyright (c) 2004 Rob Groves. All Rights Reserved. rob.groves@btinternet.com\r
5 // \r
6 // Permission to use, copy, modify, and distribute this software and its\r
7 // documentation for any purpose, without fee, and without a written\r
8 // agreement, is hereby granted, provided that the above copyright notice, \r
9 // this paragraph and the following two paragraphs appear in all copies, \r
10 // modifications, and distributions.\r
11 //\r
12 // IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT,\r
13 // INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST\r
14 // PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION,\r
15 // EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
16 //\r
17 // THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT\r
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\r
19 // PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF\r
20 // ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS". THE AUTHOR HAS NO OBLIGATION\r
21 // TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.\r
22 //\r
23 // V3.0         03/08/2004      -Initial Version for sqlite3\r
24 //\r
25 // V3.1         16/09/2004      -Implemented getXXXXField using sqlite3 functions\r
26 //                                              -Added CppSQLiteDB3::tableExists()\r
27 ////////////////////////////////////////////////////////////////////////////////\r
28 #ifndef _CppSQLite3_H_\r
29 #define _CppSQLite3_H_\r
30 \r
31 #include "sqlite3.h"\r
32 #include <cstdio>\r
33 #include <cstring>\r
34 \r
35 #define CPPSQLITE_ERROR 1000\r
36 \r
37 class CppSQLite3Exception\r
38 {\r
39 public:\r
40 \r
41     CppSQLite3Exception(const int nErrCode,\r
42                         char* szErrMess,\r
43                         bool bDeleteMsg=true);\r
44   CppSQLite3Exception(const int nErrCode,\r
45                       const char* szErrMess,\r
46                       bool bDeleteMsg=true);\r
47   \r
48     CppSQLite3Exception(const CppSQLite3Exception&  e);\r
49 \r
50     virtual ~CppSQLite3Exception();\r
51 \r
52     const int errorCode() { return mnErrCode; }\r
53 \r
54     const char* errorMessage() { return mpszErrMess; }\r
55 \r
56     static const char* errorCodeAsString(int nErrCode);\r
57 \r
58 private:\r
59 \r
60     int mnErrCode;\r
61     char* mpszErrMess;\r
62 };\r
63 \r
64 \r
65 class CppSQLite3Buffer\r
66 {\r
67 public:\r
68 \r
69     CppSQLite3Buffer();\r
70 \r
71     ~CppSQLite3Buffer();\r
72 \r
73     const char* format(const char* szFormat, ...);\r
74 \r
75     operator const char*() { return mpBuf; }\r
76 \r
77     void clear();\r
78 \r
79 private:\r
80 \r
81     char* mpBuf;\r
82 };\r
83 \r
84 \r
85 class CppSQLite3Binary\r
86 {\r
87 public:\r
88 \r
89     CppSQLite3Binary();\r
90 \r
91     ~CppSQLite3Binary();\r
92 \r
93     void setBinary(const unsigned char* pBuf, int nLen);\r
94     void setEncoded(const unsigned char* pBuf);\r
95 \r
96     const unsigned char* getEncoded();\r
97     const unsigned char* getBinary();\r
98 \r
99     int getBinaryLength();\r
100 \r
101     unsigned char* allocBuffer(int nLen);\r
102 \r
103     void clear();\r
104 \r
105 private:\r
106 \r
107     unsigned char* mpBuf;\r
108     int mnBinaryLen;\r
109     int mnBufferLen;\r
110     int mnEncodedLen;\r
111     bool mbEncoded;\r
112 };\r
113 \r
114 \r
115 class CppSQLite3Query\r
116 {\r
117 public:\r
118 \r
119     CppSQLite3Query();\r
120 \r
121     CppSQLite3Query(const CppSQLite3Query& rQuery);\r
122 \r
123     CppSQLite3Query(sqlite3* pDB,\r
124                                 sqlite3_stmt* pVM,\r
125                 bool bEof,\r
126                 bool bOwnVM=true);\r
127 \r
128     CppSQLite3Query& operator=(const CppSQLite3Query& rQuery);\r
129 \r
130     virtual ~CppSQLite3Query();\r
131 \r
132     int numFields();\r
133 \r
134     int fieldIndex(const char* szField);\r
135     const char* fieldName(int nCol);\r
136 \r
137     const char* fieldDeclType(int nCol);\r
138     int fieldDataType(int nCol);\r
139 \r
140     const char* fieldValue(int nField);\r
141     const char* fieldValue(const char* szField);\r
142 \r
143     int getIntField(int nField, int nNullValue=0);\r
144     int getIntField(const char* szField, int nNullValue=0);\r
145 \r
146     double getFloatField(int nField, double fNullValue=0.0);\r
147     double getFloatField(const char* szField, double fNullValue=0.0);\r
148 \r
149     const char* getStringField(int nField, const char* szNullValue="");\r
150     const char* getStringField(const char* szField, const char* szNullValue="");\r
151 \r
152     const unsigned char* getBlobField(int nField, int& nLen);\r
153     const unsigned char* getBlobField(const char* szField, int& nLen);\r
154 \r
155     bool fieldIsNull(int nField);\r
156     bool fieldIsNull(const char* szField);\r
157 \r
158     bool eof();\r
159 \r
160     void nextRow();\r
161 \r
162     void finalize();\r
163 \r
164 private:\r
165 \r
166     void checkVM();\r
167 \r
168         sqlite3* mpDB;\r
169     sqlite3_stmt* mpVM;\r
170     bool mbEof;\r
171     int mnCols;\r
172     bool mbOwnVM;\r
173 };\r
174 \r
175 \r
176 class CppSQLite3Table\r
177 {\r
178 public:\r
179 \r
180     CppSQLite3Table();\r
181 \r
182     CppSQLite3Table(const CppSQLite3Table& rTable);\r
183 \r
184     CppSQLite3Table(char** paszResults, int nRows, int nCols);\r
185 \r
186     virtual ~CppSQLite3Table();\r
187 \r
188     CppSQLite3Table& operator=(const CppSQLite3Table& rTable);\r
189 \r
190     int numFields();\r
191 \r
192     int numRows();\r
193 \r
194     const char* fieldName(int nCol);\r
195 \r
196     const char* fieldValue(int nField);\r
197     const char* fieldValue(const char* szField);\r
198 \r
199     int getIntField(int nField, int nNullValue=0);\r
200     int getIntField(const char* szField, int nNullValue=0);\r
201 \r
202     double getFloatField(int nField, double fNullValue=0.0);\r
203     double getFloatField(const char* szField, double fNullValue=0.0);\r
204 \r
205     const char* getStringField(int nField, const char* szNullValue="");\r
206     const char* getStringField(const char* szField, const char* szNullValue="");\r
207 \r
208     bool fieldIsNull(int nField);\r
209     bool fieldIsNull(const char* szField);\r
210 \r
211     void setRow(int nRow);\r
212 \r
213     void finalize();\r
214 \r
215 private:\r
216 \r
217     void checkResults();\r
218 \r
219     int mnCols;\r
220     int mnRows;\r
221     int mnCurrentRow;\r
222     char** mpaszResults;\r
223 };\r
224 \r
225 \r
226 class CppSQLite3Statement\r
227 {\r
228 public:\r
229 \r
230     CppSQLite3Statement();\r
231 \r
232     CppSQLite3Statement(const CppSQLite3Statement& rStatement);\r
233 \r
234     CppSQLite3Statement(sqlite3* pDB, sqlite3_stmt* pVM);\r
235 \r
236     virtual ~CppSQLite3Statement();\r
237 \r
238     CppSQLite3Statement& operator=(const CppSQLite3Statement& rStatement);\r
239 \r
240     int execDML();\r
241 \r
242     CppSQLite3Query execQuery();\r
243 \r
244     void bind(int nParam, const char* szValue);\r
245     void bind(int nParam, const int nValue);\r
246     void bind(int nParam, const double dwValue);\r
247     void bind(int nParam, const unsigned char* blobValue, int nLen);\r
248     void bindNull(int nParam);\r
249 \r
250     void reset();\r
251 \r
252     void finalize();\r
253 \r
254 private:\r
255 \r
256     void checkDB();\r
257     void checkVM();\r
258 \r
259     sqlite3* mpDB;\r
260     sqlite3_stmt* mpVM;\r
261 };\r
262 \r
263 \r
264 class CppSQLite3DB\r
265 {\r
266 public:\r
267 \r
268     CppSQLite3DB();\r
269 \r
270     virtual ~CppSQLite3DB();\r
271 \r
272     void open(const char* szFile);\r
273 \r
274     void close();\r
275 \r
276         bool tableExists(const char* szTable);\r
277 \r
278     int execDML(const char* szSQL);\r
279 \r
280     CppSQLite3Query execQuery(const char* szSQL);\r
281 \r
282     int execScalar(const char* szSQL);\r
283 \r
284     CppSQLite3Table getTable(const char* szSQL);\r
285 \r
286     CppSQLite3Statement compileStatement(const char* szSQL);\r
287 \r
288     sqlite_int64 lastRowId();\r
289 \r
290     void interrupt() { sqlite3_interrupt(mpDB); }\r
291 \r
292     void setBusyTimeout(int nMillisecs);\r
293 \r
294     static const char* SQLiteVersion() { return SQLITE_VERSION; }\r
295 \r
296 private:\r
297 \r
298     CppSQLite3DB(const CppSQLite3DB& db);\r
299     CppSQLite3DB& operator=(const CppSQLite3DB& db);\r
300 \r
301     sqlite3_stmt* compile(const char* szSQL);\r
302 \r
303     void checkDB();\r
304 \r
305     sqlite3* mpDB;\r
306     int mnBusyTimeoutMs;\r
307 };\r
308 \r
309 #endif\r