* Added logic to store and compare modification times.
authorUrban Wallasch <urban.wallasch@freenet.de>
Wed, 9 Jun 2021 15:36:22 +0000 (17:36 +0200)
committerUrban Wallasch <urban.wallasch@freenet.de>
Wed, 9 Jun 2021 15:36:22 +0000 (17:36 +0200)
README.md
db.c
db.h
main.c

index fbb3f7fcf87aa53efc7c1e86d73c862e80ed02c7..db51ec5e1d92499f221775bfea94250736647e2a 100644 (file)
--- 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 def983139f28b148e673dfdd86a600a0d777a535..371551dc9e37f42f8c8d7b6a410cd84adbb87347 100644 (file)
--- 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 5c105ba9c9280c0801b1e792e17771a69fc31490..b70a7c32b8a165cfb73d542cc7403960404d9df9 100644 (file)
--- 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 0ad71f8fcb11c5f8f15b4f416c47469e2afbcfc4..c3cc34866df4965f973ca30f71e113b7ff5cd3da 100644 (file)
--- 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;
 }