X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=futatabi%2Fdb.cpp;h=fb6694be3a2f2c729edefedcd3d923a9a4ca2209;hb=332647953275fdf1691cded8bbe5d4a8dfe7c675;hp=39fd55776c40c9f094e84bfbbb4aed906b65fed6;hpb=6e116a6bbeb2c047a3bfb084395ec601ce211e6c;p=nageru diff --git a/futatabi/db.cpp b/futatabi/db.cpp index 39fd557..fb6694b 100644 --- a/futatabi/db.cpp +++ b/futatabi/db.cpp @@ -3,6 +3,7 @@ #include "frame.pb.h" #include +#include using namespace std; @@ -18,6 +19,10 @@ DB::DB(const string &filename) CREATE TABLE IF NOT EXISTS state (state BLOB); )", 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, R"( DROP TABLE file; )", nullptr, nullptr, nullptr); // Ignore errors. @@ -116,6 +121,83 @@ void DB::store_state(const StateProto &state) } } +SettingsProto DB::get_settings() +{ + SettingsProto settings; + + sqlite3_stmt *stmt; + 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); + } + + ret = sqlite3_step(stmt); + if (ret == SQLITE_ROW) { + 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); + } + } else if (ret != SQLITE_DONE) { + fprintf(stderr, "SELECT step: %s\n", sqlite3_errmsg(db)); + exit(1); + } + + ret = sqlite3_finalize(stmt); + if (ret != SQLITE_OK) { + fprintf(stderr, "SELECT finalize: %s\n", sqlite3_errmsg(db)); + exit(1); + } + + return settings; +} + +void DB::store_settings(const SettingsProto &settings) +{ + string serialized; + settings.SerializeToString(&serialized); + + int ret = sqlite3_exec(db, "BEGIN", nullptr, nullptr, nullptr); + if (ret != SQLITE_OK) { + fprintf(stderr, "BEGIN: %s\n", sqlite3_errmsg(db)); + 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); + if (ret != SQLITE_OK) { + fprintf(stderr, "INSERT prepare: %s\n", sqlite3_errmsg(db)); + exit(1); + } + + sqlite3_bind_blob(stmt, 1, serialized.data(), serialized.size(), SQLITE_STATIC); + + ret = sqlite3_step(stmt); + if (ret == SQLITE_ROW) { + fprintf(stderr, "INSERT 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)); + exit(1); + } + + ret = sqlite3_exec(db, "COMMIT", nullptr, nullptr, nullptr); + if (ret != SQLITE_OK) { + fprintf(stderr, "COMMIT: %s\n", sqlite3_errmsg(db)); + exit(1); + } +} + vector DB::load_frame_file(const string &filename, size_t size, unsigned filename_idx) { FileContentsProto file_contents;