]> git.sesse.net Git - nageru/blobdiff - futatabi/db.cpp
On errors, abort() instead of exit(1); exit() in a multithreaded program just gives...
[nageru] / futatabi / db.cpp
index 636b63ea54b8faf5b7d414738ef8775fbdf6a455..6764f84ce54aad90d1e82df50c5862d243b270da 100644 (file)
@@ -12,7 +12,7 @@ DB::DB(const string &filename)
        int ret = sqlite3_open(filename.c_str(), &db);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "%s: %s\n", filename.c_str(), sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        // Set an effectively infinite timeout for waiting for write locks;
@@ -20,7 +20,7 @@ DB::DB(const string &filename)
        ret = sqlite3_busy_timeout(db, 3600000);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "sqlite3_busy_timeout: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        sqlite3_exec(db, R"(
@@ -69,7 +69,7 @@ StateProto DB::get_state()
        int ret = sqlite3_prepare_v2(db, "SELECT state FROM state", -1, &stmt, 0);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_step(stmt);
@@ -77,17 +77,17 @@ StateProto DB::get_state()
                bool ok = state.ParseFromArray(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0));
                if (!ok) {
                        fprintf(stderr, "State in database is corrupted!\n");
-                       exit(1);
+                       abort();
                }
        } else if (ret != SQLITE_DONE) {
                fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_finalize(stmt);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        return state;
@@ -101,14 +101,14 @@ void DB::store_state(const StateProto &state)
        int ret = sqlite3_exec(db, "BEGIN", nullptr, nullptr, nullptr);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "BEGIN: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        sqlite3_stmt *stmt;
        ret = sqlite3_prepare_v2(db, "REPLACE INTO state VALUES (?)", -1, &stmt, 0);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "REPLACE prepare: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        sqlite3_bind_blob(stmt, 1, serialized.data(), serialized.size(), SQLITE_STATIC);
@@ -116,19 +116,19 @@ void DB::store_state(const StateProto &state)
        ret = sqlite3_step(stmt);
        if (ret == SQLITE_ROW) {
                fprintf(stderr, "REPLACE step: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_finalize(stmt);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "REPLACE finalize: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_exec(db, "COMMIT", nullptr, nullptr, nullptr);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "COMMIT: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 }
 
@@ -140,7 +140,7 @@ SettingsProto DB::get_settings()
        int ret = sqlite3_prepare_v2(db, "SELECT settings FROM settings", -1, &stmt, 0);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_step(stmt);
@@ -148,17 +148,17 @@ SettingsProto DB::get_settings()
                bool ok = settings.ParseFromArray(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0));
                if (!ok) {
                        fprintf(stderr, "State in database is corrupted!\n");
-                       exit(1);
+                       abort();
                }
        } else if (ret != SQLITE_DONE) {
                fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_finalize(stmt);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        return settings;
@@ -172,14 +172,14 @@ void DB::store_settings(const SettingsProto &settings)
        int ret = sqlite3_exec(db, "BEGIN", nullptr, nullptr, nullptr);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "BEGIN: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        sqlite3_stmt *stmt;
        ret = sqlite3_prepare_v2(db, "REPLACE INTO settings VALUES (?)", -1, &stmt, 0);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "REPLACE prepare: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        sqlite3_bind_blob(stmt, 1, serialized.data(), serialized.size(), SQLITE_STATIC);
@@ -187,19 +187,19 @@ void DB::store_settings(const SettingsProto &settings)
        ret = sqlite3_step(stmt);
        if (ret == SQLITE_ROW) {
                fprintf(stderr, "REPLACE step: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_finalize(stmt);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "REPLACE finalize: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_exec(db, "COMMIT", nullptr, nullptr, nullptr);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "COMMIT: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 }
 
@@ -211,7 +211,7 @@ vector<DB::FrameOnDiskAndStreamIdx> DB::load_frame_file(const string &filename,
        int ret = sqlite3_prepare_v2(db, "SELECT frames FROM filev2 WHERE filename=? AND size=?", -1, &stmt, 0);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "SELECT prepare: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        sqlite3_bind_text(stmt, 1, filename.data(), filename.size(), SQLITE_STATIC);
@@ -222,17 +222,17 @@ vector<DB::FrameOnDiskAndStreamIdx> DB::load_frame_file(const string &filename,
                bool ok = file_contents.ParseFromArray(sqlite3_column_blob(stmt, 0), sqlite3_column_bytes(stmt, 0));
                if (!ok) {
                        fprintf(stderr, "Frame list in database is corrupted!\n");
-                       exit(1);
+                       abort();
                }
        } else if (ret != SQLITE_DONE) {
                fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_finalize(stmt);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        vector<FrameOnDiskAndStreamIdx> frames;
@@ -256,7 +256,7 @@ void DB::store_frame_file(const string &filename, size_t size, const vector<Fram
        int ret = sqlite3_exec(db, "BEGIN", nullptr, nullptr, nullptr);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "BEGIN: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        // Delete any existing instances with this filename.
@@ -290,7 +290,7 @@ void DB::store_frame_file(const string &filename, size_t size, const vector<Fram
        ret = sqlite3_prepare_v2(db, "REPLACE INTO filev2 (filename, size, frames) VALUES (?, ?, ?)", -1, &stmt, 0);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "INSERT prepare: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        sqlite3_bind_text(stmt, 1, filename.data(), filename.size(), SQLITE_STATIC);
@@ -300,20 +300,20 @@ void DB::store_frame_file(const string &filename, size_t size, const vector<Fram
        ret = sqlite3_step(stmt);
        if (ret == SQLITE_ROW) {
                fprintf(stderr, "REPLACE step: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_finalize(stmt);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "REPLACE finalize: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        // Commit.
        ret = sqlite3_exec(db, "COMMIT", nullptr, nullptr, nullptr);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "COMMIT: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 }
 
@@ -322,7 +322,7 @@ void DB::clean_unused_frame_files(const vector<string> &used_filenames)
        int ret = sqlite3_exec(db, "BEGIN", nullptr, nullptr, nullptr);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "BEGIN: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_exec(db, R"(
@@ -332,7 +332,7 @@ void DB::clean_unused_frame_files(const vector<string> &used_filenames)
 
        if (ret != SQLITE_OK) {
                fprintf(stderr, "CREATE TEMPORARY TABLE: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        // Insert the new rows.
@@ -340,7 +340,7 @@ void DB::clean_unused_frame_files(const vector<string> &used_filenames)
        ret = sqlite3_prepare_v2(db, "INSERT INTO used_filenames (filename) VALUES (?)", -1, &stmt, 0);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "INSERT prepare: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        for (const string &filename : used_filenames) {
@@ -349,20 +349,20 @@ void DB::clean_unused_frame_files(const vector<string> &used_filenames)
                ret = sqlite3_step(stmt);
                if (ret == SQLITE_ROW) {
                        fprintf(stderr, "INSERT step: %s\n", sqlite3_errmsg(db));
-                       exit(1);
+                       abort();
                }
 
                ret = sqlite3_reset(stmt);
                if (ret == SQLITE_ROW) {
                        fprintf(stderr, "INSERT reset: %s\n", sqlite3_errmsg(db));
-                       exit(1);
+                       abort();
                }
        }
 
        ret = sqlite3_finalize(stmt);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "INSERT finalize: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_exec(db, R"(
@@ -372,7 +372,7 @@ void DB::clean_unused_frame_files(const vector<string> &used_filenames)
 
        if (ret != SQLITE_OK) {
                fprintf(stderr, "DELETE: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        ret = sqlite3_exec(db, R"(
@@ -382,13 +382,13 @@ void DB::clean_unused_frame_files(const vector<string> &used_filenames)
 
        if (ret != SQLITE_OK) {
                fprintf(stderr, "DROP TABLE: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 
        // Commit.
        ret = sqlite3_exec(db, "COMMIT", nullptr, nullptr, nullptr);
        if (ret != SQLITE_OK) {
                fprintf(stderr, "COMMIT: %s\n", sqlite3_errmsg(db));
-               exit(1);
+               abort();
        }
 }