diff options
author | louiz’ <louiz@louiz.org> | 2017-06-28 14:42:33 +0200 |
---|---|---|
committer | louiz’ <louiz@louiz.org> | 2017-06-28 14:42:33 +0200 |
commit | c5407cf8ce6add6f3534df41398235e93b605ab3 (patch) | |
tree | f62cccb758dde48270cc24257df36bd3f5f89cf8 /src/database/row.hpp | |
parent | 13a1ab1878fd6312aea485ded3f5bad59c36f17f (diff) | |
parent | b71ca15a0f9114db38eec23b49d1489a2ff1d0ca (diff) | |
download | biboumi-c5407cf8ce6add6f3534df41398235e93b605ab3.tar.gz biboumi-c5407cf8ce6add6f3534df41398235e93b605ab3.tar.bz2 biboumi-c5407cf8ce6add6f3534df41398235e93b605ab3.tar.xz biboumi-c5407cf8ce6add6f3534df41398235e93b605ab3.zip |
Merge branch 'master' into debian
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..e7a58c4 --- /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 = static_cast<Id::real_type>(res); +} + +template <std::size_t N=0, 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=0, 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(this->columns, db); + } + + std::tuple<T...> columns; + std::string table_name; +}; |