/*
Bacula® - The Network Backup Solution
- Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2009 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
static int dbglvl=200;
typedef struct PrivateCurFile {
- rblink link;
+ hlink link;
char *fname;
- time_t ctime;
- time_t mtime;
+ utime_t ctime;
+ utime_t mtime;
bool seen;
} CurFile;
-static int my_cmp(void *item1, void *item2)
+bool accurate_mark_file_as_seen(JCR *jcr, char *fname)
{
- CurFile *elt1, *elt2;
- elt1 = (CurFile *) item1;
- elt2 = (CurFile *) item2;
- return strcmp(elt1->fname, elt2->fname);
+ if (!jcr->accurate || !jcr->file_list) {
+ return false;
+ }
+ /* TODO: just use elt->seen = 1 */
+ CurFile *temp = (CurFile *)jcr->file_list->lookup(fname);
+ if (temp) {
+ temp->seen = 1; /* records are in memory */
+ Dmsg1(dbglvl, "marked <%s> as seen\n", fname);
+ } else {
+ Dmsg1(dbglvl, "<%s> not found to be marked as seen\n", fname);
+ }
+ return true;
}
static bool accurate_mark_file_as_seen(JCR *jcr, CurFile *elt)
{
/* TODO: just use elt->seen = 1 */
- CurFile *temp = (CurFile *)jcr->file_list->search(elt, my_cmp);
+ CurFile *temp = (CurFile *)jcr->file_list->lookup(elt->fname);
if (temp) {
temp->seen = 1; /* records are in memory */
}
bool found=false;
ret->seen = 0;
- CurFile search;
- search.fname = fname;
- CurFile *temp = (CurFile *)jcr->file_list->search(&search, my_cmp);
+ CurFile *temp = (CurFile *)jcr->file_list->lookup(fname);
if (temp) {
memcpy(ret, temp, sizeof(CurFile));
found=true;
-// Dmsg1(dbglvl, "lookup <%s> ok\n", fname);
+ Dmsg1(dbglvl, "lookup <%s> ok\n", fname);
}
return found;
static bool accurate_init(JCR *jcr, int nbfile)
{
CurFile *elt = NULL;
- jcr->file_list = New(rblist(elt, &elt->link));
+ jcr->file_list = (htable *)malloc(sizeof(htable));
+ jcr->file_list->init(elt, &elt->link, nbfile);
return true;
}
ff_pkt = init_find_files();
ff_pkt->type = FT_DELETED;
- foreach_rblist(elt, jcr->file_list) {
- if (!elt->seen) { /* already seen */
-// Dmsg2(dbglvl, "deleted fname=%s seen=%i\n", elt->fname, elt->seen);
- ff_pkt->fname = elt->fname;
- ff_pkt->statp.st_mtime = elt->mtime;
- ff_pkt->statp.st_ctime = elt->ctime;
- encode_and_send_attributes(jcr, ff_pkt, stream);
+ foreach_htable(elt, jcr->file_list) {
+ if (elt->seen || plugin_check_file(jcr, elt->fname)) {
+ continue;
}
-// free(elt->fname);
+ Dmsg2(dbglvl, "deleted fname=%s seen=%i\n", elt->fname, elt->seen);
+ ff_pkt->fname = elt->fname;
+ ff_pkt->statp.st_mtime = elt->mtime;
+ ff_pkt->statp.st_ctime = elt->ctime;
+ encode_and_send_attributes(jcr, ff_pkt, stream);
+// free(elt->fname);
}
term_find_files(ff_pkt);
bail_out:
/* TODO: clean htable when this function is not reached ? */
+ accurate_free(jcr);
+ return true;
+}
+
+void accurate_free(JCR *jcr)
+{
if (jcr->file_list) {
- delete jcr->file_list;
+ jcr->file_list->destroy();
+ free(jcr->file_list);
jcr->file_list = NULL;
}
- return true;
}
static bool accurate_add_file(JCR *jcr, char *fname, char *lstat)
bool ret = true;
CurFile elt;
struct stat statp;
- int LinkFIc;
+ int32_t LinkFIc;
decode_stat(lstat, &statp, &LinkFIc); /* decode catalog stat */
elt.ctime = statp.st_ctime;
elt.mtime = statp.st_mtime;
CurFile *item;
/* we store CurFile, fname and ctime/mtime in the same chunk */
- item = (CurFile *)malloc(sizeof(CurFile)+strlen(fname)+1);
+ item = (CurFile *)jcr->file_list->hash_malloc(sizeof(CurFile)+strlen(fname)+1);
memcpy(item, &elt, sizeof(CurFile));
item->fname = (char *)item+sizeof(CurFile);
strcpy(item->fname, fname);
- jcr->file_list->insert(item, my_cmp);
+ jcr->file_list->insert(item->fname, item);
-// Dmsg2(dbglvl, "add fname=<%s> lstat=%s\n", fname, lstat);
+ Dmsg2(dbglvl, "add fname=<%s> lstat=%s\n", fname, lstat);
return ret;
}
* We check in file_list hash if fname have been backuped
* the last time. After we can compare Lstat field.
* Full Lstat usage have been removed on 6612
+ *
+ * Returns: true if file has changed (must be backed up)
+ * false file not changed
*/
bool accurate_check_file(JCR *jcr, FF_PKT *ff_pkt)
{
goto bail_out;
}
+ /*
+ * We check only mtime/ctime like with the normal
+ * incremental/differential mode
+ */
if (elt.mtime != ff_pkt->statp.st_mtime) {
// Jmsg(jcr, M_SAVED, 0, _("%s st_mtime differs\n"), fname);
- Dmsg1(dbglvl, "%s st_mtime differs\n", fname);
+ Dmsg3(dbglvl, "%s st_mtime differs (%lld!=%lld)\n",
+ fname, elt.mtime, (utime_t)ff_pkt->statp.st_mtime);
stat = true;
- } else if (elt.ctime != ff_pkt->statp.st_ctime) {
+ } else if (!(ff_pkt->flags & FO_MTIMEONLY)
+ && (elt.ctime != ff_pkt->statp.st_ctime)) {
// Jmsg(jcr, M_SAVED, 0, _("%s st_ctime differs\n"), fname);
- Dmsg1(dbglvl, "%s st_ctime differs\n", fname);
+ Dmsg3(dbglvl, "%s st_ctime differs\n",
+ fname, elt.ctime, ff_pkt->statp.st_ctime);
stat = true;
}
accurate_mark_file_as_seen(jcr, &elt);
-// Dmsg2(dbglvl, "accurate %s = %i\n", fname, stat);
+// Dmsg2(dbglvl, "accurate %s = %d\n", fname, stat);
bail_out:
unstrip_path(ff_pkt);
if (!jcr->accurate || job_canceled(jcr) || jcr->get_JobLevel()==L_FULL) {
return true;
}
-
if (sscanf(dir->msg, "accurate files=%ld", &nb) != 1) {
dir->fsend(_("2991 Bad accurate command\n"));
return false;