MLIB
Loading...
Searching...
No Matches
sqlitepp.h
Go to the documentation of this file.
1/*
2 Copyright (c) Mircea Neacsu (2014-2025) Licensed under MIT License.
3 This file is part of MLIB project. See LICENSE file for full license terms.
4*/
5
7
8#pragma once
9
10#if __has_include("defs.h")
11#include "defs.h"
12#endif
13
14#include <string>
15#include <map>
16#include <memory>
17#include <cassert>
18#include <cstring>
19
20#include "safe_winsock.h"
21#include <sqlite3/sqlite3.h>
22#include "errorcode.h"
23
24#ifndef _WIN32
25//#include <strings.h>
26#endif
27
28#if (defined(_MSVC_LANG) && _MSVC_LANG < 202002L) \
29 || (!defined(_MSVC_LANG) && (__cplusplus < 202002L))
30#error "sqlitepp requires c++20"
31#endif
32
33#pragma comment(lib, "sqlite3.lib")
34
35namespace mlib {
36
37class Database;
38
40class Query
41{
42public:
44 Query ();
45
47 Query (Database& db, const std::string& sql = std::string ());
48
50 Query (const Query& other);
51
53 Query (Query&& other);
54
56 Query& operator= (Query&& rhs);
57
59 Query& operator= (const Query& rhs);
60
61 ~Query ();
62
64 operator sqlite3_stmt* ();
65
67 Query& operator= (const std::string& str);
68
70 Query& sql (const std::string& str);
71
73 std::string sql () const;
74
76 operator std::string () const;
77
79 erc step ();
80
81 Query& bind (int par, const std::string& val);
82 Query& bind (const std::string& parname, const std::string& val);
83 Query& bind (int par, int val);
84 Query& bind (const std::string& parname, int val);
85 Query& bind (int par, double val);
86 Query& bind (const std::string& parname, double val);
87 Query& bind (int par, sqlite3_int64 val);
88 Query& bind (const std::string& parname, sqlite3_int64 val);
89 Query& bind (int par, void* val, int len);
90 Query& bind (const std::string& parname, void* val, int len);
91#ifdef _WIN32
92 Query& bind (int par, const SYSTEMTIME& st);
93 Query& bind (const std::string& parname, const SYSTEMTIME& st);
94#endif
95
97
98 int column_int (int nc) const;
99 int column_int (const std::string& colname) const;
100
101 std::string column_str (int nc) const;
102 std::string column_str (const std::string& colname) const;
103
104 const char* column_text (int nc) const;
105 const char* column_text (const std::string& colname) const;
106
107 double column_double (int nc) const;
108 double column_double (const std::string& colname) const;
109
110 sqlite3_int64 column_int64 (int nc) const;
111 sqlite3_int64 column_int64 (const std::string& name) const;
112
113 const void* column_blob (int nc) const;
114 const void* column_blob (const std::string& name) const;
115
116#ifdef _WIN32
117 SYSTEMTIME column_time (int nc) const;
118 SYSTEMTIME column_time (const std::string& name) const;
119#endif
120
121 int column_type (int nc) const;
122 int column_type (const std::string& colname) const;
123
124 int column_size (int nc) const;
125 int column_size (const std::string& colname) const;
126
127#ifndef SQLITE_OMIT_DECLTYPE
128 std::string decl_type (int nc) const;
129 std::string decl_type (const std::string& colname) const;
130#endif
131
132#ifdef SQLITE_ENABLE_COLUMN_METADATA
133 std::string table_name (int nc) const;
134 std::string table_name (const std::string& colname) const;
135
136 std::string database_name (int nc) const;
137 std::string database_name (const std::string& colname) const;
138#endif
139
140 std::string column_name (int nc) const;
141
143 int columns ();
144
146 erc reset ();
147
149 void clear ();
150
151private:
152 friend class Database;
153
154 void map_columns () const;
155 int find_col (const std::string& colname) const;
156 erc check_errors (int rc);
157
158 sqlite3_stmt* stmt;
159 std::shared_ptr<sqlite3> dbase;
160
163 struct iless
164 {
165 bool operator() (const std::string& left, const std::string& right) const;
166 };
167
168 std::map<std::string, int, Query::iless> mutable index;
169 bool mutable col_mapped;
170};
171
174{
175public:
177 enum class openflags
178 {
179 readonly = SQLITE_OPEN_READONLY,
180 readwrite = SQLITE_OPEN_READWRITE,
181 create = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
182 uri = SQLITE_OPEN_URI,
183 nomutex = SQLITE_OPEN_NOMUTEX,
184 fullmutex = SQLITE_OPEN_FULLMUTEX,
185 sharedcache = SQLITE_OPEN_SHAREDCACHE,
186 privatecache = SQLITE_OPEN_PRIVATECACHE,
187 memory = SQLITE_OPEN_MEMORY | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
188 nofollow = SQLITE_OPEN_NOFOLLOW,
189 ext_result = SQLITE_OPEN_EXRESCODE
190 };
191
193 Database ();
194
196 Database (const std::string& name, openflags flags = openflags::create);
197
199 Database& copy (Database& src);
200
202 bool connected ()
203 {
204 return (bool)db;
205 };
206
208 bool is_readonly ();
209
211 operator sqlite3* ()
212 {
213 return handle ();
214 }
215
217 sqlite3* handle () const
218 {
219 return db ? db.get () : nullptr;
220 }
221
223 sqlite3_int64 last_rowid ();
224
226 sqlite3_int64 changes ();
227
229 sqlite3_int64 total_changes ();
230
232 erc open (const std::string& name, openflags flags = openflags::create);
233
235 erc close ();
236
238 erc exec (const std::string& sql);
239
241 checked<Query> make_query (const std::string& sql);
242
244 checked<Query> make_query_multiple (std::string& sql);
245
247 std::string filename (const std::string& schema = "main") const;
248
250 std::string schema (int n) const;
251
253 int extended_error ();
254
256 erc flush ();
257
259 inline static void Errors (mlib::errfac& fac)
260 {
261 sqlite_errors = &fac;
262 }
263
265 inline static const errfac& Errors ()
266 {
267 return *sqlite_errors;
268 }
269
270private:
271 std::shared_ptr<sqlite3> db;
272 friend class Query;
273
274 static errfac* sqlite_errors;
275};
276
277
278/*==================== INLINE FUNCTIONS ===========================*/
279inline sqlite3_int64 Database::last_rowid ()
280{
281 assert (db);
282 return sqlite3_last_insert_rowid (db.get ());
283}
284
285inline sqlite3_int64 Database::changes ()
286{
287 assert (db);
288 return sqlite3_changes64 (db.get ());
289}
290
291inline sqlite3_int64 mlib::Database::total_changes ()
292{
293 assert (db);
294 return sqlite3_total_changes64 (db.get ());
295}
296
298 : stmt (0)
299 , col_mapped (false)
300{}
301
302inline Query::operator sqlite3_stmt* ()
303{
304 return stmt;
305}
306
307inline int Query::columns ()
308{
309 return sqlite3_column_count (stmt);
310}
311
317inline Query& Query::operator= (const std::string& str)
318{
319 return sql (str);
320}
321
322inline bool Query::iless::operator() (const std::string& left, const std::string& right) const
323{
324#ifdef _WIN32
325 return _strcmpi (left.c_str (), right.c_str ()) < 0;
326#else
327 return strcasecmp (left.c_str (), right.c_str ()) < 0;
328#endif
329}
330
334inline Query::operator std::string () const
335{
336 return sql ();
337}
338
340inline Database::openflags operator| (const Database::openflags& f1, const Database::openflags& f2)
341{
342 return static_cast<Database::openflags> (static_cast<int> (f1) | static_cast<int> (f2));
343}
344
345}; // namespace mlib
Wrapper for database connection handle.
Definition sqlitepp.h:174
static void Errors(mlib::errfac &fac)
Set error facility for all SQLITEPP errors.
Definition sqlitepp.h:259
erc close()
Close database connection.
Definition sqlitepp.cpp:176
Database()
Default constructor.
Definition sqlitepp.cpp:54
int extended_error()
Return extended result code.
Definition sqlitepp.cpp:236
Database & copy(Database &src)
Copy database content.
Definition sqlitepp.cpp:80
erc exec(const std::string &sql)
Execute multiple SQL sentences.
Definition sqlitepp.cpp:183
openflags
Flags for database opening mode.
Definition sqlitepp.h:178
@ sharedcache
database connection is eligible to use shared cache mode
Definition sqlitepp.h:185
@ nofollow
filename cannot be a symbolic link
Definition sqlitepp.h:188
@ privatecache
database connection does not participate in shared cache mode
Definition sqlitepp.h:186
@ readwrite
Read/write access on existing database.
Definition sqlitepp.h:180
@ readonly
Read-only access.
Definition sqlitepp.h:179
@ ext_result
enables extended result codes
Definition sqlitepp.h:189
@ create
Read/write/create access.
Definition sqlitepp.h:181
@ uri
filename is interpreted as a URI
Definition sqlitepp.h:182
@ fullmutex
database connection opens in the serialized mode
Definition sqlitepp.h:184
@ nomutex
database connection opens in multi-threaded mode
Definition sqlitepp.h:183
@ memory
database opened in memory
Definition sqlitepp.h:187
checked< Query > make_query(const std::string &sql)
Return a Query object containing a prepared statement with the given SQL text.
Definition sqlitepp.cpp:201
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:219
sqlite3_int64 changes()
Return number of records changed by last query.
Definition sqlitepp.h:285
bool connected()
Check if database is opened or not.
Definition sqlitepp.h:202
sqlite3_int64 last_rowid()
Return rowid of last successful insert.
Definition sqlitepp.h:279
erc open(const std::string &name, openflags flags=openflags::create)
Open database connection.
Definition sqlitepp.cpp:161
sqlite3_int64 total_changes()
Return total number of changes since database was opened.
Definition sqlitepp.h:291
sqlite3 * handle() const
Return handle of database connection.
Definition sqlitepp.h:217
std::string filename(const std::string &schema="main") const
Return filename of a database connection.
Definition sqlitepp.cpp:119
bool is_readonly()
Return true if database connection is read-only.
Definition sqlitepp.cpp:147
static const errfac & Errors()
Return error facility used by SQLITEPP.
Definition sqlitepp.h:265
std::string schema(int n) const
Return schema name for a database connection.
Definition sqlitepp.cpp:135
erc flush()
Flush.
Definition sqlitepp.cpp:242
Wrapper for SQL prepared sentences.
Definition sqlitepp.h:41
int column_int(int nc) const
Return column value converted to an integer.
Definition sqlitepp.cpp:825
std::string decl_type(int nc) const
Definition sqlitepp.cpp:636
int column_type(int nc) const
Return data type for a column specified by name or number.
Definition sqlitepp.cpp:593
Query & clear_bindings()
Reset all parameters to NULL values.
Definition sqlitepp.cpp:576
sqlite3_int64 column_int64(int nc) const
Return column value converted to a 64-bit integer.
Definition sqlitepp.cpp:904
std::string column_str(int nc) const
Return column value as an UTF-8 encoded string.
Definition sqlitepp.cpp:841
void clear()
Finalizes the statement and removes the database connection.
Definition sqlitepp.cpp:422
const char * column_text(int nc) const
Return a pointer to a NULL-terminated text with the column content.
Definition sqlitepp.cpp:862
Query()
Default constructor.
Definition sqlitepp.h:297
erc reset()
Reset statement to initial state.
Definition sqlitepp.cpp:412
int columns()
Return number of columns in the result set.
Definition sqlitepp.h:307
std::string column_name(int nc) const
Return column name.
Definition sqlitepp.cpp:788
Query & operator=(Query &&rhs)
Move assignment operator.
Definition sqlitepp.cpp:321
int column_size(int nc) const
Return number of bytes in a column that contains a BLOB or a string.
Definition sqlitepp.cpp:609
const void * column_blob(int nc) const
Return a pointer to a BLOB with the column content.
Definition sqlitepp.cpp:920
Query & sql(const std::string &str)
Assign SQL text to a query.
Definition sqlitepp.cpp:366
std::string table_name(int nc) const
Return originating table name.
Definition sqlitepp.cpp:684
double column_double(int nc) const
Return floating point value of the column.
Definition sqlitepp.cpp:883
erc step()
Evaluate the statement.
Definition sqlitepp.cpp:400
std::string sql() const
Retrieve SQL text.
Definition sqlitepp.cpp:386
std::string database_name(int nc) const
Return originating schema name.
Definition sqlitepp.cpp:740
Query & bind(int par, const std::string &val)
Bind a parameter specified by number to a character string.
Definition sqlitepp.cpp:452
Provides a mechanism similar to expected for creating objects associated with error codes.
Definition errorcode.h:203
objects returned as a function result or thrown directly.
Definition errorcode.h:73
An error facility routes a group of errors handled in a similar manner.
Definition errorcode.h:141
Definition of mlib::erc and mlib::errfac classes.