#include "frame.pb.h"
#include <string>
+#include <unordered_set>
using namespace std;
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, 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.
+ )",
+ 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 (
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.
}
}
+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::FrameOnDiskAndStreamIdx> DB::load_frame_file(const string &filename, size_t size, unsigned filename_idx)
{
FileContentsProto file_contents;
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));
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));
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));