]> 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 57c5d9a7348f0e48af708d7034eca9aceec956bd..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
@@ -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]);
@@ -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)
 {