]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/bsr.c
This commit was manufactured by cvs2svn to create tag
[bacula/bacula] / bacula / src / dird / bsr.c
index ae8ddf2a7e27830a24c0b2ff5983bd6fbba6aae8..9457c12bac1cb957387e46fd7379c77d170926ad 100644 (file)
@@ -35,6 +35,7 @@
 
 /* Forward referenced functions */
 static void write_bsr(UAContext *ua, RBSR *bsr, FILE *fd);
+void print_bsr(UAContext *ua, RBSR *bsr);
 
 
 /*
@@ -62,21 +63,31 @@ static void free_findex(RBSR_FINDEX *fi)
  *  range regardless of volume. The FirstIndex and LastIndex
  *  passed in here are for the current volume, so when 
  *  writing out the fi, constrain them to those values.
+ *
+ * We are called here once for each JobMedia record
+ *  for each Volume.
  */
-static void write_findex(UAContext *ua, RBSR_FINDEX *fi, 
+static uint32_t write_findex(UAContext *ua, RBSR_FINDEX *fi, 
              int32_t FirstIndex, int32_t LastIndex, FILE *fd) 
 {
-   if (fi) {
+   uint32_t count = 0;
+   for ( ; fi; fi=fi->next) {
       int32_t findex, findex2;
+      if ((fi->findex >= FirstIndex && fi->findex <= LastIndex) ||
+         (fi->findex2 >= FirstIndex && fi->findex2 <= LastIndex) ||
+         (fi->findex < FirstIndex && fi->findex2 > LastIndex)) {
       findex = fi->findex < FirstIndex ? FirstIndex : fi->findex;
       findex2 = fi->findex2 > LastIndex ? LastIndex : fi->findex2;
       if (findex == findex2) {
          fprintf(fd, "FileIndex=%d\n", findex);
+           count++;
       } else {
          fprintf(fd, "FileIndex=%d-%d\n", findex, findex2);
+           count += findex2 - findex + 1;
+      }
       }
-      write_findex(ua, fi->next, FirstIndex, LastIndex, fd);
    }
+   return count;
 }
 
 /*
@@ -101,13 +112,15 @@ static bool is_volume_selected(RBSR_FINDEX *fi,
 
 static void print_findex(UAContext *ua, RBSR_FINDEX *fi)
 {
-   if (fi) {
+   bsendmsg(ua, "fi=0x%x\n", (unsigned)fi);
+   for ( ; fi; fi=fi->next) {
       if (fi->findex == fi->findex2) {
          bsendmsg(ua, "FileIndex=%d\n", fi->findex);
+//       Dmsg1(100, "FileIndex=%d\n", fi->findex);
       } else {
          bsendmsg(ua, "FileIndex=%d-%d\n", fi->findex, fi->findex2);
+//       Dmsg2(100, "FileIndex=%d-%d\n", fi->findex, fi->findex2);
       }
-      print_findex(ua, fi->next);
    }
 }
 
@@ -124,10 +137,10 @@ void free_bsr(RBSR *bsr)
 {
    if (bsr) {
       free_findex(bsr->fi);
-      free_bsr(bsr->next);
       if (bsr->VolParams) {
         free(bsr->VolParams);
       }
+      free_bsr(bsr->next);
       free(bsr);
    }
 }
@@ -210,6 +223,11 @@ int write_bsr_file(UAContext *ua, RBSR *bsr)
 static void write_bsr(UAContext *ua, RBSR *bsr, FILE *fd)
 {
    if (bsr) {
+      uint32_t count;
+      /*
+       * For a given volume, loop over all the JobMedia records.
+       *   VolCount is the number of JobMedia records.
+       */
       for (int i=0; i < bsr->VolCount; i++) {
         if (!is_volume_selected(bsr->fi, bsr->VolParams[i].FirstIndex,
              bsr->VolParams[i].LastIndex)) {
@@ -219,21 +237,32 @@ static void write_bsr(UAContext *ua, RBSR *bsr, FILE *fd)
          fprintf(fd, "Volume=\"%s\"\n", bsr->VolParams[i].VolumeName);
          fprintf(fd, "VolSessionId=%u\n", bsr->VolSessionId);
          fprintf(fd, "VolSessionTime=%u\n", bsr->VolSessionTime);
+        if (bsr->VolParams[i].StartFile == bsr->VolParams[i].EndFile) {
+            fprintf(fd, "VolFile=%u\n", bsr->VolParams[i].StartFile);
+        } else {
          fprintf(fd, "VolFile=%u-%u\n", bsr->VolParams[i].StartFile, 
                 bsr->VolParams[i].EndFile);
+        }
+        if (bsr->VolParams[i].StartBlock == bsr->VolParams[i].EndBlock) {
+            fprintf(fd, "VolFile=%u\n", bsr->VolParams[i].StartBlock);
+        } else {
          fprintf(fd, "VolBlock=%u-%u\n", bsr->VolParams[i].StartBlock,
                 bsr->VolParams[i].EndBlock);
-
-//       Dmsg2(000, "bsr VolParam FI=%u LI=%u\n",
+        }
+//       Dmsg2(100, "bsr VolParam FI=%u LI=%u\n",
 //         bsr->VolParams[i].FirstIndex, bsr->VolParams[i].LastIndex);
-        write_findex(ua, bsr->fi, bsr->VolParams[i].FirstIndex,
+
+        count = write_findex(ua, bsr->fi, bsr->VolParams[i].FirstIndex,
            bsr->VolParams[i].LastIndex, fd);
+        if (count) {
+            fprintf(fd, "Count=%u\n", count);
+        }
       }
       write_bsr(ua, bsr->next, fd);
    }
 }
 
-static void print_bsr(UAContext *ua, RBSR *bsr)
+void print_bsr(UAContext *ua, RBSR *bsr)
 {
    if (bsr) {
       for (int i=0; i < bsr->VolCount; i++) {
@@ -296,7 +325,7 @@ void add_findex(RBSR *bsr, uint32_t JobId, int32_t findex)
    }
 
    /* 
-    * At this point, bsr points to bsr containing JobId,
+    * At this point, bsr points to bsr containing this JobId,
     *  and we are sure that there is at least one fi record.
     */
    lfi = fi = bsr->fi;
@@ -318,6 +347,10 @@ void add_findex(RBSR *bsr, uint32_t JobId, int32_t findex)
       if (findex == (fi->findex2 + 1)) {  /* extend up */
         RBSR_FINDEX *nfi;     
         fi->findex2 = findex;
+        /*
+         * If the following record contains one higher, merge its
+         *   file index by extending it up.
+         */
         if (fi->next && ((findex+1) == fi->next->findex)) { 
            nfi = fi->next;
            fi->findex2 = nfi->findex2;