X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fbsr.c;h=eefce24c7e5b882dbd498a82de4704f65632f1d4;hb=59f9844d56f5876903b17e0e10072464947d7596;hp=24cabc3449998b1e2f823db3ad50f6ff92ad19ed;hpb=45e6ff57c7d23c542f38d8c51883e69c72b8e55d;p=bacula%2Fbacula diff --git a/bacula/src/dird/bsr.c b/bacula/src/dird/bsr.c index 24cabc3449..eefce24c7e 100644 --- a/bacula/src/dird/bsr.c +++ b/bacula/src/dird/bsr.c @@ -1,7 +1,7 @@ /* Bacula® - The Network Backup Solution - Copyright (C) 2002-2008 Free Software Foundation Europe e.V. + Copyright (C) 2002-2010 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. @@ -34,7 +34,6 @@ * * Kern Sibbald, July MMII * - * Version $Id$ */ #include "bacula.h" @@ -176,6 +175,10 @@ bool complete_bsr(UAContext *ua, RBSR *bsr) } bsr->VolSessionId = jr.VolSessionId; bsr->VolSessionTime = jr.VolSessionTime; + if (jr.JobFiles == 0) { /* zero files is OK, not an error, but */ + bsr->VolCount = 0; /* there are no volumes */ + continue; + } if ((bsr->VolCount=db_get_job_volume_parameters(ua->jcr, ua->db, bsr->JobId, &(bsr->VolParams))) == 0) { ua->error_msg(_("Unable to get Job Volume Parameters. ERR=%s\n"), db_strerror(ua->db)); @@ -278,8 +281,7 @@ static void display_vol_info(UAContext *ua, RESTORE_CTX &rx, JobId_t JobId) } Mmsg(volmsg, "%c%-25.25s %-25.25s %-25.25s", online, bsr->VolParams[i].VolumeName, - bsr->VolParams[i].Storage, - Device); + bsr->VolParams[i].Storage, Device); add_prompt(ua, volmsg.c_str()); } } @@ -322,6 +324,70 @@ void display_bsr_info(UAContext *ua, RESTORE_CTX &rx) return; } +/* + * Write bsr data for a single bsr record + */ +static uint32_t write_bsr_item(RBSR *bsr, UAContext *ua, + RESTORE_CTX &rx, FILE *fd, bool &first, uint32_t &LastIndex) +{ + char ed1[50], ed2[50]; + uint32_t count = 0; + uint32_t total_count = 0; + char device[MAX_NAME_LENGTH]; + + /* + * 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)) { + bsr->VolParams[i].VolumeName[0] = 0; /* zap VolumeName */ + continue; + } + if (!rx.store) { + find_storage_resource(ua, rx, bsr->VolParams[i].Storage, + bsr->VolParams[i].MediaType); + } + fprintf(fd, "Storage=\"%s\"\n", bsr->VolParams[i].Storage); + fprintf(fd, "Volume=\"%s\"\n", bsr->VolParams[i].VolumeName); + fprintf(fd, "MediaType=\"%s\"\n", bsr->VolParams[i].MediaType); + if (bsr->fileregex) { + fprintf(fd, "FileRegex=%s\n", bsr->fileregex); + } + if (get_storage_device(device, bsr->VolParams[i].Storage)) { + fprintf(fd, "Device=\"%s\"\n", device); + } + if (bsr->VolParams[i].Slot > 0) { + fprintf(fd, "Slot=%d\n", bsr->VolParams[i].Slot); + } + fprintf(fd, "VolSessionId=%u\n", bsr->VolSessionId); + fprintf(fd, "VolSessionTime=%u\n", bsr->VolSessionTime); + fprintf(fd, "VolAddr=%s-%s\n", edit_uint64(bsr->VolParams[i].StartAddr, ed1), + edit_uint64(bsr->VolParams[i].EndAddr, ed2)); +// Dmsg2(100, "bsr VolParam FI=%u LI=%u\n", +// bsr->VolParams[i].FirstIndex, bsr->VolParams[i].LastIndex); + + count = write_findex(bsr->fi, bsr->VolParams[i].FirstIndex, + bsr->VolParams[i].LastIndex, fd); + if (count) { + fprintf(fd, "Count=%u\n", count); + } + total_count += count; + /* If the same file is present on two tapes or in two files + * on a tape, it is a continuation, and should not be treated + * twice in the totals. + */ + if (!first && LastIndex == bsr->VolParams[i].FirstIndex) { + total_count--; + } + first = false; + LastIndex = bsr->VolParams[i].LastIndex; + } + return total_count; +} + + /* * Here we actually write out the details of the bsr file. * Note, there is one bsr for each JobId, but the bsr may @@ -332,120 +398,22 @@ void display_bsr_info(UAContext *ua, RESTORE_CTX &rx) */ static uint32_t write_bsr(UAContext *ua, RESTORE_CTX &rx, FILE *fd) { - char ed1[50], ed2[50]; - uint32_t count = 0; - uint32_t total_count = 0; - uint32_t LastIndex = 0; bool first = true; + uint32_t LastIndex = 0; + uint32_t total_count = 0; char *p; JobId_t JobId; - char device[MAX_NAME_LENGTH]; RBSR *bsr; if (*rx.JobIds == 0) { for (bsr=rx.bsr; bsr; bsr=bsr->next) { - /* - * 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)) { - bsr->VolParams[i].VolumeName[0] = 0; /* zap VolumeName */ - continue; - } - if (!rx.store) { - find_storage_resource(ua, rx, bsr->VolParams[i].Storage, - bsr->VolParams[i].MediaType); - } - fprintf(fd, "Volume=\"%s\"\n", bsr->VolParams[i].VolumeName); - fprintf(fd, "MediaType=\"%s\"\n", bsr->VolParams[i].MediaType); - if (bsr->fileregex) { - fprintf(fd, "FileRegex=%s\n", bsr->fileregex); - } - if (get_storage_device(device, bsr->VolParams[i].Storage)) { - fprintf(fd, "Device=\"%s\"\n", device); - } - if (bsr->VolParams[i].Slot > 0) { - fprintf(fd, "Slot=%d\n", bsr->VolParams[i].Slot); - } - fprintf(fd, "VolSessionId=%u\n", bsr->VolSessionId); - fprintf(fd, "VolSessionTime=%u\n", bsr->VolSessionTime); - fprintf(fd, "VolAddr=%s-%s\n", edit_uint64(bsr->VolParams[i].StartAddr, ed1), - edit_uint64(bsr->VolParams[i].EndAddr, ed2)); - // Dmsg2(100, "bsr VolParam FI=%u LI=%u\n", - // bsr->VolParams[i].FirstIndex, bsr->VolParams[i].LastIndex); - - count = write_findex(bsr->fi, bsr->VolParams[i].FirstIndex, - bsr->VolParams[i].LastIndex, fd); - if (count) { - fprintf(fd, "Count=%u\n", count); - } - total_count += count; - /* If the same file is present on two tapes or in two files - * on a tape, it is a continuation, and should not be treated - * twice in the totals. - */ - if (!first && LastIndex == bsr->VolParams[i].FirstIndex) { - total_count--; - } - first = false; - LastIndex = bsr->VolParams[i].LastIndex; - } + total_count += write_bsr_item(bsr, ua, rx, fd, first, LastIndex); } return total_count; } for (p=rx.JobIds; get_next_jobid_from_list(&p, &JobId) > 0; ) { for (bsr=rx.bsr; bsr; bsr=bsr->next) { - if (JobId != bsr->JobId) { - continue; - } - /* - * 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)) { - bsr->VolParams[i].VolumeName[0] = 0; /* zap VolumeName */ - continue; - } - if (!rx.store) { - find_storage_resource(ua, rx, bsr->VolParams[i].Storage, - bsr->VolParams[i].MediaType); - } - fprintf(fd, "Volume=\"%s\"\n", bsr->VolParams[i].VolumeName); - fprintf(fd, "MediaType=\"%s\"\n", bsr->VolParams[i].MediaType); - if (bsr->fileregex) { - fprintf(fd, "FileRegex=%s\n", bsr->fileregex); - } - if (get_storage_device(device, bsr->VolParams[i].Storage)) { - fprintf(fd, "Device=\"%s\"\n", device); - } - if (bsr->VolParams[i].Slot > 0) { - fprintf(fd, "Slot=%d\n", bsr->VolParams[i].Slot); - } - fprintf(fd, "VolSessionId=%u\n", bsr->VolSessionId); - fprintf(fd, "VolSessionTime=%u\n", bsr->VolSessionTime); - fprintf(fd, "VolAddr=%s-%s\n", edit_uint64(bsr->VolParams[i].StartAddr, ed1), - edit_uint64(bsr->VolParams[i].EndAddr, ed2)); - // Dmsg2(100, "bsr VolParam FI=%u LI=%u\n", - // bsr->VolParams[i].FirstIndex, bsr->VolParams[i].LastIndex); - - count = write_findex(bsr->fi, bsr->VolParams[i].FirstIndex, - bsr->VolParams[i].LastIndex, fd); - if (count) { - fprintf(fd, "Count=%u\n", count); - } - total_count += count; - /* If the same file is present on two tapes or in two files - * on a tape, it is a continuation, and should not be treated - * twice in the totals. - */ - if (!first && LastIndex == bsr->VolParams[i].FirstIndex) { - total_count--; - } - first = false; - LastIndex = bsr->VolParams[i].LastIndex; + if (JobId == bsr->JobId) { + total_count += write_bsr_item(bsr, ua, rx, fd, first, LastIndex); } } } @@ -589,8 +557,15 @@ void add_findex_all(RBSR *bsr, uint32_t JobId) /* Add new JobId at end of chain */ for (nbsr=bsr; nbsr->next; nbsr=nbsr->next) { } + nbsr->next = new_bsr(); nbsr->next->JobId = JobId; + + /* If we use regexp to restore, set it for each jobid */ + if (bsr->fileregex) { + nbsr->next->fileregex = bstrdup(bsr->fileregex); + } + nbsr->next->fi = new_findex(); nbsr->next->fi->findex = 1; nbsr->next->fi->findex2 = INT32_MAX;