X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=futatabi%2Fdb.cpp;h=636b63ea54b8faf5b7d414738ef8775fbdf6a455;hb=575f6eb1b052bb1291987753b1a8cccc7f1e3ab3;hp=fb6694be3a2f2c729edefedcd3d923a9a4ca2209;hpb=349d4a72ef75bb7b6fa3bfd8498857bf0559285f;p=nageru diff --git a/futatabi/db.cpp b/futatabi/db.cpp index fb6694b..636b63e 100644 --- a/futatabi/db.cpp +++ b/futatabi/db.cpp @@ -15,21 +15,37 @@ 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. + )", + 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. + )", + 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; - )", nullptr, nullptr, nullptr); // Ignore errors. + )", + nullptr, nullptr, nullptr); // Ignore errors. sqlite3_exec(db, R"( DROP TABLE frame; - )", nullptr, nullptr, nullptr); // Ignore errors. + )", + nullptr, nullptr, nullptr); // Ignore errors. sqlite3_exec(db, R"( CREATE TABLE IF NOT EXISTS filev2 ( @@ -38,7 +54,8 @@ DB::DB(const string &filename) size BIGINT NOT NULL, frames BLOB NOT NULL ); - )", nullptr, nullptr, nullptr); // Ignore errors. + )", + nullptr, nullptr, nullptr); // Ignore errors. sqlite3_exec(db, "PRAGMA journal_mode=WAL", nullptr, nullptr, nullptr); // Ignore errors. sqlite3_exec(db, "PRAGMA synchronous=NORMAL", nullptr, nullptr, nullptr); // Ignore errors. @@ -87,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); } @@ -104,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); } @@ -164,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); } @@ -181,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); } @@ -257,26 +262,6 @@ void DB::store_frame_file(const string &filename, size_t size, const vector seen_stream_idx; // Usually only one. @@ -302,7 +287,7 @@ void DB::store_frame_file(const string &filename, size_t size, const vector &used_filenames) ret = sqlite3_exec(db, R"( CREATE TEMPORARY TABLE used_filenames ( filename VARCHAR NOT NULL PRIMARY KEY ) - )", nullptr, nullptr, nullptr); + )", + nullptr, nullptr, nullptr); if (ret != SQLITE_OK) { fprintf(stderr, "CREATE TEMPORARY TABLE: %s\n", sqlite3_errmsg(db)); @@ -381,7 +367,8 @@ void DB::clean_unused_frame_files(const vector &used_filenames) ret = sqlite3_exec(db, R"( DELETE FROM filev2 WHERE filename NOT IN ( SELECT filename FROM used_filenames ) - )", nullptr, nullptr, nullptr); + )", + nullptr, nullptr, nullptr); if (ret != SQLITE_OK) { fprintf(stderr, "DELETE: %s\n", sqlite3_errmsg(db)); @@ -390,7 +377,8 @@ void DB::clean_unused_frame_files(const vector &used_filenames) ret = sqlite3_exec(db, R"( DROP TABLE used_filenames - )", nullptr, nullptr, nullptr); + )", + nullptr, nullptr, nullptr); if (ret != SQLITE_OK) { fprintf(stderr, "DROP TABLE: %s\n", sqlite3_errmsg(db));