]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/filed/accurate.c
Loose #ifdef and use const bool wrapper for some cleaner coding.
[bacula/bacula] / bacula / src / filed / accurate.c
index f95045c6d50f67cbb77f003e3874298e2672f728..4d050b5df01ab1f836b78c220b303564f87eb48d 100644 (file)
@@ -1,7 +1,7 @@
 /*
    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 */
    }
@@ -66,13 +74,11 @@ static bool accurate_lookup(JCR *jcr, char *fname, CurFile *ret)
    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;
@@ -81,7 +87,8 @@ static bool accurate_lookup(JCR *jcr, char *fname, CurFile *ret)
 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;
 }
 
@@ -106,25 +113,32 @@ bool accurate_send_deleted_list(JCR *jcr)
    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)
@@ -132,7 +146,7 @@ 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;
@@ -140,13 +154,13 @@ static bool accurate_add_file(JCR *jcr, char *fname, char *lstat)
 
    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;
 }
 
@@ -155,6 +169,9 @@ static bool accurate_add_file(JCR *jcr, char *fname, char *lstat)
  * 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)
 {
@@ -185,18 +202,25 @@ 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);
@@ -215,7 +239,6 @@ int accurate_cmd(JCR *jcr)
    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;