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()`
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;
}
/* 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);
}
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);
}
}
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);
/* 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;
}