From f6de284fe520412fdab0559c7859c11c5cd4f80a Mon Sep 17 00:00:00 2001 From: Urban Wallasch Date: Wed, 9 Jun 2021 17:36:22 +0200 Subject: [PATCH] * Added logic to store and compare modification times. --- README.md | 2 +- db.c | 9 ++++++--- db.h | 3 ++- main.c | 8 ++------ 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index fbb3f7f..db51ec5 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ OPTIONS: performed by additionally specifying `-r`. * `-r` initiates a full re-scan, even for files already present in the - database. + database with matching modification time. * `-i` include text as a custom lead-in in the output, which is in particular useful to replace the default dummy versions of the `VIEW()` diff --git a/db.c b/db.c index def9831..371551d 100644 --- a/db.c +++ b/db.c @@ -80,10 +80,11 @@ static inline int db_unlock(db_t *db) { return pthread_mutex_unlock(&db->mtx); } -db_entry_t *db_entry_new(const char *fname) { +db_entry_t *db_entry_new(const char *fname, uint64_t mtime) { db_entry_t *entry = s_malloc(sizeof *entry); memset(entry, 0, sizeof *entry); entry->fname = NULL != fname ? s_strdup(fname) : "?"; + entry->mtime = mtime; return entry; } @@ -159,7 +160,7 @@ int db_insert(db_t *db, db_entry_t *entry, int replace, double blur) { /* entry already in db? */ db_entry_t *en = db_find(db, entry->fname); if ( NULL != en ) { - if ( !replace ) + if ( !replace && en->mtime >= entry->mtime ) return 1; DB_ENTRY_DELETE(en); } @@ -194,6 +195,7 @@ int db_write(db_t *db, const char *dbf) { fwrite((void *)&p->nhash, sizeof p->nhash, 1, fp); fwrite((void *)&p->flags, sizeof p->flags, 1, fp); fwrite((void *)&p->hamw, sizeof p->hamw, 1, fp); + fwrite((void *)&p->mtime, sizeof p->mtime, 1, fp); fwrite((void *)p->fname, strlen(p->fname) + 1, 1, fp); } } @@ -212,11 +214,12 @@ int db_read(db_t *db, const char *dbf) { if ( NULL == (fp = fopen(dbf, "rb")) ) return -1; while ( !feof(fp) ) { - p = db_entry_new(NULL); + p = db_entry_new(NULL, 0); fread((void *)&p->phash, sizeof p->phash, 1, fp); fread((void *)&p->nhash, sizeof p->nhash, 1, fp); fread((void *)&p->flags, sizeof p->flags, 1, fp); fread((void *)&p->hamw, sizeof p->hamw, 1, fp); + fread((void *)&p->mtime, sizeof p->mtime, 1, fp); i = 0; do { c = fgetc(fp); diff --git a/db.h b/db.h index 5c105ba..b70a7c3 100644 --- a/db.h +++ b/db.h @@ -33,6 +33,7 @@ struct db_entry_struct { uint16_t nhash; uint16_t flags; uint16_t hamw; + uint64_t mtime; char *fname; db_entry_t *pnext; db_entry_t *inext; @@ -51,7 +52,7 @@ struct db_struct { }; -extern db_entry_t *db_entry_new(const char *fname); +extern db_entry_t *db_entry_new(const char *fname, uint64_t mtime); extern db_t *db_init(void); extern void db_destroy(db_t **pdb); extern int db_clear(db_t *db); diff --git a/main.c b/main.c index 0ad71f8..c3cc348 100644 --- a/main.c +++ b/main.c @@ -79,14 +79,10 @@ void *worker(void *arg) { /* callback for nftw directory tree walker */ int scan_dir_cb(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) { - (void)sb; if ( cfg.maxdepth && cfg.maxdepth < ftwbuf->level ) return 0; - if ( FTW_F == typeflag ) { - db_entry_t *entry; - entry = db_entry_new(fpath); - q_enq(q, entry); - } + if ( FTW_F == typeflag ) + q_enq(q, db_entry_new(fpath, sb->st_mtime)); return 0; } -- 2.30.2