From 068d27aa99b1c8b1991baa175935fb4a68f128db Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Sat, 17 Jan 2004 21:01:05 +0000 Subject: [PATCH] Optimize restore for diferential backups + add *all* ACL value git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1016 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/kernstodo | 2 +- bacula/src/dird/sql_cmds.c | 23 +++++++++++++++++++++-- bacula/src/dird/ua_acl.c | 12 +++++++++++- bacula/src/dird/ua_restore.c | 24 ++++++++++++++++++++---- 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/bacula/kernstodo b/bacula/kernstodo index fe59a6b282..1851d9feb5 100644 --- a/bacula/kernstodo +++ b/bacula/kernstodo @@ -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?). - diff --git a/bacula/src/dird/sql_cmds.c b/bacula/src/dird/sql_cmds.c index e5f8983ace..6ba625abec 100644 --- a/bacula/src/dird/sql_cmds.c +++ b/bacula/src/dird/sql_cmds.c @@ -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," diff --git a/bacula/src/dird/ua_acl.c b/bacula/src/dird/ua_acl.c index 11a9053604..cb184a0a88 100644 --- a/bacula/src/dird/ua_acl.c +++ b/bacula/src/dird/ua_acl.c @@ -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; isize(); i++) { if (strncasecmp(item, (char *)list->get(i), len) == 0) { Dmsg3(400, "Found %s in %d %s\n", item, acl, (char *)list->get(i)); diff --git a/bacula/src/dird/ua_restore.c b/bacula/src/dird/ua_restore.c index 6b99e2a7cd..dc4e15b279 100644 --- a/bacula/src/dird/ua_restore.c +++ b/bacula/src/dird/ua_restore.c @@ -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)); -- 2.39.5