~singpolyma/biboumi

4d55a120d8fa5564a439102ab97b43da589bf4f3 — louiz’ 5 years ago 651caab
Re-implement correctly the handling of failure to open the database

If we can’t open it at startup, we exit.
If we can’t open it on reload, we keep the previously-opened database.

This way, we’re assured to always have a valid and open database available.
2 files changed, 12 insertions(+), 3 deletions(-)

M src/database/database.cpp
M src/utils/reload.cpp
M src/database/database.cpp => src/database/database.cpp +12 -2
@@ 16,8 16,18 @@ Database::IrcChannelOptionsTable Database::irc_channel_options("IrcChannelOption

void Database::open(const std::string& filename)
{
  auto res = sqlite3_open_v2(filename.data(), &Database::db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, nullptr);
  log_debug("open: ", res);
  // Try to open the specified database.
  // Close and replace the previous database pointer if it succeeded. If it did
  // not, just leave things untouched
  sqlite3* new_db;
  auto res = sqlite3_open_v2(filename.data(), &new_db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, nullptr);
  if (res != SQLITE_OK)
    {
      log_error("Failed to open database file ", filename, ": ", sqlite3_errmsg(Database::db));
      throw std::runtime_error("");
    }
  Database::close();
  Database::db = new_db;
  Database::muc_log_lines.create(Database::db);
  Database::muc_log_lines.upgrade(Database::db);
  Database::global_options.create(Database::db);

M src/utils/reload.cpp => src/utils/reload.cpp +0 -1
@@ 11,7 11,6 @@ void open_database()
#ifdef USE_DATABASE
  const auto db_filename = Config::get("db_name", xdg_data_path("biboumi.sqlite"));
  log_info("Opening database: ", db_filename);
  Database::close();
  Database::open(db_filename);
  log_info("database successfully opened.");
#endif