]> Creatis software - creaImageIO.git/blob - src/CppSQLite3.h
Initial revision
[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 \r
45     CppSQLite3Exception(const CppSQLite3Exception&  e);\r
46 \r
47     virtual ~CppSQLite3Exception();\r
48 \r
49     const int errorCode() { return mnErrCode; }\r
50 \r
51     const char* errorMessage() { return mpszErrMess; }\r
52 \r
53     static const char* errorCodeAsString(int nErrCode);\r
54 \r
55 private:\r
56 \r
57     int mnErrCode;\r
58     char* mpszErrMess;\r
59 };\r
60 \r
61 \r
62 class CppSQLite3Buffer\r
63 {\r
64 public:\r
65 \r
66     CppSQLite3Buffer();\r
67 \r
68     ~CppSQLite3Buffer();\r
69 \r
70     const char* format(const char* szFormat, ...);\r
71 \r
72     operator const char*() { return mpBuf; }\r
73 \r
74     void clear();\r
75 \r
76 private:\r
77 \r
78     char* mpBuf;\r
79 };\r
80 \r
81 \r
82 class CppSQLite3Binary\r
83 {\r
84 public:\r
85 \r
86     CppSQLite3Binary();\r
87 \r
88     ~CppSQLite3Binary();\r
89 \r
90     void setBinary(const unsigned char* pBuf, int nLen);\r
91     void setEncoded(const unsigned char* pBuf);\r
92 \r
93     const unsigned char* getEncoded();\r
94     const unsigned char* getBinary();\r
95 \r
96     int getBinaryLength();\r
97 \r
98     unsigned char* allocBuffer(int nLen);\r
99 \r
100     void clear();\r
101 \r
102 private:\r
103 \r
104     unsigned char* mpBuf;\r
105     int mnBinaryLen;\r
106     int mnBufferLen;\r
107     int mnEncodedLen;\r
108     bool mbEncoded;\r
109 };\r
110 \r
111 \r
112 class CppSQLite3Query\r
113 {\r
114 public:\r
115 \r
116     CppSQLite3Query();\r
117 \r
118     CppSQLite3Query(const CppSQLite3Query& rQuery);\r
119 \r
120     CppSQLite3Query(sqlite3* pDB,\r
121                                 sqlite3_stmt* pVM,\r
122                 bool bEof,\r
123                 bool bOwnVM=true);\r
124 \r
125     CppSQLite3Query& operator=(const CppSQLite3Query& rQuery);\r
126 \r
127     virtual ~CppSQLite3Query();\r
128 \r
129     int numFields();\r
130 \r
131     int fieldIndex(const char* szField);\r
132     const char* fieldName(int nCol);\r
133 \r
134     const char* fieldDeclType(int nCol);\r
135     int fieldDataType(int nCol);\r
136 \r
137     const char* fieldValue(int nField);\r
138     const char* fieldValue(const char* szField);\r
139 \r
140     int getIntField(int nField, int nNullValue=0);\r
141     int getIntField(const char* szField, int nNullValue=0);\r
142 \r
143     double getFloatField(int nField, double fNullValue=0.0);\r
144     double getFloatField(const char* szField, double fNullValue=0.0);\r
145 \r
146     const char* getStringField(int nField, const char* szNullValue="");\r
147     const char* getStringField(const char* szField, const char* szNullValue="");\r
148 \r
149     const unsigned char* getBlobField(int nField, int& nLen);\r
150     const unsigned char* getBlobField(const char* szField, int& nLen);\r
151 \r
152     bool fieldIsNull(int nField);\r
153     bool fieldIsNull(const char* szField);\r
154 \r
155     bool eof();\r
156 \r
157     void nextRow();\r
158 \r
159     void finalize();\r
160 \r
161 private:\r
162 \r
163     void checkVM();\r
164 \r
165         sqlite3* mpDB;\r
166     sqlite3_stmt* mpVM;\r
167     bool mbEof;\r
168     int mnCols;\r
169     bool mbOwnVM;\r
170 };\r
171 \r
172 \r
173 class CppSQLite3Table\r
174 {\r
175 public:\r
176 \r
177     CppSQLite3Table();\r
178 \r
179     CppSQLite3Table(const CppSQLite3Table& rTable);\r
180 \r
181     CppSQLite3Table(char** paszResults, int nRows, int nCols);\r
182 \r
183     virtual ~CppSQLite3Table();\r
184 \r
185     CppSQLite3Table& operator=(const CppSQLite3Table& rTable);\r
186 \r
187     int numFields();\r
188 \r
189     int numRows();\r
190 \r
191     const char* fieldName(int nCol);\r
192 \r
193     const char* fieldValue(int nField);\r
194     const char* fieldValue(const char* szField);\r
195 \r
196     int getIntField(int nField, int nNullValue=0);\r
197     int getIntField(const char* szField, int nNullValue=0);\r
198 \r
199     double getFloatField(int nField, double fNullValue=0.0);\r
200     double getFloatField(const char* szField, double fNullValue=0.0);\r
201 \r
202     const char* getStringField(int nField, const char* szNullValue="");\r
203     const char* getStringField(const char* szField, const char* szNullValue="");\r
204 \r
205     bool fieldIsNull(int nField);\r
206     bool fieldIsNull(const char* szField);\r
207 \r
208     void setRow(int nRow);\r
209 \r
210     void finalize();\r
211 \r
212 private:\r
213 \r
214     void checkResults();\r
215 \r
216     int mnCols;\r
217     int mnRows;\r
218     int mnCurrentRow;\r
219     char** mpaszResults;\r
220 };\r
221 \r
222 \r
223 class CppSQLite3Statement\r
224 {\r
225 public:\r
226 \r
227     CppSQLite3Statement();\r
228 \r
229     CppSQLite3Statement(const CppSQLite3Statement& rStatement);\r
230 \r
231     CppSQLite3Statement(sqlite3* pDB, sqlite3_stmt* pVM);\r
232 \r
233     virtual ~CppSQLite3Statement();\r
234 \r
235     CppSQLite3Statement& operator=(const CppSQLite3Statement& rStatement);\r
236 \r
237     int execDML();\r
238 \r
239     CppSQLite3Query execQuery();\r
240 \r
241     void bind(int nParam, const char* szValue);\r
242     void bind(int nParam, const int nValue);\r
243     void bind(int nParam, const double dwValue);\r
244     void bind(int nParam, const unsigned char* blobValue, int nLen);\r
245     void bindNull(int nParam);\r
246 \r
247     void reset();\r
248 \r
249     void finalize();\r
250 \r
251 private:\r
252 \r
253     void checkDB();\r
254     void checkVM();\r
255 \r
256     sqlite3* mpDB;\r
257     sqlite3_stmt* mpVM;\r
258 };\r
259 \r
260 \r
261 class CppSQLite3DB\r
262 {\r
263 public:\r
264 \r
265     CppSQLite3DB();\r
266 \r
267     virtual ~CppSQLite3DB();\r
268 \r
269     void open(const char* szFile);\r
270 \r
271     void close();\r
272 \r
273         bool tableExists(const char* szTable);\r
274 \r
275     int execDML(const char* szSQL);\r
276 \r
277     CppSQLite3Query execQuery(const char* szSQL);\r
278 \r
279     int execScalar(const char* szSQL);\r
280 \r
281     CppSQLite3Table getTable(const char* szSQL);\r
282 \r
283     CppSQLite3Statement compileStatement(const char* szSQL);\r
284 \r
285     sqlite_int64 lastRowId();\r
286 \r
287     void interrupt() { sqlite3_interrupt(mpDB); }\r
288 \r
289     void setBusyTimeout(int nMillisecs);\r
290 \r
291     static const char* SQLiteVersion() { return SQLITE_VERSION; }\r
292 \r
293 private:\r
294 \r
295     CppSQLite3DB(const CppSQLite3DB& db);\r
296     CppSQLite3DB& operator=(const CppSQLite3DB& db);\r
297 \r
298     sqlite3_stmt* compile(const char* szSQL);\r
299 \r
300     void checkDB();\r
301 \r
302     sqlite3* mpDB;\r
303     int mnBusyTimeoutMs;\r
304 };\r
305 \r
306 #endif\r