]> git.sur5r.net Git - bacula/bacula/commitdiff
Optimize restore for diferential backups + add *all* ACL value
authorKern Sibbald <kern@sibbald.com>
Sat, 17 Jan 2004 21:01:05 +0000 (21:01 +0000)
committerKern Sibbald <kern@sibbald.com>
Sat, 17 Jan 2004 21:01:05 +0000 (21:01 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1016 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/kernstodo
bacula/src/dird/sql_cmds.c
bacula/src/dird/ua_acl.c
bacula/src/dird/ua_restore.c

index fe59a6b282af9d600cfa3575795599c8e5aca488..1851d9feb51f34f5766d8f0299ab9dc5501a1391 100644 (file)
@@ -58,6 +58,7 @@ For 1.33 Testing/Documentation:
 - Document Pool keyword for restore.
                 
 For 1.33
+- Fix restore to only pull in last Differential and later Incrementals.
 - Finish code passing files=nnn to restore start.
 - Add level to estimate command.
 - Check time/dates printed during restore when using Win32 API.
@@ -1118,4 +1119,3 @@ Done: (see kernsdone for more)
   directories, setting them to be restored.
 - Figure out a way to set restore on a directory without recursively
   decending.  (recurse off?).
-
index e5f8983aceb003aa4046543ac8fa8ee079a07d4e..6ba625abec1fb8043e9a0ec1c371a1e057e764a3 100644 (file)
@@ -243,7 +243,7 @@ char *uar_full =
    "AND JobMedia.JobId=Job.JobId "
    "AND JobMedia.MediaId=Media.MediaId";
 
-char *uar_inc_dec =
+char *uar_dec = 
    "INSERT INTO temp SELECT Job.JobId,Job.JobTDate,Job.ClientId,"
    "Job.Level,Job.JobFiles,Job.StartTime,Media.VolumeName,JobMedia.StartFile,"
    "Job.VolSessionId,Job.VolSessionTime "
@@ -252,7 +252,22 @@ char *uar_inc_dec =
    "AND Job.ClientId=%u "
    "AND JobMedia.JobId=Job.JobId "
    "AND JobMedia.MediaId=Media.MediaId "
-   "AND Job.Level IN ('I', 'D') AND JobStatus='T' "
+   "AND Job.Level='D' AND JobStatus='T' "
+   "AND Job.FileSetId=FileSet.FileSetId "
+   "AND FileSet.FileSet='%s' "
+   "%s" 
+   "ORDER BY Job.JobTDate DESC LIMIT 1";
+
+char *uar_inc =
+   "INSERT INTO temp SELECT Job.JobId,Job.JobTDate,Job.ClientId,"
+   "Job.Level,Job.JobFiles,Job.StartTime,Media.VolumeName,JobMedia.StartFile,"
+   "Job.VolSessionId,Job.VolSessionTime "
+   "FROM Job,JobMedia,Media,FileSet "
+   "WHERE Job.JobTDate>%s AND Job.StartTime<'%s' "
+   "AND Job.ClientId=%u "
+   "AND JobMedia.JobId=Job.JobId "
+   "AND JobMedia.MediaId=Media.MediaId "
+   "AND Job.Level='I' AND JobStatus='T' "
    "AND Job.FileSetId=FileSet.FileSetId "
    "AND FileSet.FileSet='%s' "
    "%s";
@@ -267,6 +282,10 @@ char *uar_sel_jobid_temp = "SELECT JobId FROM temp";
 
 char *uar_sel_all_temp1 = "SELECT * FROM temp1";
 
+char *uar_sel_all_temp = "SELECT * FROM temp";
+
+
+
 /* Select FileSet names for this Client */
 char *uar_sel_fileset = 
    "SELECT DISTINCT FileSet.FileSet FROM Job,"
index 11a90536046b80bcdc84b6acd22273000acc4c31..cb184a0a88253506bc44f4be814e0bf602230afc 100644 (file)
@@ -41,14 +41,24 @@ bool acl_access_ok(UAContext *ua, int acl, char *item)
 
 bool acl_access_ok(UAContext *ua, int acl, char *item, int len)
 {
+
+   /* If no console resource => default console and all is permitted */
    if (!ua->cons) {
       Dmsg0(400, "Root cons access OK.\n");
       return true;                   /* No cons resource -> root console OK for everything */
    }
+
    alist *list = ua->cons->ACL_lists[acl];
    if (!list) {
-      return false;                  /* List empty, reject */
+      return false;                  /* List empty, reject everything */
    }
+
+   /* Special case *all* gives full access */
+   if (list->size() == 1 && strcasecmp("*all*", (char *)list->get(0)) == 0) {
+      return true;
+   }
+
+   /* Search list for item */
    for (int i=0; i<list->size(); i++) {
       if (strncasecmp(item, (char *)list->get(i), len) == 0) {
          Dmsg3(400, "Found %s in %d %s\n", item, acl, (char *)list->get(i));
index 6b99e2a7cdb910e39643c9f8f9b35e2d78c7995c..dc4e15b27925c8891579dffcdd46f28b061aa4ce 100644 (file)
@@ -45,9 +45,9 @@ extern void print_bsr(UAContext *ua, RBSR *bsr);
 extern char *uar_list_jobs,     *uar_file,        *uar_sel_files;
 extern char *uar_del_temp,      *uar_del_temp1,   *uar_create_temp;
 extern char *uar_create_temp1,  *uar_last_full,   *uar_full;
-extern char *uar_inc_dec,       *uar_list_temp,   *uar_sel_jobid_temp;
+extern char *uar_inc,           *uar_list_temp,   *uar_sel_jobid_temp;
 extern char *uar_sel_all_temp1,  *uar_sel_fileset, *uar_mediatype;
-extern char *uar_jobid_fileindex;
+extern char *uar_jobid_fileindex, *uar_dec,       *uar_sel_all_temp;
 
 
 struct NAME_LIST {
@@ -839,8 +839,24 @@ static int select_backups_before_date(UAContext *ua, RESTORE_CTX *rx, char *date
       goto bail_out;
    }
 
-   /* Now find all Incremental/Decremental Jobs after Full save */
-   Mmsg(&rx->query, uar_inc_dec, edit_uint64(rx->JobTDate, ed1), date,
+   /* Now find most recent Decremental Job after Full save, if any */
+   Mmsg(&rx->query, uar_dec, edit_uint64(rx->JobTDate, ed1), date,
+       cr.ClientId, fsr.FileSet, pool_select);
+   if (!db_sql_query(ua->db, rx->query, NULL, NULL)) {
+      bsendmsg(ua, "%s\n", db_strerror(ua->db));
+   }
+   /* Now update JobTDate to lock onto Decremental, if any */
+   rx->JobTDate = 0;
+   if (!db_sql_query(ua->db, uar_sel_all_temp, last_full_handler, (void *)rx)) {
+      bsendmsg(ua, "%s\n", db_strerror(ua->db));
+   }
+   if (rx->JobTDate == 0) {
+      bsendmsg(ua, _("No Full backup before %s found.\n"), date);
+      goto bail_out;
+   }
+
+   /* Now find all Incremental Jobs after Full/Dec save */
+   Mmsg(&rx->query, uar_inc, edit_uint64(rx->JobTDate, ed1), date,
        cr.ClientId, fsr.FileSet, pool_select);
    if (!db_sql_query(ua->db, rx->query, NULL, NULL)) {
       bsendmsg(ua, "%s\n", db_strerror(ua->db));