Esempio n. 1
0
 /**
  * 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);
     }
 }
Esempio n. 2
0
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();
}