MLIB
Loading...
Searching...
No Matches
sqlitepp.h
Go to the documentation of this file.
1
6#pragma once
7
8#if __has_include("defs.h")
9#include "defs.h"
10#endif
11
12#include <string>
13#include <map>
14#include <memory>
15#include <cassert>
16#include <cstring>
17
18#include "safe_winsock.h"
19#include <sqlite3/sqlite3.h>
20#include "errorcode.h"
21
22#ifndef _WIN32
23//#include <strings.h>
24#endif
25
26#if (defined(_MSVC_LANG) && _MSVC_LANG < 202002L) \
27 || (!defined(_MSVC_LANG) && (__cplusplus < 202002L))
28#error "sqlitepp requires c++20"
29#endif
30
31#pragma comment(lib, "sqlite3.lib")
32
33namespace mlib {
34
35class Query;
36
39{
40public:
42 enum class openflags
43 {
44 readonly = SQLITE_OPEN_READONLY,
45 readwrite = SQLITE_OPEN_READWRITE,
46 create = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
47 uri = SQLITE_OPEN_URI,
48 nomutex = SQLITE_OPEN_NOMUTEX,
49 fullmutex = SQLITE_OPEN_FULLMUTEX,
50 sharedcache = SQLITE_OPEN_SHAREDCACHE,
51 privatecache = SQLITE_OPEN_PRIVATECACHE,
52 memory = SQLITE_OPEN_MEMORY | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
53 nofollow = SQLITE_OPEN_NOFOLLOW,
54 ext_result = SQLITE_OPEN_EXRESCODE
55 };
56
58 Database ();
59
61 Database (const std::string& name, openflags flags = openflags::create);
62
64 Database& copy (Database& src);
65
67 bool connected ()
68 {
69 return (bool)db;
70 };
71
73 bool is_readonly ();
74
76 operator sqlite3* ()
77 {
78 return handle ();
79 }
80
82 sqlite3* handle () const
83 {
84 return db ? db.get () : nullptr;
85 }
86
88 sqlite3_int64 last_rowid ();
89
91 sqlite3_int64 changes ();
92
94 sqlite3_int64 total_changes ();
95
97 erc open (const std::string& name, openflags flags = openflags::create);
98
100 erc close ();
101
103 erc exec (const std::string& sql);
104
106 checked<Query> make_query (const std::string& sql);
107
109 checked<Query> make_query_multiple (std::string& sql);
110
112 std::string filename (const std::string& schema = "main") const;
113
115 std::string schema (int n) const;
116
118 int extended_error ();
119
121 erc flush ();
122
124 inline static void Errors (mlib::errfac& fac)
125 {
126 sqlite_errors = &fac;
127 }
128
130 inline static const errfac& Errors ()
131 {
132 return *sqlite_errors;
133 }
134
135private:
136 std::shared_ptr<sqlite3> db;
137 friend class Query;
138
139 static errfac* sqlite_errors;
140};
141
143class Query
144{
145 friend class Database;
146
147public:
149 Query ();
150
152 Query (Database& db, const std::string& sql = std::string ());
153
155 Query (const Query& other);
156
158 Query (Query&& other);
159
161 Query& operator= (Query&& rhs);
162
164 Query& operator= (const Query& rhs);
165
166 ~Query ();
167
169 operator sqlite3_stmt* ();
170
172 Query& operator= (const std::string& str);
173
175 Query& sql (const std::string& str);
176
178 std::string sql () const;
179
181 operator std::string () const;
182
184 erc step ();
185
186 Query& bind (int par, const std::string& val);
187 Query& bind (const std::string& parname, const std::string& val);
188 Query& bind (int par, int val);
189 Query& bind (const std::string& parname, int val);
190 Query& bind (int par, double val);
191 Query& bind (const std::string& parname, double val);
192 Query& bind (int par, sqlite3_int64 val);
193 Query& bind (const std::string& parname, sqlite3_int64 val);
194 Query& bind (int par, void* val, int len);
195 Query& bind (const std::string& parname, void* val, int len);
196#ifdef _WIN32
197 Query& bind (int par, const SYSTEMTIME& st);
198 Query& bind (const std::string& parname, const SYSTEMTIME& st);
199#endif
200
202
203 int column_int (int nc) const;
204 int column_int (const std::string& colname) const;
205
206 std::string column_str (int nc) const;
207 std::string column_str (const std::string& colname) const;
208
209 const char* column_text (int nc) const;
210 const char* column_text (const std::string& colname) const;
211
212 double column_double (int nc) const;
213 double column_double (const std::string& colname) const;
214
215 sqlite3_int64 column_int64 (int nc) const;
216 sqlite3_int64 column_int64 (const std::string& name) const;
217
218 const void* column_blob (int nc) const;
219 const void* column_blob (const std::string& name) const;
220
221#ifdef _WIN32
222 SYSTEMTIME column_time (int nc) const;
223 SYSTEMTIME column_time (const std::string& name) const;
224#endif
225
226 int column_type (int nc) const;
227 int column_type (const std::string& colname) const;
228
229 int column_size (int nc) const;
230 int column_size (const std::string& colname) const;
231
232#ifndef SQLITE_OMIT_DECLTYPE
233 std::string decl_type (int nc) const;
234 std::string decl_type (const std::string& colname) const;
235#endif
236
237#ifdef SQLITE_ENABLE_COLUMN_METADATA
238 std::string table_name (int nc) const;
239 std::string table_name (const std::string& colname) const;
240
241 std::string database_name (int nc) const;
242 std::string database_name (const std::string& colname) const;
243#endif
244
245 std::string column_name (int nc) const;
246
248 int columns ();
249
251 erc reset ();
252
254 void clear ();
255
256private:
257 void map_columns () const;
258 int find_col (const std::string& colname) const;
259 erc check_errors (int rc);
260
261 sqlite3_stmt* stmt;
262 Database dbase;
263
266 struct iless
267 {
268 bool operator() (const std::string& left, const std::string& right) const;
269 };
270
271 std::map<std::string, int, Query::iless> mutable index;
272 bool mutable col_mapped;
273};
274
275/*==================== INLINE FUNCTIONS ===========================*/
276inline sqlite3_int64 Database::last_rowid ()
277{
278 assert (db);
279 return sqlite3_last_insert_rowid (db.get ());
280}
281
282inline sqlite3_int64 Database::changes ()
283{
284 assert (db);
285 return sqlite3_changes64 (db.get ());
286}
287
288inline sqlite3_int64 mlib::Database::total_changes ()
289{
290 assert (db);
291 return sqlite3_total_changes64 (db.get ());
292}
293
295 : stmt (0)
296 , col_mapped (false)
297{}
298
299inline Query::operator sqlite3_stmt* ()
300{
301 return stmt;
302}
303
304inline int Query::columns ()
305{
306 return sqlite3_column_count (stmt);
307}
308
314inline Query& Query::operator= (const std::string& str)
315{
316 return sql (str);
317}
318
319inline bool Query::iless::operator() (const std::string& left, const std::string& right) const
320{
321#ifdef _WIN32
322 return _strcmpi (left.c_str (), right.c_str ()) < 0;
323#else
324 return strcasecmp (left.c_str (), right.c_str ()) < 0;
325#endif
326}
327
331inline Query::operator std::string () const
332{
333 return sql ();
334}
335
336inline Database::openflags operator| (const Database::openflags& f1, const Database::openflags& f2)
337{
338 return static_cast<Database::openflags> (static_cast<int> (f1) | static_cast<int> (f2));
339}
340
341}; // namespace mlib
Wrapper for database connection handle.
Definition sqlitepp.h:39
static void Errors(mlib::errfac &fac)
Set error facility for all SQLITEPP errors.
Definition sqlitepp.h:124
erc close()
Close database connection.
Definition sqlitepp.cpp:172
Database()
Default constructor.
Definition sqlitepp.cpp:50
int extended_error()
Return extended result code.
Definition sqlitepp.cpp:232
Database & copy(Database &src)
Copy database content.
Definition sqlitepp.cpp:76
erc exec(const std::string &sql)
Execute multiple SQL sentences.
Definition sqlitepp.cpp:179
openflags
Flags for database opening mode.
Definition sqlitepp.h:43
@ sharedcache
database connection is eligible to use shared cache mode
Definition sqlitepp.h:50
@ nofollow
filename cannot be a symbolic link
Definition sqlitepp.h:53
@ privatecache
database connection does not participate in shared cache mode
Definition sqlitepp.h:51
@ readwrite
Read/write access on existing database.
Definition sqlitepp.h:45
@ readonly
Read-only access.
Definition sqlitepp.h:44
@ ext_result
enables extended result codes
Definition sqlitepp.h:54
@ create
Read/write/create access.
Definition sqlitepp.h:46
@ uri
filename is interpreted as a URI
Definition sqlitepp.h:47
@ fullmutex
database connection opens in the serialized mode
Definition sqlitepp.h:49
@ nomutex
database connection opens in multi-threaded mode
Definition sqlitepp.h:48
@ memory
database opened in memory
Definition sqlitepp.h:52
checked< Query > make_query(const std::string &sql)
Return a Query object containing a prepared statement with the given SQL text.
Definition sqlitepp.cpp:197
checked< Query > make_query_multiple(std::string &sql)
Return a Query object containing the first prepared statement of the given SQL text.
Definition sqlitepp.cpp:215
sqlite3_int64 changes()
Return number of records changed by last query.
Definition sqlitepp.h:282
bool connected()
Check if database is opened or not.
Definition sqlitepp.h:67
sqlite3_int64 last_rowid()
Return rowid of last successful insert.
Definition sqlitepp.h:276
erc open(const std::string &name, openflags flags=openflags::create)
Open database connection.
Definition sqlitepp.cpp:157
sqlite3_int64 total_changes()
Return total number of changes since database was opened.
Definition sqlitepp.h:288
sqlite3 * handle() const
Return handle of database connection.
Definition sqlitepp.h:82
std::string filename(const std::string &schema="main") const
Return filename of a database connection.
Definition sqlitepp.cpp:115
bool is_readonly()
Return true if database connection is read-only.
Definition sqlitepp.cpp:143
static const errfac & Errors()
Return error facility used by SQLITEPP.
Definition sqlitepp.h:130
std::string schema(int n) const
Return schema name for a database connection.
Definition sqlitepp.cpp:131
erc flush()
Flush.
Definition sqlitepp.cpp:238
Wrapper for SQL prepared sentences.
Definition sqlitepp.h:144
int column_int(int nc) const
Return column value converted to an integer.
Definition sqlitepp.cpp:821
std::string decl_type(int nc) const
Definition sqlitepp.cpp:632
int column_type(int nc) const
Return data type for a column specified by name or number.
Definition sqlitepp.cpp:589
Query & clear_bindings()
Reset all parameters to NULL values.
Definition sqlitepp.cpp:572
sqlite3_int64 column_int64(int nc) const
Return column value converted to a 64-bit integer.
Definition sqlitepp.cpp:900
std::string column_str(int nc) const
Return column value as an UTF-8 encoded string.
Definition sqlitepp.cpp:837
void clear()
Finalizes the statement and removes the database connection.
Definition sqlitepp.cpp:418
const char * column_text(int nc) const
Return a pointer to a NULL-terminated text with the column content.
Definition sqlitepp.cpp:858
Query()
Default constructor.
Definition sqlitepp.h:294
erc reset()
Reset statement to initial state.
Definition sqlitepp.cpp:408
int columns()
Return number of columns in the result set.
Definition sqlitepp.h:304
std::string column_name(int nc) const
Return column name.
Definition sqlitepp.cpp:784
Query & operator=(Query &&rhs)
Move assignment operator.
Definition sqlitepp.cpp:317
int column_size(int nc) const
Return number of bytes in a column that contains a BLOB or a string.
Definition sqlitepp.cpp:605
const void * column_blob(int nc) const
Return a pointer to a BLOB with the column content.
Definition sqlitepp.cpp:916
Query & sql(const std::string &str)
Assign SQL text to a query.
Definition sqlitepp.cpp:362
std::string table_name(int nc) const
Return originating table name.
Definition sqlitepp.cpp:680
double column_double(int nc) const
Return floating point value of the column.
Definition sqlitepp.cpp:879
erc step()
Evaluate the statement.
Definition sqlitepp.cpp:396
std::string sql() const
Retrieve SQL text.
Definition sqlitepp.cpp:382
std::string database_name(int nc) const
Return originating schema name.
Definition sqlitepp.cpp:736
Query & bind(int par, const std::string &val)
Bind a parameter specified by number to a character string.
Definition sqlitepp.cpp:448
objects returned as a function result or thrown directly.
Definition errorcode.h:68
An error facility routes a group of errors handled in a similar manner.
Definition errorcode.h:136
Definition of erc and erfac classes.