void Game::after_update() { after_save(); }
Status Base::save() { if (_connection == nullptr) { return Status::status_ailment(); } before_save(); set_updated_at(); fmt::MemoryWriter buf; if (_new_record) { before_create(); set_created_at(); buf << "INSERT INTO " << table_name() << " ("; std::vector<std::tuple<std::string, std::string> > values; for (auto &one : _fields) { if (one.first == "id") continue; values.push_back(std::make_tuple(one.first, one.second)); } auto size = values.size(); for (auto &one : values) { size -= 1; buf << std::get<0>(one); if (0 < size) { buf << ", "; } } buf << ") VALUES ("; size = values.size(); for (auto &one : values) { size -= 1; buf << "'" << std::get<1>(one) << "'"; if (0 < size) { buf << ", "; } } buf << ");"; } else { before_update(); buf << "UPDATE " << table_name() << " SET "; auto size = _dirty_keys.size(); for (auto &key : _dirty_keys) { size -= 1; buf << key << " = '" << _fields[key] << "'"; if (0 < size) { buf << ", "; } } buf << " WHERE id = " << _fields["id"]; } _connection->execute_sql(buf.str()); if (_new_record) { auto id = _connection->last_row_id(); _set_field("id", fmt::format("{0}", id)); after_create(); } else { after_update(); } after_save(); return Status::ok(); }