#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; };