From: Steinar H. Gunderson Date: Thu, 29 Nov 2018 19:53:07 +0000 (+0100) Subject: Remove frame files that do not exist from the database. X-Git-Tag: 1.8.0~76^2~1 X-Git-Url: https://git.sesse.net/?p=nageru;a=commitdiff_plain;h=ce2e0615420b706e1ff2405fffcedfba37a9adac Remove frame files that do not exist from the database. --- diff --git a/db.cpp b/db.cpp index e928e96..39fd557 100644 --- a/db.cpp +++ b/db.cpp @@ -249,3 +249,76 @@ void DB::store_frame_file(const string &filename, size_t size, const vector &used_filenames) +{ + 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, R"( + CREATE TEMPORARY TABLE used_filenames ( filename VARCHAR NOT NULL PRIMARY KEY ) + )", nullptr, nullptr, nullptr); + + if (ret != SQLITE_OK) { + fprintf(stderr, "CREATE TEMPORARY TABLE: %s\n", sqlite3_errmsg(db)); + exit(1); + } + + // Insert the new rows. + sqlite3_stmt *stmt; + ret = sqlite3_prepare_v2(db, "INSERT INTO used_filenames (filename) VALUES (?)", -1, &stmt, 0); + if (ret != SQLITE_OK) { + fprintf(stderr, "INSERT prepare: %s\n", sqlite3_errmsg(db)); + exit(1); + } + + for (const string &filename : used_filenames) { + sqlite3_bind_text(stmt, 1, filename.data(), filename.size(), SQLITE_STATIC); + + ret = sqlite3_step(stmt); + if (ret == SQLITE_ROW) { + fprintf(stderr, "INSERT step: %s\n", sqlite3_errmsg(db)); + exit(1); + } + + ret = sqlite3_reset(stmt); + if (ret == SQLITE_ROW) { + fprintf(stderr, "INSERT reset: %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, R"( + DELETE FROM filev2 WHERE filename NOT IN ( SELECT filename FROM used_filenames ) + )", nullptr, nullptr, nullptr); + + if (ret != SQLITE_OK) { + fprintf(stderr, "DELETE: %s\n", sqlite3_errmsg(db)); + exit(1); + } + + ret = sqlite3_exec(db, R"( + DROP TABLE used_filenames + )", nullptr, nullptr, nullptr); + + if (ret != SQLITE_OK) { + fprintf(stderr, "DROP TABLE: %s\n", sqlite3_errmsg(db)); + exit(1); + } + + // Commit. + ret = sqlite3_exec(db, "COMMIT", nullptr, nullptr, nullptr); + if (ret != SQLITE_OK) { + fprintf(stderr, "COMMIT: %s\n", sqlite3_errmsg(db)); + exit(1); + } +} diff --git a/db.h b/db.h index 88196c7..f8032c0 100644 --- a/db.h +++ b/db.h @@ -23,6 +23,7 @@ public: }; std::vector load_frame_file(const std::string &filename, size_t size, unsigned frame_idx); // Empty = none found, or there were no frames. void store_frame_file(const std::string &filename, size_t size, const std::vector &frames); + void clean_unused_frame_files(const std::vector &used_filenames); private: StateProto state; diff --git a/main.cpp b/main.cpp index 95b3ff8..e0518af 100644 --- a/main.cpp +++ b/main.cpp @@ -435,6 +435,8 @@ void load_existing_frames() sort(frames[stream_idx].begin(), frames[stream_idx].end(), [](const auto &a, const auto &b) { return a.pts < b.pts; }); } + + db.clean_unused_frame_files(frame_basenames); } int record_thread_func()