Exemplo n.º 1
0
void Game::after_update()
{
    after_save();
}
Exemplo 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();
}