return nb_record == limit;
}
-void build_ls_files_query(BDB *db, POOL_MEM &query,
+/* List all files from a set of jobs */
+bool Bvfs::ls_all_files()
+{
+ POOL_MEM query;
+ POOL_MEM filter;
+
+ if (*jobids == 0) {
+ return false;
+ }
+
+ if (*pattern) {
+ Mmsg(filter, " AND File.Filename %s '%s' ",
+ match_query[db->bdb_get_type_index()], pattern);
+
+ } else if (*filename) {
+ Mmsg(filter, " AND File.Filename = '%s' ", filename);
+ }
+
+ Mmsg(query, sql_bvfs_list_all_files[db->bdb_get_type_index()],
+ filter.c_str(), jobids, limit, offset);
+
+ /* TODO: check all parent directories to know if we can
+ * list the files here.
+ */
+ Dmsg1(dbglevel_sql, "q=%s\n", query.c_str());
+
+ db->bdb_lock();
+ db->bdb_sql_query(query.c_str(), list_entries, user_data);
+ nb_record = db->sql_num_rows();
+ db->bdb_unlock();
+
+ return nb_record == limit;
+}
+
+static void build_ls_files_query(BDB *db, POOL_MEM &query,
const char *JobId, const char *PathId,
const char *filter, int64_t limit, int64_t offset)
{
default_sql_bvfs_select
};
+static const char *sql_bvfs_list_all_files_default =
+"SELECT 'F', File.PathId, Path.Path || File.Filename, "
+ "File.JobId, File.LStat, File.FileId "
+"FROM Job JOIN File USING (JobId) JOIN Path USING (PathId) "
+"WHERE File.Filename != '' "
+ "AND File.FileIndex > 0 "
+ " %s " /* AND Name LIKE '' */
+ "AND Job.JobId IN ( %s) ORDER BY File.FileId " // Needed to support LIMIT/OFFSET
+ "LIMIT %lld OFFSET %lld";
+
+const char *sql_bvfs_list_all_files[] = {
+ /* MySQL */
+"SELECT 'F', File.PathId, CONCAT(Path.Path, File.Filename), "
+ "File.JobId, File.LStat, File.FileId "
+"FROM Job JOIN File USING (JobId) JOIN Path USING (PathId) "
+"WHERE File.Filename != '' "
+ "AND File.FileIndex > 0 "
+ " %s " /* AND Name LIKE '' */
+ "AND Job.JobId IN (%s) ORDER BY File.FileId " // Needed to support LIMIT/OFFSET
+ "LIMIT %lld OFFSET %lld",
+
+ /* PostgreSQL */
+ sql_bvfs_list_all_files_default,
+
+ /* SQLite */
+ sql_bvfs_list_all_files_default
+};
+
static const char *sql_bvfs_list_files_default =
"SELECT 'F', T.PathId, T.Filename, "
"File.JobId, File.LStat, File.FileId "
static bool dot_ls_cmd(UAContext *ua, const char *cmd);
static bool dot_bvfs_lsdirs(UAContext *ua, const char *cmd);
static bool dot_bvfs_lsfiles(UAContext *ua, const char *cmd);
+static bool dot_bvfs_ls_all_files(UAContext *ua, const char *cmd);
static bool dot_bvfs_update(UAContext *ua, const char *cmd);
static bool dot_bvfs_get_jobids(UAContext *ua, const char *cmd);
static bool dot_bvfs_versions(UAContext *ua, const char *cmd);
{ NT_(".actiononpurge"),aopcmd, NULL, true},
{ NT_(".bvfs_lsdirs"), dot_bvfs_lsdirs, NULL, true},
{ NT_(".bvfs_lsfiles"),dot_bvfs_lsfiles, NULL, true},
+ { NT_(".bvfs_ls_all_files"),dot_bvfs_ls_all_files, NULL, true},
{ NT_(".bvfs_get_volumes"),dot_bvfs_get_volumes,NULL, true},
{ NT_(".bvfs_update"), dot_bvfs_update, NULL, true},
{ NT_(".bvfs_get_jobids"), dot_bvfs_get_jobids, NULL, true},
char **username,
int *limit, int *offset)
{
- *pathid=0;
+ if (pathid) {
+ *pathid=0;
+ }
+ if (path) {
+ *path=NULL;
+ }
*limit=2000;
*offset=0;
- *path=NULL;
*username=NULL;
if (jobid) {
*jobid=NULL;
if (!ua->argv[i]) {
continue;
}
- if (strcasecmp(ua->argk[i], NT_("pathid")) == 0) {
+ if (pathid && strcasecmp(ua->argk[i], NT_("pathid")) == 0) {
if (is_a_number(ua->argv[i])) {
*pathid = str_to_int64(ua->argv[i]);
}
}
- if (strcasecmp(ua->argk[i], NT_("path")) == 0) {
+ if (path && strcasecmp(ua->argk[i], NT_("path")) == 0) {
*path = ua->argv[i];
}
return false;
}
- if (!(*pathid || *path)) {
- return false;
+ if (path && pathid) {
+ if (!(*pathid || *path)) {
+ return false;
+ }
}
return true;
return true;
}
+/*
+ * .bvfs_ls_all_files jobid=1,2,3,4
+ */
+static bool dot_bvfs_ls_all_files(UAContext *ua, const char *cmd)
+{
+ int limit=2000, offset=0;
+ char *jobid=NULL, *username=NULL;
+ char *pattern=NULL, *filename=NULL;
+ int i;
+
+ if (!bvfs_parse_arg(ua, NULL, NULL, &jobid, &username,
+ &limit, &offset))
+ {
+ ua->error_msg("Can't find jobid argument\n");
+ return true; /* not enough param */
+ }
+ if ((i = find_arg_with_value(ua, "pattern")) >= 0) {
+ pattern = ua->argv[i];
+ }
+ if ((i = find_arg_with_value(ua, "filename")) >= 0) {
+ filename = ua->argv[i];
+ }
+
+ if (!open_new_client_db(ua)) {
+ return 1;
+ }
+
+ Bvfs fs(ua->jcr, ua->db);
+ bvfs_set_acl(ua, &fs);
+ fs.set_username(username);
+ if (str_to_int64(jobid) == 0) {
+ if (get_client_jobids(ua, &fs) <= 0) {
+ goto bail_out;
+ }
+ } else {
+ fs.set_jobids(jobid);
+ }
+ fs.set_handler(bvfs_result_handler, ua);
+ fs.set_limit(limit);
+ ua->bvfs = &fs;
+ if (pattern) {
+ fs.set_pattern(pattern);
+ }
+ if (filename) {
+ fs.set_filename(filename);
+ }
+
+ fs.set_offset(offset);
+ fs.ls_all_files();
+
+bail_out:
+ ua->bvfs = NULL;
+ return true;
+}
+
/*
* .bvfs_lsdirs jobid=1,2,3,4 pathid=10
* .bvfs_lsdirs jobid=1,2,3,4 path=/