/** * Set named attribute. * * @param attr Name of the attribute (must be one of "id", "version", * "changeset", "timestamp", "uid", "visible") * @param value Value of the attribute */ void set_attribute(const char* attr, const char* value) { if (!strcmp(attr, "id")) { set_id(value); } else if (!strcmp(attr, "num_changes")) { set_num_changes(value); } else if (!strcmp(attr, "created_at")) { set_created_at(osmium::Timestamp(value)); } else if (!strcmp(attr, "closed_at")) { set_closed_at(osmium::Timestamp(value)); } else if (!strcmp(attr, "uid")) { set_uid(value); } }
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(); }