- 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.
directories, setting them to be restored.
- Figure out a way to set restore on a directory without recursively
decending. (recurse off?).
-
"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 "
"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";
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,"
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));
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 {
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));