extern char *uar_jobid_fileindex_from_dir;
-struct NAME_LIST {
- char **name; /* list of names */
- int num_ids; /* ids stored */
- int max_ids; /* size of array */
- int num_del; /* number deleted */
- int tot_ids; /* total to process */
-};
-
-
-/* Main structure for obtaining JobIds or Files to be restored */
-struct RESTORE_CTX {
- utime_t JobTDate;
- uint32_t TotalFiles;
- uint32_t JobId;
- char ClientName[MAX_NAME_LENGTH];
- char last_jobid[20];
- POOLMEM *JobIds; /* User entered string of JobIds */
- STORE *store;
- JOB *restore_job;
- POOL *pool;
- int restore_jobs;
- uint32_t selected_files;
- char *where;
- RBSR *bsr;
- POOLMEM *fname; /* filename only */
- POOLMEM *path; /* path only */
- POOLMEM *query;
- int fnl; /* filename length */
- int pnl; /* path length */
- bool found;
- bool all; /* mark all as default */
- NAME_LIST name_list;
-};
-
-
-#define MAX_ID_LIST_LEN 1000000
-
/* Forward referenced functions */
static int last_full_handler(void *ctx, int num_fields, char **row);
static int jobid_handler(void *ctx, int num_fields, char **row);
-static int get_next_jobid_from_list(char **p, uint32_t *JobId);
static int user_select_jobids_or_files(UAContext *ua, RESTORE_CTX *rx);
static int fileset_handler(void *ctx, int num_fields, char **row);
static void print_name_list(UAContext *ua, NAME_LIST *name_list);
}
if (rx.bsr->JobId) {
+ uint32_t selected_files;
if (!complete_bsr(ua, rx.bsr)) { /* find Vol, SessId, SessTime from JobIds */
bsendmsg(ua, _("Unable to construct a valid BSR. Cannot continue.\n"));
goto bail_out;
}
- if (!(rx.selected_files = write_bsr_file(ua, rx.bsr))) {
+ if (!(selected_files = write_bsr_file(ua, rx))) {
bsendmsg(ua, _("No files selected to be restored.\n"));
goto bail_out;
}
- bsendmsg(ua, _("\n%u file%s selected to be restored.\n\n"), rx.selected_files,
- rx.selected_files==1?"":"s");
+ /* If no count of files, use bsr generated value (often wrong) */
+ if (rx.selected_files == 0) {
+ rx.selected_files = selected_files;
+ }
+ if (rx.selected_files==1) {
+ bsendmsg(ua, _("\n1 file selected to be restored.\n\n"));
+ }
+ else {
+ bsendmsg(ua, _("\n%u files selected to be restored.\n\n"), rx.selected_files);
+ }
} else {
bsendmsg(ua, _("No files selected to be restored.\n"));
goto bail_out;
fname, rx.selected_files, ua->catalog->hdr.name);
}
free_pool_memory(fname);
- if (find_arg(ua, _("yes")) > 0) {
+ 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);
if (!rx->ClientName[0]) {
CLIENT_DBR cr;
/* try command line argument */
- int i = find_arg_with_value(ua, _("client"));
+ int i = find_arg_with_value(ua, N_("client"));
if (i >= 0) {
bstrncpy(rx->ClientName, ua->argv[i], sizeof(rx->ClientName));
return 1;
bool done = false;
int i, j;
const char *list[] = {
- "List last 20 Jobs run",
- "List Jobs where a given File is saved",
- "Enter list of comma separated JobIds to select",
- "Enter SQL list command",
- "Select the most recent backup for a client",
- "Select backup for a client before a specified time",
- "Enter a list of files to restore",
- "Enter a list of files to restore before a specified time",
- "Find the JobIds of the most recent backup for a client",
- "Find the JobIds for a backup for a client before a specified time",
- "Enter a list of directories to restore for found JobIds",
- "Cancel",
+ _("List last 20 Jobs run"),
+ _("List Jobs where a given File is saved"),
+ _("Enter list of comma separated JobIds to select"),
+ _("Enter SQL list command"),
+ _("Select the most recent backup for a client"),
+ _("Select backup for a client before a specified time"),
+ _("Enter a list of files to restore"),
+ _("Enter a list of files to restore before a specified time"),
+ _("Find the JobIds of the most recent backup for a client"),
+ _("Find the JobIds for a backup for a client before a specified time"),
+ _("Enter a list of directories to restore for found JobIds"),
+ _("Cancel"),
NULL };
const char *kw[] = {
bsendmsg(ua, _("No Jobs selected.\n"));
return 0;
}
- bsendmsg(ua, _("You have selected the following JobId%s: %s\n"),
- strchr(rx->JobIds,',')?"s":"",rx->JobIds);
+ if (strchr(rx->JobIds,',')) {
+ bsendmsg(ua, _("You have selected the following JobIds: %s\n"), rx->JobIds);
+ }
+ else {
+ bsendmsg(ua, _("You have selected the following JobId: %s\n"), rx->JobIds);
+ }
memset(&jr, 0, sizeof(JOB_DBR));
}
}
if (tree.FileCount == 0) {
- bsendmsg(ua, "\nThere were no files inserted into the tree, so file selection\n"
- "is not possible.Most likely your retention policy pruned the files\n");
+ bsendmsg(ua, _("\nThere were no files inserted into the tree, so file selection\n"
+ "is not possible.Most likely your retention policy pruned the files\n"));
if (!get_yesno(ua, _("\nDo you want to restore all the files? (yes|no): "))) {
OK = false;
} else {
}
} else {
char ec1[50];
- bsendmsg(ua, "\n%d Job%s, %s files inserted into the tree%s.\n",
- items, items==1?"":"s", edit_uint64_with_commas(tree.FileCount, ec1),
- tree.all?" and marked for extraction":"");
+ if (items==1) {
+ if (tree.all) {
+ bsendmsg(ua, _("\n1 Job, %s files inserted into the tree and marked for extraction.\n"),
+ edit_uint64_with_commas(tree.FileCount, ec1));
+ }
+ else {
+ bsendmsg(ua, _("\n1 Job, %s files inserted into the tree.\n"),
+ edit_uint64_with_commas(tree.FileCount, ec1));
+ }
+ }
+ else {
+ if (tree.all) {
+ bsendmsg(ua, _("\n%d Jobs, %s files inserted into the tree and marked for extraction.\n"),
+ items, edit_uint64_with_commas(tree.FileCount, ec1));
+ }
+ else {
+ bsendmsg(ua, _("\n%d Jobs, %s files inserted into the tree.\n"),
+ items, edit_uint64_with_commas(tree.FileCount, ec1));
+ }
+ }
/* Check MediaType and select storage that corresponds */
get_storage_from_mediatype(ua, &rx->name_list, rx);
- if (find_arg(ua, _("done")) < 0) {
+ if (find_arg(ua, N_("done")) < 0) {
/* Let the user interact in selecting which files to restore */
OK = user_select_files_from_tree(&tree);
}
/* Return next JobId from comma separated list */
-static int get_next_jobid_from_list(char **p, uint32_t *JobId)
+int get_next_jobid_from_list(char **p, JobId_t *JobId)
{
char jobid[30];
char *q = *p;