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.
This commit is contained in:
@@ -16,8 +16,18 @@ Database::IrcChannelOptionsTable Database::irc_channel_options("IrcChannelOption
|
|||||||
|
|
||||||
void Database::open(const std::string& filename)
|
void Database::open(const std::string& filename)
|
||||||
{
|
{
|
||||||
auto res = sqlite3_open_v2(filename.data(), &Database::db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, nullptr);
|
// Try to open the specified database.
|
||||||
log_debug("open: ", res);
|
// 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.create(Database::db);
|
||||||
Database::muc_log_lines.upgrade(Database::db);
|
Database::muc_log_lines.upgrade(Database::db);
|
||||||
Database::global_options.create(Database::db);
|
Database::global_options.create(Database::db);
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ void open_database()
|
|||||||
#ifdef USE_DATABASE
|
#ifdef USE_DATABASE
|
||||||
const auto db_filename = Config::get("db_name", xdg_data_path("biboumi.sqlite"));
|
const auto db_filename = Config::get("db_name", xdg_data_path("biboumi.sqlite"));
|
||||||
log_info("Opening database: ", db_filename);
|
log_info("Opening database: ", db_filename);
|
||||||
Database::close();
|
|
||||||
Database::open(db_filename);
|
Database::open(db_filename);
|
||||||
log_info("database successfully opened.");
|
log_info("database successfully opened.");
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user