diff options
| author | Carl Hetherington <cth@carlh.net> | 2023-05-20 22:51:49 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2024-05-06 20:42:50 +0200 |
| commit | a3fcbb3a76e079a5485a0552ea5d35b8d6739116 (patch) | |
| tree | 58f6476b7197c0e32b5aa3d52d0859a9b04db268 /src/lib/sqlite_statement.cc | |
| parent | a4105c6e8dc83407abc9b12e80c958673c942888 (diff) | |
Use sqlite for cinema and DKDM recipient lists.
Diffstat (limited to 'src/lib/sqlite_statement.cc')
| -rw-r--r-- | src/lib/sqlite_statement.cc | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/lib/sqlite_statement.cc b/src/lib/sqlite_statement.cc new file mode 100644 index 000000000..b3ec1fb81 --- /dev/null +++ b/src/lib/sqlite_statement.cc @@ -0,0 +1,111 @@ +/* + Copyright (C) 2023 Carl Hetherington <cth@carlh.net> + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>. + +*/ + + +#include "exceptions.h" +#include "sqlite_statement.h" + + +using std::function; +using std::string; + + +SQLiteStatement::SQLiteStatement(sqlite3* db, string const& statement) + : _db(db) +{ +#ifdef DCPOMATIC_HAVE_SQLITE3_PREPARE_V3 + auto rc = sqlite3_prepare_v3(_db, statement.c_str(), -1, 0, &_stmt, nullptr); +#else + auto rc = sqlite3_prepare_v2(_db, statement.c_str(), -1, &_stmt, nullptr); +#endif + if (rc != SQLITE_OK) { + throw SQLError(_db, rc, statement); + } +} + + +SQLiteStatement::~SQLiteStatement() +{ + sqlite3_finalize(_stmt); +} + + +void +SQLiteStatement::bind_text(int index, string const& value) +{ + auto rc = sqlite3_bind_text(_stmt, index, value.c_str(), -1, SQLITE_TRANSIENT); + if (rc != SQLITE_OK) { + throw SQLError(_db, rc); + } +} + + +void +SQLiteStatement::bind_int64(int index, int64_t value) +{ + auto rc = sqlite3_bind_int64(_stmt, index, value); + if (rc != SQLITE_OK) { + throw SQLError(_db, rc); + } +} + + +void +SQLiteStatement::execute(function<void(SQLiteStatement&)> row, function<void()> busy) +{ + while (true) { + auto const rc = sqlite3_step(_stmt); + switch (rc) { + case SQLITE_BUSY: + busy(); + break; + case SQLITE_DONE: + return; + case SQLITE_ROW: + row(*this); + break; + case SQLITE_ERROR: + case SQLITE_MISUSE: + throw SQLError(_db, sqlite3_errmsg(_db)); + } + } +} + + +int +SQLiteStatement::data_count() +{ + return sqlite3_data_count(_stmt); +} + + +int64_t +SQLiteStatement::column_int64(int index) +{ + return sqlite3_column_int64(_stmt, index); +} + + +string +SQLiteStatement::column_text(int index) +{ + return reinterpret_cast<const char*>(sqlite3_column_text(_stmt, index)); +} + |
