]> git.sesse.net Git - nageru/blobdiff - futatabi/db.cpp
Move to one JPEG decoder thread per view.
[nageru] / futatabi / db.cpp
index 33d88d4f369e2819a585a32fb771f99d8ffccef8..636b63ea54b8faf5b7d414738ef8775fbdf6a455 100644 (file)
@@ -15,16 +15,28 @@ DB::DB(const string &filename)
                exit(1);
        }
 
+       // Set an effectively infinite timeout for waiting for write locks;
+       // if we get SQLITE_LOCKED, we just exit out, so this is much better.
+       ret = sqlite3_busy_timeout(db, 3600000);
+       if (ret != SQLITE_OK) {
+               fprintf(stderr, "sqlite3_busy_timeout: %s\n", sqlite3_errmsg(db));
+               exit(1);
+       }
+
        sqlite3_exec(db, R"(
                CREATE TABLE IF NOT EXISTS state (state BLOB);
        )",
                     nullptr, nullptr, nullptr);  // Ignore errors.
 
+       sqlite3_exec(db, "CREATE UNIQUE INDEX only_one_state ON state (1);", nullptr, nullptr, nullptr);  // Ignore errors.
+
        sqlite3_exec(db, R"(
                CREATE TABLE IF NOT EXISTS settings (settings BLOB);
        )",
                     nullptr, nullptr, nullptr);  // Ignore errors.
 
+       sqlite3_exec(db, "CREATE UNIQUE INDEX only_one_settings ON settings (1);", nullptr, nullptr, nullptr);  // Ignore errors.
+
        sqlite3_exec(db, R"(
                DROP TABLE file;
        )",
@@ -92,16 +104,10 @@ void DB::store_state(const StateProto &state)
                exit(1);
        }
 
-       ret = sqlite3_exec(db, "DELETE FROM state", nullptr, nullptr, nullptr);
-       if (ret != SQLITE_OK) {
-               fprintf(stderr, "DELETE: %s\n", sqlite3_errmsg(db));
-               exit(1);
-       }
-
        sqlite3_stmt *stmt;
-       ret = sqlite3_prepare_v2(db, "INSERT INTO state VALUES (?)", -1, &stmt, 0);
+       ret = sqlite3_prepare_v2(db, "REPLACE INTO state VALUES (?)", -1, &stmt, 0);
        if (ret != SQLITE_OK) {
-               fprintf(stderr, "INSERT prepare: %s\n", sqlite3_errmsg(db));
+               fprintf(stderr, "REPLACE prepare: %s\n", sqlite3_errmsg(db));
                exit(1);
        }
 
@@ -109,13 +115,13 @@ void DB::store_state(const StateProto &state)
 
        ret = sqlite3_step(stmt);
        if (ret == SQLITE_ROW) {
-               fprintf(stderr, "INSERT step: %s\n", sqlite3_errmsg(db));
+               fprintf(stderr, "REPLACE step: %s\n", sqlite3_errmsg(db));
                exit(1);
        }
 
        ret = sqlite3_finalize(stmt);
        if (ret != SQLITE_OK) {
-               fprintf(stderr, "INSERT finalize: %s\n", sqlite3_errmsg(db));
+               fprintf(stderr, "REPLACE finalize: %s\n", sqlite3_errmsg(db));
                exit(1);
        }
 
@@ -169,16 +175,10 @@ void DB::store_settings(const SettingsProto &settings)
                exit(1);
        }
 
-       ret = sqlite3_exec(db, "DELETE FROM settings", nullptr, nullptr, nullptr);
-       if (ret != SQLITE_OK) {
-               fprintf(stderr, "DELETE: %s\n", sqlite3_errmsg(db));
-               exit(1);
-       }
-
        sqlite3_stmt *stmt;
-       ret = sqlite3_prepare_v2(db, "INSERT INTO settings VALUES (?)", -1, &stmt, 0);
+       ret = sqlite3_prepare_v2(db, "REPLACE INTO settings VALUES (?)", -1, &stmt, 0);
        if (ret != SQLITE_OK) {
-               fprintf(stderr, "INSERT prepare: %s\n", sqlite3_errmsg(db));
+               fprintf(stderr, "REPLACE prepare: %s\n", sqlite3_errmsg(db));
                exit(1);
        }
 
@@ -186,13 +186,13 @@ void DB::store_settings(const SettingsProto &settings)
 
        ret = sqlite3_step(stmt);
        if (ret == SQLITE_ROW) {
-               fprintf(stderr, "INSERT step: %s\n", sqlite3_errmsg(db));
+               fprintf(stderr, "REPLACE step: %s\n", sqlite3_errmsg(db));
                exit(1);
        }
 
        ret = sqlite3_finalize(stmt);
        if (ret != SQLITE_OK) {
-               fprintf(stderr, "INSERT finalize: %s\n", sqlite3_errmsg(db));
+               fprintf(stderr, "REPLACE finalize: %s\n", sqlite3_errmsg(db));
                exit(1);
        }
 
@@ -299,13 +299,13 @@ void DB::store_frame_file(const string &filename, size_t size, const vector<Fram
 
        ret = sqlite3_step(stmt);
        if (ret == SQLITE_ROW) {
-               fprintf(stderr, "INSERT step: %s\n", sqlite3_errmsg(db));
+               fprintf(stderr, "REPLACE step: %s\n", sqlite3_errmsg(db));
                exit(1);
        }
 
        ret = sqlite3_finalize(stmt);
        if (ret != SQLITE_OK) {
-               fprintf(stderr, "INSERT finalize: %s\n", sqlite3_errmsg(db));
+               fprintf(stderr, "REPLACE finalize: %s\n", sqlite3_errmsg(db));
                exit(1);
        }