From 50cadf3dac0d56ef8181d1800cc30f8dcb749141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Tue, 13 Jun 2017 10:38:39 +0200 Subject: Implement our own database ORM, and update the whole code to use it Entirely replace LiteSQL fix #3271 --- src/database/row.hpp | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/database/row.hpp (limited to 'src/database/row.hpp') diff --git a/src/database/row.hpp b/src/database/row.hpp new file mode 100644 index 0000000..ca686c1 --- /dev/null +++ b/src/database/row.hpp @@ -0,0 +1,75 @@ +#pragma once + +#include +#include + +#include + +#include + +template +typename std::enable_if, Id>::value, void>::type +update_id(std::tuple&, sqlite3*) +{} + +template +typename std::enable_if, Id>::value, void>::type +update_id(std::tuple& columns, sqlite3* db) +{ + auto&& column = std::get(columns); + log_debug("Found an autoincrement col."); + auto res = sqlite3_last_insert_rowid(db); + log_debug("Value is now: ", res); + column.value = res; +} + +template +typename std::enable_if::type +update_autoincrement_id(std::tuple& columns, sqlite3* db) +{ + using ColumnType = typename std::remove_reference(columns))>::type; + update_id(columns, db); + update_autoincrement_id(columns, db); +} + +template +typename std::enable_if::type +update_autoincrement_id(std::tuple&, sqlite3*) +{} + +template +struct Row +{ + Row(std::string name): + table_name(std::move(name)) + {} + + template + auto& col() + { + auto&& col = std::get(this->columns); + return col.value; + } + + template + const auto& col() const + { + auto&& col = std::get(this->columns); + return col.value; + } + + void save(sqlite3* db) + { + InsertQuery query(this->table_name); + query.insert_col_names(this->columns); + query.insert_values(this->columns); + log_debug(query.body); + + query.execute(this->columns, db); + + update_autoincrement_id<0>(this->columns, db); + } + + std::tuple columns; + std::string table_name; +}; -- cgit v1.2.3