summaryrefslogtreecommitdiff
path: root/src/database/insert_query.hpp
diff options
context:
space:
mode:
authorlouiz’ <louiz@louiz.org>2017-06-14 00:04:00 +0200
committerlouiz’ <louiz@louiz.org>2017-06-14 00:19:15 +0200
commit9defd0ccb75b1905c308ed0437e5ccd479e3a7b8 (patch)
tree7726599198a59da5ffc486d35a372a77c6fd87aa /src/database/insert_query.hpp
parent41c23aab37905a97007d095c3997a0d0a9dfddda (diff)
downloadbiboumi-9defd0ccb75b1905c308ed0437e5ccd479e3a7b8.tar.gz
biboumi-9defd0ccb75b1905c308ed0437e5ccd479e3a7b8.tar.bz2
biboumi-9defd0ccb75b1905c308ed0437e5ccd479e3a7b8.tar.xz
biboumi-9defd0ccb75b1905c308ed0437e5ccd479e3a7b8.zip
Add a Statement class to manage the sqlite3_stmt objects and avoid leaks
Diffstat (limited to 'src/database/insert_query.hpp')
-rw-r--r--src/database/insert_query.hpp17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/database/insert_query.hpp b/src/database/insert_query.hpp
index 00b77c5..1712916 100644
--- a/src/database/insert_query.hpp
+++ b/src/database/insert_query.hpp
@@ -1,5 +1,6 @@
#pragma once
+#include <database/statement.hpp>
#include <database/column.hpp>
#include <database/query.hpp>
#include <logger/logger.hpp>
@@ -13,11 +14,11 @@
template <int N, typename ColumnType, typename... T>
typename std::enable_if<!std::is_same<std::decay_t<ColumnType>, Id>::value, void>::type
-actual_bind(sqlite3_stmt* statement, std::vector<std::string>& params, const std::tuple<T...>&)
+actual_bind(Statement& statement, std::vector<std::string>& params, const std::tuple<T...>&)
{
const auto value = params.front();
params.erase(params.begin());
- if (sqlite3_bind_text(statement, N + 1, value.data(), static_cast<int>(value.size()), SQLITE_TRANSIENT) != SQLITE_OK)
+ if (sqlite3_bind_text(statement.get(), N + 1, value.data(), static_cast<int>(value.size()), SQLITE_TRANSIENT) != SQLITE_OK)
log_error("Failed to bind ", value, " to param ", N);
else
log_debug("Bound (not id) [", value, "] to ", N);
@@ -25,15 +26,15 @@ actual_bind(sqlite3_stmt* statement, std::vector<std::string>& params, const std
template <int N, typename ColumnType, typename... T>
typename std::enable_if<std::is_same<std::decay_t<ColumnType>, Id>::value, void>::type
-actual_bind(sqlite3_stmt* statement, std::vector<std::string>&, const std::tuple<T...>& columns)
+actual_bind(Statement& statement, std::vector<std::string>&, const std::tuple<T...>& columns)
{
auto&& column = std::get<Id>(columns);
if (column.value != 0)
{
- if (sqlite3_bind_int64(statement, N + 1, column.value) != SQLITE_OK)
+ if (sqlite3_bind_int64(statement.get(), N + 1, column.value) != SQLITE_OK)
log_error("Failed to bind ", column.value, " to id.");
}
- else if (sqlite3_bind_null(statement, N + 1) != SQLITE_OK)
+ else if (sqlite3_bind_null(statement.get(), N + 1) != SQLITE_OK)
log_error("Failed to bind NULL to param ", N);
else
log_debug("Bound NULL to ", N);
@@ -53,14 +54,14 @@ struct InsertQuery: public Query
auto statement = this->prepare(db);
{
this->bind_param<0>(columns, statement);
- if (sqlite3_step(statement) != SQLITE_DONE)
+ if (sqlite3_step(statement.get()) != SQLITE_DONE)
log_error("Failed to execute query: ", sqlite3_errmsg(db));
}
}
template <int N, typename... T>
typename std::enable_if<N < sizeof...(T), void>::type
- bind_param(const std::tuple<T...>& columns, sqlite3_stmt* statement)
+ bind_param(const std::tuple<T...>& columns, Statement& statement)
{
using ColumnType = typename std::remove_reference<decltype(std::get<N>(columns))>::type;
@@ -70,7 +71,7 @@ struct InsertQuery: public Query
template <int N, typename... T>
typename std::enable_if<N == sizeof...(T), void>::type
- bind_param(const std::tuple<T...>&, sqlite3_stmt*)
+ bind_param(const std::tuple<T...>&, Statement&)
{}
template <typename... T>