-
Notifications
You must be signed in to change notification settings - Fork 68
/
CppSQLite3.h
339 lines (216 loc) · 7.65 KB
/
CppSQLite3.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
/*
* CppSQLite
* Developed by Rob Groves <[email protected]>
* Maintained by NeoSmart Technologies <http://neosmart.net/>
* See LICENSE file for copyright and license info
*/
#ifndef CppSQLite3_H
#define CppSQLite3_H
#include <sqlite3.h>
#include <cstdio>
#include <cstring>
#include <exception>
#define CPPSQLITE_ERROR 1000
namespace detail
{
/**
* RAII class for managing memory allocated by sqlite
*/
class SQLite3Memory
{
public:
// Default constructor
SQLite3Memory();
// Constructor that allocates memory of a given size
SQLite3Memory(int nBufferLen);
// Constructor that formats a string with sqlite memory allocation
SQLite3Memory(const char* szFormat, va_list list);
// Destructor
~SQLite3Memory();
// Copy constructor
SQLite3Memory(SQLite3Memory const& other);
// Copy assignment
SQLite3Memory& operator=(SQLite3Memory const& lhs);
// Move constructor
SQLite3Memory(SQLite3Memory&& other);
// Move assignment
SQLite3Memory& operator=(SQLite3Memory&& lhs);
// Swap operation
void swap(SQLite3Memory& other);
int getLength() const { return mnBufferLen; }
void* getBuffer() const { return mpBuf; }
void clear();
private:
int mnBufferLen;
void* mpBuf;
};
}
class CppSQLite3Exception : public std::exception
{
public:
CppSQLite3Exception(const int nErrCode,
const char* szErrMess,
bool bDeleteMsg=true);
CppSQLite3Exception(const CppSQLite3Exception& e);
virtual ~CppSQLite3Exception();
const int errorCode() const { return mnErrCode; }
const char* errorMessage() const { return mpszErrMess; }
const char* what() const noexcept override { return mpszErrMess; }
static const char* errorCodeAsString(int nErrCode);
private:
int mnErrCode;
char* mpszErrMess;
};
class CppSQLite3Buffer
{
public:
const char* format(const char* szFormat, ...);
operator const char*() { return static_cast<char const*>(mBuf.getBuffer()); }
void clear();
private:
detail::SQLite3Memory mBuf;
};
class CppSQLite3Binary
{
public:
CppSQLite3Binary();
~CppSQLite3Binary();
void setBinary(const unsigned char* pBuf, int nLen);
void setEncoded(const unsigned char* pBuf);
const unsigned char* getEncoded();
const unsigned char* getBinary();
int getBinaryLength();
unsigned char* allocBuffer(int nLen);
void clear();
private:
unsigned char* mpBuf;
int mnBinaryLen;
int mnBufferLen;
int mnEncodedLen;
bool mbEncoded;
};
class CppSQLite3Query
{
public:
CppSQLite3Query();
CppSQLite3Query(const CppSQLite3Query& rQuery);
CppSQLite3Query(sqlite3* pDB,
sqlite3_stmt* pVM,
bool bEof,
bool bOwnVM=true);
CppSQLite3Query& operator=(const CppSQLite3Query& rQuery);
virtual ~CppSQLite3Query();
int numFields() const;
int fieldIndex(const char* szField) const;
const char* fieldName(int nCol) const;
const char* fieldDeclType(int nCol) const;
int fieldDataType(int nCol) const;
const char* fieldValue(int nField) const;
const char* fieldValue(const char* szField) const;
int getIntField(int nField, int nNullValue=0) const;
int getIntField(const char* szField, int nNullValue=0) const;
long long getInt64Field(int nField, long long nNullValue=0) const;
long long getInt64Field(const char* szField, long long nNullValue=0) const;
float getFloatField(int nField, float fNullValue=0.0f) const;
float getFloatField(const char* szField, float fNullValue=0.0f) const;
double getDoubleField(int nField, double dNullValue=0.0) const;
double getDoubleField(const char* szField, double dNullValue=0.0) const;
const char* getStringField(int nField, const char* szNullValue="") const;
const char* getStringField(const char* szField, const char* szNullValue="") const;
const unsigned char* getBlobField(int nField, int& nLen) const;
const unsigned char* getBlobField(const char* szField, int& nLen) const;
bool fieldIsNull(int nField) const;
bool fieldIsNull(const char* szField) const;
bool eof() const;
void nextRow();
void finalize();
private:
void checkVM() const;
sqlite3* mpDB;
sqlite3_stmt* mpVM;
bool mbEof;
int mnCols;
bool mbOwnVM;
};
class CppSQLite3Table
{
public:
CppSQLite3Table();
CppSQLite3Table(const CppSQLite3Table& rTable);
CppSQLite3Table(char** paszResults, int nRows, int nCols);
virtual ~CppSQLite3Table();
CppSQLite3Table& operator=(const CppSQLite3Table& rTable);
int numFields() const;
int numRows() const;
const char* fieldName(int nCol) const;
const char* fieldValue(int nField) const;
const char* fieldValue(const char* szField) const;
int getIntField(int nField, int nNullValue=0) const;
int getIntField(const char* szField, int nNullValue=0) const;
float getFloatField(int nField, float fNullValue=0.0f) const;
float getFloatField(const char* szField, float fNullValue=0.0f) const;
double getDoubleField(int nField, double dNullValue=0.0) const;
double getDoubleField(const char* szField, double dNullValue=0.0) const;
const char* getStringField(int nField, const char* szNullValue="") const;
const char* getStringField(const char* szField, const char* szNullValue="") const;
bool fieldIsNull(int nField) const;
bool fieldIsNull(const char* szField) const;
void setRow(int nRow);
void finalize();
private:
void checkResults() const;
int mnCols;
int mnRows;
int mnCurrentRow;
char** mpaszResults;
};
class CppSQLite3Statement
{
public:
CppSQLite3Statement();
CppSQLite3Statement(const CppSQLite3Statement& rStatement);
CppSQLite3Statement(sqlite3* pDB, sqlite3_stmt* pVM);
virtual ~CppSQLite3Statement();
CppSQLite3Statement& operator=(const CppSQLite3Statement& rStatement);
int execDML();
CppSQLite3Query execQuery();
void bind(int nParam, const char* szValue);
void bind(int nParam, const int nValue);
void bind(int nParam, const long long nValue);
void bind(int nParam, const double dwValue);
void bind(int nParam, const unsigned char* blobValue, int nLen);
void bindNull(int nParam);
void reset();
void finalize();
private:
void checkDB() const;
void checkVM() const;
sqlite3* mpDB;
sqlite3_stmt* mpVM;
};
class CppSQLite3DB
{
public:
CppSQLite3DB();
virtual ~CppSQLite3DB();
void open(const char* szFile);
void close();
bool tableExists(const char* szTable);
int execDML(const char* szSQL);
CppSQLite3Query execQuery(const char* szSQL);
int execScalar(const char* szSQL);
CppSQLite3Table getTable(const char* szSQL);
CppSQLite3Statement compileStatement(const char* szSQL);
sqlite_int64 lastRowId() const;
void interrupt() { sqlite3_interrupt(mpDB); }
void setBusyTimeout(int nMillisecs);
static const char* SQLiteVersion() { return SQLITE_VERSION; }
private:
CppSQLite3DB(const CppSQLite3DB& db);
CppSQLite3DB& operator=(const CppSQLite3DB& db);
sqlite3_stmt* compile(const char* szSQL);
void checkDB() const;
sqlite3* mpDB;
int mnBusyTimeoutMs;
};
#endif