diff options
author | louiz’ <louiz@louiz.org> | 2017-06-13 10:38:39 +0200 |
---|---|---|
committer | louiz’ <louiz@louiz.org> | 2017-06-14 00:19:15 +0200 |
commit | 50cadf3dac0d56ef8181d1800cc30f8dcb749141 (patch) | |
tree | 23e56307a6fba4f926d261f858c8df8b6b8d5ea7 /src/database/row.hpp | |
parent | 7ca95a09740297ae9c041c5f8ae4caa0a57a149a (diff) | |
download | biboumi-50cadf3dac0d56ef8181d1800cc30f8dcb749141.tar.gz biboumi-50cadf3dac0d56ef8181d1800cc30f8dcb749141.tar.bz2 biboumi-50cadf3dac0d56ef8181d1800cc30f8dcb749141.tar.xz biboumi-50cadf3dac0d56ef8181d1800cc30f8dcb749141.zip |
Implement our own database ORM, and update the whole code to use it
Entirely replace LiteSQL
fix #3271
Diffstat (limited to 'src/database/row.hpp')
-rw-r--r-- | src/database/row.hpp | 75 |
1 files changed, 75 insertions, 0 deletions
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 <database/insert_query.hpp> +#include <logger/logger.hpp> + +#include <type_traits> + +#include <sqlite3.h> + +template <typename ColumnType, typename... T> +typename std::enable_if<!std::is_same<std::decay_t<ColumnType>, Id>::value, void>::type +update_id(std::tuple<T...>&, sqlite3*) +{} + +template <typename ColumnType, typename... T> +typename std::enable_if<std::is_same<std::decay_t<ColumnType>, Id>::value, void>::type +update_id(std::tuple<T...>& columns, sqlite3* db) +{ + auto&& column = std::get<ColumnType>(columns); + log_debug("Found an autoincrement col."); + auto res = sqlite3_last_insert_rowid(db); + log_debug("Value is now: ", res); + column.value = res; +} + +template <std::size_t N, typename... T> +typename std::enable_if<N < sizeof...(T), void>::type +update_autoincrement_id(std::tuple<T...>& columns, sqlite3* db) +{ + using ColumnType = typename std::remove_reference<decltype(std::get<N>(columns))>::type; + update_id<ColumnType>(columns, db); + update_autoincrement_id<N+1>(columns, db); +} + +template <std::size_t N, typename... T> +typename std::enable_if<N == sizeof...(T), void>::type +update_autoincrement_id(std::tuple<T...>&, sqlite3*) +{} + +template <typename... T> +struct Row +{ + Row(std::string name): + table_name(std::move(name)) + {} + + template <typename Type> + auto& col() + { + auto&& col = std::get<Type>(this->columns); + return col.value; + } + + template <typename Type> + const auto& col() const + { + auto&& col = std::get<Type>(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<T...> columns; + std::string table_name; +}; |