]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/ua_restore.c
- Back port changes to 1.38.5
[bacula/bacula] / bacula / src / dird / ua_restore.c
index 37a88125742e2432273b701b0ae67101ae7abcfb..9fd21a4e7264d47024e8682312d86a8458b7aac4 100644 (file)
@@ -44,6 +44,7 @@ extern char *uar_sel_all_temp1,  *uar_sel_fileset, *uar_mediatype;
 extern char *uar_jobid_fileindex, *uar_dif,        *uar_sel_all_temp;
 extern char *uar_count_files,     *uar_jobids_fileindex;
 extern char *uar_jobid_fileindex_from_dir;
+extern char *uar_jobid_fileindex_from_table;
 
 
 
@@ -69,6 +70,7 @@ static void insert_one_file_or_dir(UAContext *ua, RESTORE_CTX *rx, char *date, b
 static int get_client_name(UAContext *ua, RESTORE_CTX *rx);
 static int get_date(UAContext *ua, char *date, int date_len);
 static int count_handler(void *ctx, int num_fields, char **row);
+static bool insert_table_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *table);
 
 /*
  *   Restore files
@@ -194,7 +196,7 @@ int restore_cmd(UAContext *ua, const char *cmd)
    if (find_arg(ua, N_("yes")) > 0) {
       pm_strcat(ua->cmd, " yes");    /* pass it on to the run command */
    }
-   Dmsg1(400, "Submitting: %s\n", ua->cmd);
+   Dmsg1(100, "Submitting: %s\n", ua->cmd);
    parse_ua_args(ua);
    run_cmd(ua, ua->cmd);
    free_rx(&rx);
@@ -229,6 +231,15 @@ static void free_rx(RESTORE_CTX *rx)
    free_name_list(&rx->name_list);
 }
 
+static bool has_value(UAContext *ua, int i)
+{
+   if (!ua->argv[i]) {
+      bsendmsg(ua, _("Missing value for keyword: %s\n"), ua->argk[i]);
+      return false;
+   }
+   return true;
+}
+
 static int get_client_name(UAContext *ua, RESTORE_CTX *rx)
 {
    /* If no client name specified yet, get it now */
@@ -237,6 +248,9 @@ static int get_client_name(UAContext *ua, RESTORE_CTX *rx)
       /* try command line argument */
       int i = find_arg_with_value(ua, N_("client"));
       if (i >= 0) {
+         if (!has_value(ua, i)) {
+            return 0;
+         }
          bstrncpy(rx->ClientName, ua->argv[i], sizeof(rx->ClientName));
          return 1;
       }
@@ -249,6 +263,7 @@ static int get_client_name(UAContext *ua, RESTORE_CTX *rx)
    return 1;
 }
 
+
 /*
  * The first step in the restore process is for the user to
  *  select a list of JobIds from which he will subsequently
@@ -321,6 +336,9 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
       /* Found keyword in kw[] list, process it */
       switch (j) {
       case 0:                            /* jobid */
+         if (!has_value(ua, i)) {
+            return 0;
+         }
          if (*rx->JobIds != 0) {
             pm_strcat(rx->JobIds, ",");
          }
@@ -332,6 +350,9 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
          have_date = true;
          break;
       case 2:                            /* before */
+         if (!has_value(ua, i)) {
+            return 0;
+         }
          if (str_to_utime(ua->argv[i]) == 0) {
             bsendmsg(ua, _("Improper date format: %s\n"), ua->argv[i]);
             return 0;
@@ -341,6 +362,9 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
          break;
       case 3:                            /* file */
       case 4:                            /* dir */
+         if (!has_value(ua, i)) {
+            return 0;
+         }
          if (!have_date) {
             bstrutime(date, sizeof(date), time(NULL));
          }
@@ -365,6 +389,9 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
          done = true;
          break;
       case 6:                            /* pool specified */
+         if (!has_value(ua, i)) {
+            return 0;
+         }
          rx->pool = (POOL *)GetResWithName(R_POOL, ua->argv[i]);
          if (!rx->pool) {
             bsendmsg(ua, _("Error: Pool resource \"%s\" does not exist.\n"), ua->argv[i]);
@@ -409,7 +436,7 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
       }
       done = true;
       switch (do_prompt(ua, "", _("Select item: "), NULL, 0)) {
-      case -1:                        /* error */
+      case -1:                        /* error or cancel */
          return 0;
       case 0:                         /* list last 20 Jobs run */
          gui_save = ua->jcr->gui;
@@ -589,7 +616,6 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
       bsendmsg(ua, _("You have selected the following JobId: %s\n"), rx->JobIds);
    }
 
-   memset(&jr, 0, sizeof(JOB_DBR));
 
    rx->TotalFiles = 0;
    for (p=rx->JobIds; ; ) {
@@ -604,6 +630,7 @@ static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx)
       if (jr.JobId == JobId) {
          continue;                    /* duplicate of last JobId */
       }
+      memset(&jr, 0, sizeof(JOB_DBR));
       jr.JobId = JobId;
       if (!db_get_job_record(ua->jcr, ua->db, &jr)) {
          char ed1[50];
@@ -674,6 +701,10 @@ static void insert_one_file_or_dir(UAContext *ua, RESTORE_CTX *rx, char *date, b
       }
       fclose(ffd);
       break;
+   case '?':
+      p++;
+      insert_table_into_findex_list(ua, rx, p);
+      break;
    default:
       if (dir) {
          insert_dir_into_findex_list(ua, rx, ua->cmd, date);
@@ -762,6 +793,36 @@ static bool insert_dir_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *di
    return true;
 }
 
+/*
+ * Get the JobId and FileIndexes of all files in the specified table
+ */
+static bool insert_table_into_findex_list(UAContext *ua, RESTORE_CTX *rx, char *table)
+{
+   char ed1[50];
+
+   strip_trailing_junk(table);
+   Mmsg(rx->query, uar_jobid_fileindex_from_table, table);
+
+   rx->found = false;
+   /* Find and insert jobid and File Index */
+   if (!db_sql_query(ua->db, rx->query, jobid_fileindex_handler, (void *)rx)) {
+      bsendmsg(ua, _("Query failed: %s. ERR=%s\n"),
+         rx->query, db_strerror(ua->db));
+   }
+   if (!rx->found) {
+      bsendmsg(ua, _("No table found: %s\n"), table);
+      return true;
+   }
+   /*
+    * Find the MediaTypes for this JobId and add to the name_list
+    */
+   Mmsg(rx->query, uar_mediatype, edit_int64(rx->JobId, ed1));
+   if (!db_sql_query(ua->db, rx->query, unique_name_list_handler, (void *)&rx->name_list)) {
+      bsendmsg(ua, "%s", db_strerror(ua->db));
+      return false;
+   }
+   return true;
+}
 
 static void split_path_and_filename(RESTORE_CTX *rx, char *name)
 {