}
/*
- * Get all file versions for a specified client
+ * Get all file versions for a specified list of clients
* TODO: Handle basejobs using different client
*/
-void Bvfs::get_all_file_versions(DBId_t pathid, FileId_t fnid, const char *client)
+void Bvfs::get_all_file_versions(DBId_t pathid, FileId_t fnid, alist *clients)
{
- Dmsg3(dbglevel, "get_all_file_versions(%lld, %lld, %s)\n", (uint64_t)pathid,
- (uint64_t)fnid, client);
- char ed1[50], ed2[50];
- POOL_MEM q;
+ char ed1[50], ed2[50], *eclients;
+ POOL_MEM q, query;
+
if (see_copies) {
Mmsg(q, " AND Job.Type IN ('C', 'B') ");
} else {
Mmsg(q, " AND Job.Type = 'B' ");
}
- POOL_MEM query;
+ eclients = escape_list(clients);
+
+ Dmsg3(dbglevel, "get_all_file_versions(%lld, %lld, %s)\n", (uint64_t)pathid,
+ (uint64_t)fnid, eclients);
Mmsg(query,// 1 2 3 4
"SELECT 'V', File.PathId, File.FilenameId, 0, File.JobId, "
"AND File.FileIndex <= JobMedia.LastIndex "
"AND JobMedia.MediaId = Media.MediaId "
"AND Job.ClientId = Client.ClientId "
- "AND Client.Name = '%s' "
+ "AND Client.Name IN (%s) "
"%s ORDER BY FileId LIMIT %d OFFSET %d"
- ,edit_uint64(fnid, ed1), edit_uint64(pathid, ed2), client, q.c_str(),
+ ,edit_uint64(fnid, ed1), edit_uint64(pathid, ed2), eclients, q.c_str(),
limit, offset);
Dmsg1(dbglevel_sql, "q=%s\n", query.c_str());
db->bdb_sql_query(query.c_str(), list_entries, user_data);
return 0;
}
+static void parse_list(char *items, alist *list)
+{
+ char *start;
+ for(char *p = start = items; *p ; p++) {
+ if (*p == ',') {
+ *p = 0;
+ if (p > start) {
+ list->append(bstrdup(start));
+ }
+ *p = ',';
+ start = p + 1;
+ }
+ }
+ if (*start) {
+ list->append(bstrdup(start));
+ }
+}
+
static bool bvfs_parse_arg_version(UAContext *ua,
char **client,
+ alist *clients,
FileId_t *fnid,
bool *versions,
bool *copies)
if (strcasecmp(ua->argk[i], NT_("client")) == 0) {
*client = ua->argv[i];
+ if (clients) {
+ clients->append(bstrdup(*client));
+ }
+ }
+
+ if (clients != NULL && strcasecmp(ua->argk[i], NT_("clients")) == 0) {
+ /* Turn client1,client2,client3 to a alist of clients */
+ parse_list(ua->argv[i], clients);
}
if (copies && strcasecmp(ua->argk[i], NT_("copies")) == 0) {
*versions = true;
}
}
- return (*client && *fnid > 0);
+ return ((*client || (clients && clients->size() > 0)) && *fnid > 0);
}
static bool bvfs_parse_arg(UAContext *ua,
int limit=2000, offset=0;
char *path=NULL, *client=NULL, *username=NULL;
bool copies=false, versions=false;
+ alist clients(10, owned_by_alist);
if (!bvfs_parse_arg(ua, &pathid, &path, NULL, &username,
&limit, &offset))
{
return true; /* not enough param */
}
- if (!bvfs_parse_arg_version(ua, &client, &fnid, &versions, &copies))
+ if (!bvfs_parse_arg_version(ua, &client, &clients, &fnid, &versions, &copies))
{
ua->error_msg("Can't find client or fnid argument\n");
return true; /* not enough param */
fs.set_offset(offset);
ua->bvfs = &fs;
- fs.get_all_file_versions(pathid, fnid, client);
+ fs.get_all_file_versions(pathid, fnid, &clients);
ua->bvfs = NULL;
return true;
} else if ((pos = find_arg_with_value(ua, "ujobid")) >= 0) {
bstrncpy(jr.Job, ua->argv[pos], MAX_NAME_LENGTH);
- /* Return all backup jobid for a client */
- } else if ((pos = find_arg_with_value(ua, "client")) >= 0) {
- CLIENT *cli;
+ /* Return all backup jobid for a client list */
+ } else if ((pos = find_arg_with_value(ua, "client")) >= 0 ||
+ (pos = find_arg_with_value(ua, "clients")) >= 0) {
POOL_MEM where;
char limit[50];
bool ret;
int nbjobs;
+ alist clients(10, owned_by_alist);
- cli = GetClientResWithName(ua->argv[pos]);
- if (!cli) {
- ua->error_msg(_("Unable to get Client record for Client=%s\n"),
- ua->argv[pos]);
- return true;
- }
- db_lock(ua->db);
+ /* Turn client1,client2,client3 to a alist of clients */
+ parse_list(ua->argv[pos], &clients);
+ db_lock(ua->db);
bvfs_get_filter(ua, where, limit, sizeof(limit));
-
Mmsg(ua->db->cmd,
"SELECT JobId "
"FROM Job JOIN Client USING (ClientId) "
- "WHERE Client.Name = '%s' "
+ "WHERE Client.Name IN (%s) "
"AND Job.Type = 'B' AND Job.JobStatus IN ('T', 'W') %s "
"ORDER By JobTDate ASC %s",
- cli->name(), where.c_str(), limit);
+ fs.escape_list(&clients),
+ where.c_str(), limit);
ret = db_sql_query(ua->db, ua->db->cmd, db_list_handler, &jobids);
db_unlock(ua->db);
if (!ret) {
ua->error_msg(_("Unable to get last Job record for Client=%s\n"),
- cli->name());
+ ua->argv[pos]);
}
nbjobs = fs.set_jobids(jobids.list);
}
if (fnid && client) {
+ alist clients(1, not_owned_by_alist);
+ clients.append(client);
Pmsg0(0, "---------------------------------------------\n");
Pmsg1(0, "Getting file version for %s\n", file);
- fs.get_all_file_versions(fs.get_pwd(), fnid, client);
+ fs.get_all_file_versions(fs.get_pwd(), fnid, &clients);
}
exit (0);
fs.ls_dirs();
fs.ls_files();
- fs.get_all_file_versions(1, 347, "zog4-fd");
+ fs.get_all_file_versions(1, 347, (char*)"zog4-fd");
char p[200];
strcpy(p, "/tmp/toto/rep/");