]> git.sesse.net Git - nageru/commitdiff
Use REPLACE instead of INSERT for changing state and settings.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 9 Mar 2019 17:41:34 +0000 (18:41 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sat, 9 Mar 2019 17:41:34 +0000 (18:41 +0100)
futatabi/db.cpp

index 33d88d4f369e2819a585a32fb771f99d8ffccef8..75fc6f2c85f1a382519d4d595c1266d120fcf523 100644 (file)
@@ -20,11 +20,15 @@ DB::DB(const string &filename)
        )",
                     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);
+               CREATE TABLE IF NOT EXISTS settings (settings BLOB, uniqifier NOT NULL DEFAULT 1 UNIQUE);
        )",
                     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 +96,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 +107,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 +167,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 +178,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);
        }