[core] Eliminate macros in sqlite3.cpp
This commit is contained in:
@@ -80,16 +80,6 @@ Statement::Statement(sqlite3 *db, const char *sql) {
|
||||
}
|
||||
}
|
||||
|
||||
#define CHECK_SQLITE_OK_STMT(err, stmt) \
|
||||
if (err != SQLITE_OK) { \
|
||||
throw Exception { err, sqlite3_errmsg(sqlite3_db_handle(stmt)) }; \
|
||||
}
|
||||
|
||||
#define CHECK_SQLITE_OK(err) \
|
||||
if (err != SQLITE_OK) { \
|
||||
throw Exception { err, sqlite3_errstr(err) }; \
|
||||
}
|
||||
|
||||
Statement::Statement(Statement &&other) {
|
||||
*this = std::move(other);
|
||||
}
|
||||
@@ -109,38 +99,41 @@ Statement::operator bool() const {
|
||||
return stmt != nullptr;
|
||||
}
|
||||
|
||||
#define BIND_3(type, value, stmt) \
|
||||
assert(stmt); \
|
||||
const int err = sqlite3_bind_##type(stmt, offset, value); \
|
||||
CHECK_SQLITE_OK_STMT(err, stmt)
|
||||
|
||||
#define BIND_5(type, value, length, param, stmt) \
|
||||
assert(stmt); \
|
||||
const int err = sqlite3_bind_##type(stmt, offset, value, length, param); \
|
||||
CHECK_SQLITE_OK_STMT(err, stmt)
|
||||
void Statement::check(int err) {
|
||||
if (err != SQLITE_OK) {
|
||||
throw Exception { err, sqlite3_errmsg(sqlite3_db_handle(stmt)) };
|
||||
}
|
||||
}
|
||||
|
||||
template <> void Statement::bind(int offset, int value) {
|
||||
BIND_3(int, value, stmt)
|
||||
assert(stmt);
|
||||
check(sqlite3_bind_int(stmt, offset, value));
|
||||
}
|
||||
|
||||
template <> void Statement::bind(int offset, int64_t value) {
|
||||
BIND_3(int64, value, stmt)
|
||||
assert(stmt);
|
||||
check(sqlite3_bind_int64(stmt, offset, value));
|
||||
}
|
||||
|
||||
template <> void Statement::bind(int offset, double value) {
|
||||
BIND_3(double, value, stmt)
|
||||
assert(stmt);
|
||||
check(sqlite3_bind_double(stmt, offset, value));
|
||||
}
|
||||
|
||||
template <> void Statement::bind(int offset, bool value) {
|
||||
BIND_3(int, value, stmt)
|
||||
assert(stmt);
|
||||
check(sqlite3_bind_int(stmt, offset, value));
|
||||
}
|
||||
|
||||
template <> void Statement::bind(int offset, const char *value) {
|
||||
BIND_5(text, value, -1, nullptr, stmt)
|
||||
assert(stmt);
|
||||
check(sqlite3_bind_text(stmt, offset, value, -1, SQLITE_STATIC));
|
||||
}
|
||||
|
||||
void Statement::bind(int offset, const std::string &value, bool retain) {
|
||||
BIND_5(blob, value.data(), int(value.size()), retain ? SQLITE_TRANSIENT : SQLITE_STATIC, stmt)
|
||||
assert(stmt);
|
||||
check(sqlite3_bind_blob(stmt, offset, value.data(), int(value.size()),
|
||||
retain ? SQLITE_TRANSIENT : SQLITE_STATIC));
|
||||
}
|
||||
|
||||
bool Statement::run() {
|
||||
@@ -150,8 +143,9 @@ bool Statement::run() {
|
||||
return false;
|
||||
} else if (err == SQLITE_ROW) {
|
||||
return true;
|
||||
} else if (err != SQLITE_OK) {
|
||||
throw Exception { err, sqlite3_errmsg(sqlite3_db_handle(stmt)) };
|
||||
} else {
|
||||
CHECK_SQLITE_OK_STMT(err, stmt)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user