From 1e64e9fbf7c8029420562eef6da3d7111e763505 Mon Sep 17 00:00:00 2001 Message-Id: <1e64e9fbf7c8029420562eef6da3d7111e763505.1714067353.git.mdw@distorted.org.uk> From: Mark Wooding Date: Thu, 4 Oct 2007 16:55:33 +0100 Subject: [PATCH 1/1] implement expiry of newly added tracks list Organization: Straylight/Edgeware From: Richard Kettlewell --- server/rescan.c | 6 ++++- server/trackdb.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ server/trackdb.h | 2 ++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/server/rescan.c b/server/rescan.c index 45f5a65..53c566c 100644 --- a/server/rescan.c +++ b/server/rescan.c @@ -34,6 +34,7 @@ #include #include #include +#include #include "configuration.h" #include "syscalls.h" @@ -305,7 +306,10 @@ static void do_all(void (*fn)(const struct collection *c)) { /** @brief Expire noticed.db */ static void expire_noticed(void) { - error(0, "expire_noticed not implemented yet TODO"); + time_t now; + + time(&now); + trackdb_expire_noticed(now - config->noticed_history * 86400); } int main(int argc, char **argv) { diff --git a/server/trackdb.c b/server/trackdb.c index d0147e6..6a7759d 100644 --- a/server/trackdb.c +++ b/server/trackdb.c @@ -69,6 +69,7 @@ static int trackdb_get_global_tid(const char *name, static char **trackdb_new_tid(int *ntracksp, int maxtracks, DB_TXN *tid); +static int trackdb_expire_noticed_tid(time_t earliest, DB_TXN *tid); const struct cache_type cache_files_type = { 86400 }; unsigned long cache_files_hits, cache_files_misses; @@ -1921,6 +1922,63 @@ static char **trackdb_new_tid(int *ntracksp, return tracks->vec; } +/** @brief Expire noticed.db + * @param earliest Earliest timestamp to keep + */ +void trackdb_expire_noticed(time_t earliest) { + DB_TXN *tid; + + for(;;) { + tid = trackdb_begin_transaction(); + if(!trackdb_expire_noticed_tid(earliest, tid)) + break; + trackdb_abort_transaction(tid); + } + trackdb_commit_transaction(tid); +} + +/** @brief Expire noticed.db + * @param earliest Earliest timestamp to keep + * @param tid Transaction ID + * @return 0 or DB_LOCK_DEADLOCK + */ +static int trackdb_expire_noticed_tid(time_t earliest, DB_TXN *tid) { + DBC *c; + DBT k, d; + int err = 0, ret; + time_t when; + uint32_t *kk; + int count = 0; + + c = trackdb_opencursor(trackdb_noticeddb, tid); + while(!(err = c->c_get(c, prepare_data(&k), prepare_data(&d), DB_NEXT))) { + kk = k.data; + when = (time_t)(((uint64_t)ntohl(kk[0]) << 32) + ntohl(kk[1])); + if(when >= earliest) + break; + if((err = c->c_del(c, 0))) { + if(err != DB_LOCK_DEADLOCK) + fatal(0, "error deleting expired noticed.db entry: %s", + db_strerror(err)); + break; + } + ++count; + } + if(err == DB_NOTFOUND) + err = 0; + if(err && err != DB_LOCK_DEADLOCK) + fatal(0, "error expiring noticed.db: %s", db_strerror(err)); + ret = err; + if((err = trackdb_closecursor(c))) { + if(err != DB_LOCK_DEADLOCK) + fatal(0, "error closing cursor: %s", db_strerror(err)); + ret = err; + } + if(!ret && count) + info("expired %d tracks from noticed.db", count); + return ret; +} + /* tidying up ****************************************************************/ void trackdb_gc(void) { diff --git a/server/trackdb.h b/server/trackdb.h index b3b3715..cb9e639 100644 --- a/server/trackdb.h +++ b/server/trackdb.h @@ -119,6 +119,8 @@ const char *trackdb_get_global(const char *name); char **trackdb_new(int *ntracksp, int maxtracks); +void trackdb_expire_noticed(time_t when); + #endif /* TRACKDB_H */ /* -- [mdw]