From e3603a8c0e11bfc302450a1be85c513fac9aac69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjetil=20=C3=98rbekk?= Date: Fri, 5 Sep 2008 00:59:36 +0200 Subject: - Added mfs_cleanup_db, to remove inactive paths --- src/mfs_subr.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/src/mfs_subr.c b/src/mfs_subr.c index 17a2126..ac33eca 100644 --- a/src/mfs_subr.c +++ b/src/mfs_subr.c @@ -136,6 +136,74 @@ mfs_insert_path(const char *path, sqlite3 *handle) return (0); } +/* + * Clean up the database: + * + * - Remove disabled paths + * - Remove songs in disabled paths + * - Remove unused artists and genres + */ +void +mfs_cleanup_db(sqlite3 *handle) +{ + DEBUG("cleaning up db\n"); + /* sqlite doesn't support deleting from multiple tables at the same time :-( */ + sqlite3_stmt *st, *st_; + int res, res_; + const char *path; + + + /* Removed songs from inactive paths */ + res = sqlite3_prepare_v2(handle, "SELECT path FROM path WHERE " + "active = 0", -1, &st, NULL); + if (res != SQLITE_OK) { + DEBUG("Error preparing statement: %s\n", + sqlite3_errmsg(handle)); + return; + } + res = sqlite3_step(st); + + while (res == SQLITE_ROW) { + path = (const char*)sqlite3_column_text(st, 0); + + res_ = sqlite3_prepare_v2(handle, "DELETE FROM song WHERE " + "filepath LIKE (?||'%')", -1, &st_, NULL); + if (res_ != SQLITE_OK) { + DEBUG("Error preparing statement: %s\n", + sqlite3_errmsg(handle)); + return; + } + + DEBUG("removing songs from '%s'\n", path); + sqlite3_bind_text(st_, 1, path, -1, SQLITE_TRANSIENT); + res_ = sqlite3_step(st_); + if (res_ != SQLITE_DONE) { + DEBUG("Error deleting '%s' from database: %s\n", + path, sqlite3_errmsg(handle)); + } + sqlite3_finalize(st_); + + res = sqlite3_step(st); + } + sqlite3_finalize(st); + + /* Remove the actual paths */ + res = sqlite3_prepare_v2(handle, "DELETE FROM path WHERE " + "active = 0", -1, &st, NULL); + if (res != SQLITE_OK) { + DEBUG("Error preparing statement: %s\n", + sqlite3_errmsg(handle)); + return; + } + res = sqlite3_step(st); + if (res != SQLITE_DONE) { + DEBUG("Error deleting inactive paths from db: %s\n", + sqlite3_errmsg(handle)); + return; + } + sqlite3_finalize(st); +} + /* * Reload the configuration from $HOME/.mfsrc * @@ -189,6 +257,8 @@ mfs_reload_config() } } + mfs_cleanup_db(handle); + free (mfsrc); sqlite3_close(handle); -- cgit v1.2.3