#pragma once #include #include #include #include #include template struct Row { Row(std::string name): table_name(std::move(name)) {} template typename Type::real_type& col() { auto&& col = std::get(this->columns); return col.value; } template const auto& col() const { auto&& col = std::get(this->columns); return col.value; } template void save(std::unique_ptr& db, typename std::enable_if && Coucou>::type* = nullptr) { this->insert(*db); } template void save(std::unique_ptr& db, typename std::enable_if && Coucou>::type* = nullptr) { const Id& id = std::get(this->columns); if (id.value == Id::unset_value) { this->insert(*db); if (db->last_inserted_rowid >= 0) std::get(this->columns).value = static_cast(db->last_inserted_rowid); } else this->update(*db); } private: template void insert(DatabaseEngine& db, typename std::enable_if && Coucou>::type* = nullptr) { InsertQuery query(this->table_name, this->columns); // Ugly workaround for non portable stuff query.body += db.get_returning_id_sql_string(Id::name); query.execute(db, this->columns); } template void insert(DatabaseEngine& db, typename std::enable_if && Coucou>::type* = nullptr) { InsertQuery query(this->table_name, this->columns); query.execute(db, this->columns); } void update(DatabaseEngine& db) { UpdateQuery query(this->table_name, this->columns); query.execute(db, this->columns); } public: std::tuple columns; std::string table_name; };