11#include "../helpers/LastError.h"
12#include "SQLiteSmart.h"
19enum OpenFlags :
unsigned {
21 NO_FOREIGN_KEY = 1 << 1,
22 ERROR_ON_UNIQUE_CONSTRAINT = 1 << 2,
28enum struct TransactionType {
40class AutoTransaction {
42 AutoTransaction() =
delete;
44 AutoTransaction(
const SQLConn &conn,
45 TransactionType type = TransactionType::DEFERRED);
46 ~AutoTransaction() {
end(); }
48 AutoTransaction(
const AutoTransaction &) =
delete;
49 AutoTransaction &operator=(
const AutoTransaction &) =
delete;
53 other.m_conn =
nullptr;
56 AutoTransaction &
operator=(AutoTransaction &&other)
noexcept {
59 m_conn = other.m_conn;
60 other.m_conn =
nullptr;
72 operator bool()
const {
return m_conn; }
96 bool open(
const std::filesystem::path &dbFile,
unsigned int flags = 0)
107 bool openDB(
const std::filesystem::path &dbFile,
unsigned int flags = 0) noexcept;
130 bool exec(
const std::string &sql)
const noexcept {
return exec(sql,
"exec failed"); }
138 bool attach(
const std::filesystem::path &dbFile,
139 std::string_view dbName)
const noexcept;
146 bool begin(TransactionType type = TransactionType::DEFERRED)
const noexcept;
152 bool end() const noexcept {
return exec(
"END;",
"db END failed"); }
174 using BindVal = std::variant<std::monostate, int, unsigned, std::string, std::string_view>;
176 using Binding = std::vector<std::pair<std::string, BindVal>>;
178 using Column = std::variant<std::monostate, int, std::string>;
180 using Row = std::vector<Column>;
186 TABLE_TEMPORARY = 1u << 0,
202 using Indices = std::vector<std::pair<std::string, std::string>>;
208 using Statements = std::vector<std::pair<std::reference_wrapper<SQLStmtHolder>, std::string>>;
225 bool bind(
const SQLStmtHolder &ins,
const std::string &key,
226 const BindVal &val,
bool transient =
false) const noexcept;
229 bool transient = false) const noexcept;
231 bool step(const SQLStmtHolder &ins, uint64_t *affected =
nullptr,
232 bool *uniqueError =
nullptr) const noexcept;
235 uint64_t *affected =
nullptr)
const noexcept;
238 std::optional<SQLConn::SelectResult>
243 return cond ? std::move(val) : std::monostate();
259 bool exec(
const std::string &SQL, std::string_view errorMsg,
260 bool includeSQL =
false) const noexcept;
262 static constexpr
bool isUniqueConstraint(
int sqlExtError) noexcept;
263 static
int busyHandler(
void *,
int count);
264 void dumpBinding(const
Binding &binding) const noexcept;
267inline AutoTransaction::AutoTransaction(const
SQLConn &conn, TransactionType type)
268 : m_conn(conn.
begin(type) ? &conn :
nullptr)
Stores a string (usually an error string) to be retrieved later.
Definition LastError.h:87
Begin a transaction in the constructor and end in the destructor.
Definition SQLConn.h:40
void end()
End the transaction manually.
Definition SQLConn.h:272
AutoTransaction & operator=(AutoTransaction &&other) noexcept
Move assignment.
Definition SQLConn.h:56
bool operator!() const
Test whether AutoTransaction is valid.
Definition SQLConn.h:70
AutoTransaction(AutoTransaction &&other) noexcept
Move constructor.
Definition SQLConn.h:52
SQLite3 connection (the core class).
Definition SQLConn.h:80
bool prepareStatement(std::string_view sql, SQLStmtHolder &stmt) const noexcept
Prepate one sql string into stmt.
std::variant< std::monostate, int, unsigned, std::string, std::string_view > BindVal
Bind value (SQL's null, number, string).
Definition SQLConn.h:174
std::variant< std::monostate, int, std::string > Column
One column returned by SELECT.
Definition SQLConn.h:178
SQLHolder sqlHolder
The DB connection.
Definition SQLConn.h:253
virtual bool createDB()
Creates tables, views, triggers and such.
Definition SQLConn.h:115
bool insert(const SQLStmtHolder &ins, const Binding &binding={}, uint64_t *affected=nullptr) const noexcept
Bind, step, and reset the statement ins, using the passed binding.
LastError & setError(int ret, std::string_view error, bool errmsg=false) const
Set last error to ret and error.
bool step(const SQLStmtHolder &ins, uint64_t *affected=nullptr, bool *uniqueError=nullptr) const noexcept
Do one step of the statement ins.
bool createIndices(const Indices &indices) const noexcept
Create indices in the DB as specified in indices.
std::vector< Column > Row
One row returned by SELECT (ie. list of Columns).
Definition SQLConn.h:180
bool createTables(const Tables &tables) const noexcept
Create tables in the DB as specified in tables.
AutoTransaction beginAuto(TransactionType type=TransactionType::DEFERRED) const noexcept
Begin a transaction which is automatically ended when the returned object dies.
Definition SQLConn.h:159
bool attach(const std::filesystem::path &dbFile, std::string_view dbName) const noexcept
Attach another database using ATTACH.
int lastErrorCode() const
Return the last error number.
Definition SQLConn.h:166
SQLConn & operator=(SQLConn &&)=default
Move assignment.
SQLConn(SQLConn &&)=default
Move constructor.
unsigned int m_flags
OpenFlags.
Definition SQLConn.h:255
bool open(const std::filesystem::path &dbFile, unsigned int flags=0)
Open a database connection (openDB() + createDB() + prepDB()).
Definition SQLConn.h:96
std::optional< SQLConn::SelectResult > select(const SQLStmtHolder &sel, const Binding &binding) const noexcept
Perform one SELECT (sel), using the passed binding.
int lastErrorCodeExt() const
Return the last extended error number.
Definition SQLConn.h:168
bool createViews(const Views &views) const noexcept
Create views in the DB as specified in views.
bool openDB(const std::filesystem::path &dbFile, unsigned int flags=0) noexcept
Just open a database file.
bool begin(TransactionType type=TransactionType::DEFERRED) const noexcept
Begin a transaction.
virtual bool prepDB()
Prepares statements.
Definition SQLConn.h:123
std::vector< Row > SelectResult
Complete SELECT result.
Definition SQLConn.h:182
std::vector< std::pair< std::string, std::string > > Indices
Indices to be created by createIndices().
Definition SQLConn.h:202
bool exec(const std::string &sql) const noexcept
Execute sql.
Definition SQLConn.h:130
SlHelpers::LastErrorStream< int, int > LastError
Store a string + 2 ints.
Definition SQLConn.h:247
bool bind(const SQLStmtHolder &ins, const std::string &key, const BindVal &val, bool transient=false) const noexcept
Bind one value val into key of the statement ins.
std::string lastError() const
Return the last error string if some.
Definition SQLConn.h:164
std::vector< TableEntry > Tables
Tables to be created by createTables().
Definition SQLConn.h:200
bool createTriggers(const Triggers &triggers) const noexcept
Create triggers in the DB as specified in triggers.
bool prepareStatements(const Statements &stmts) const noexcept
Prepate all statements as specified in stmts.
static BindVal valueOrNull(bool cond, BindVal val)
A helper to build a null BindVal if cond does not hold, val otherwise.
Definition SQLConn.h:242
Indices Triggers
Triggers to be created by createTriggers().
Definition SQLConn.h:204
Indices Views
Views to be created by createViews().
Definition SQLConn.h:206
TableFlags
Flags for TableEntry::flags.
Definition SQLConn.h:185
std::vector< std::pair< std::string, BindVal > > Binding
Bind name -> bind value.
Definition SQLConn.h:176
bool end() const noexcept
End a transaction.
Definition SQLConn.h:152
std::vector< std::pair< std::reference_wrapper< SQLStmtHolder >, std::string > > Statements
Statements to be prepared by prepareStatements().
Definition SQLConn.h:208
LastError m_lastError
The last error + error code + extended error code.
Definition SQLConn.h:257
A table to be created by createTables().
Definition SQLConn.h:190
unsigned flags
See TableFlags.
Definition SQLConn.h:196
std::string name
Name of the table.
Definition SQLConn.h:192
std::vector< std::string > columns
List of columns.
Definition SQLConn.h:194