HORZ_LIST, /* list */
VERT_LIST, /* llist */
ARG_LIST, /* key1=v1 key2=v2 key3=v3 */
+ JSON_LIST,
FAILED_JOBS,
INCOMPLETE_JOBS
};
if (type == ARG_LIST) {
goto arg_list;
}
-
+ if (type == JSON_LIST) {
+ goto json_list;
+ }
+
Dmsg1(800, "list_result starts second loop looking at %d fields\n",
mdb->sql_num_fields());
}
send(ctx, "\n");
return 0;
-
+
+json_list:
+ POOL_MEM tmp, qval, qkey;
+ bool first=true;
+
+ Dmsg1(800, "list_result starts json list at %d fields\n", mdb->sql_num_fields());
+ mdb->sql_field_seek(0);
+
+ send(ctx, "{");
+ for (i = 0; i < mdb->sql_num_fields(); i++) {
+ field = mdb->sql_fetch_field();
+ if (!field) {
+ break;
+ }
+ quote_string(qkey.addr(), field->name);
+ lcase(qkey.c_str());
+ if (!mdb->sql_field_is_numeric(field->type)) {
+ quote_string(qval.addr(), NPRTB(row[i]));
+ } else {
+ pm_strcpy(qval, row[i]);
+ }
+ Mmsg(tmp, "%s%s: %s", first?"":",", qkey.c_str(), qval.c_str());
+ send(ctx, tmp.c_str());
+ first = false;
+ }
+ send(ctx, "}\n");
+ return 0;
}
/*
char buf[2000], ewc[30];
Dmsg0(800, "list_result starts\n");
- if (mdb->sql_num_rows() == 0) {
- send(ctx, _("No results to list.\n"));
+ if (mdb->sql_num_rows() == 0) {
+ if (type == JSON_LIST) {
+ send(ctx, "[]\n");
+ } else {
+ send(ctx, _("No results to list.\n"));
+ }
return mdb->sql_num_rows();
}
if (type == ARG_LIST) {
goto arg_list;
}
-
+ if (type == JSON_LIST) {
+ goto json_list;
+ }
+
Dmsg1(800, "list_result starts second loop looking at %d fields\n", mdb->sql_num_fields());
list_dashes(mdb, send, ctx);
send(ctx, "|");
list_dashes(mdb, send, ctx);
return mdb->sql_num_rows();
-vertical_list:
-
+vertical_list:
Dmsg1(800, "list_result starts vertical list at %d fields\n", mdb->sql_num_fields());
while ((row = mdb->sql_fetch_row()) != NULL) {
mdb->sql_field_seek(0);
send(ctx, "\n");
}
-arg_list:
-
+arg_list:
Dmsg1(800, "list_result starts arg list at %d fields\n", mdb->sql_num_fields());
while ((row = mdb->sql_fetch_row()) != NULL) {
mdb->sql_field_seek(0);
}
send(ctx, "\n");
}
- return mdb->sql_num_rows();
+ return mdb->sql_num_rows();
+
+json_list:
+ Dmsg1(800, "list_result starts json list at %d fields\n", mdb->sql_num_fields());
+ POOL_MEM tmp, qval, qkey;
+ bool rfirst=true;
+ send(ctx, "[");
+ while ((row = mdb->sql_fetch_row()) != NULL) {
+ bool first=true;
+ send(ctx, rfirst?"{" : ",{");
+ rfirst = false;
+
+ mdb->sql_field_seek(0);
+ for (i = 0; i < mdb->sql_num_fields(); i++) {
+ field = mdb->sql_fetch_field();
+ if (!field) {
+ break;
+ }
+ quote_string(qkey.addr(), field->name);
+ lcase(qkey.c_str());
+ if (!mdb->sql_field_is_numeric(field->type)) {
+ quote_string(qval.addr(), NPRTB(row[i]));
+ } else {
+ pm_strcpy(qval, row[i]);
+ }
+ Mmsg(tmp, "%s%s: %s", first?"":",", qkey.c_str(), qval.c_str());
+ send(ctx, tmp.c_str());
+ first = false;
+ }
+ send(ctx, "}");
+ }
+ send(ctx, "]\n");
+ return mdb->sql_num_rows();
}
/*
aclbits |= DB_ACL_BIT(DB_ACL_JOB);
aclbits_extra |= DB_ACL_BIT(DB_ACL_JOB);
}
-
if (*Name) {
db->bdb_escape_string(jcr, esc_name, Name, strlen(Name));
}
bdb_lock();
bdb_escape_string(jcr, esc, pdbr->Name, strlen(pdbr->Name));
- if (type == VERT_LIST) {
+ if (type == VERT_LIST || type == JSON_LIST) {
if (pdbr->Name[0] != 0) {
Mmsg(cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,"
"AcceptAnyVolume,VolRetention,VolUseDuration,MaxVolJobs,MaxVolBytes,"
void BDB::bdb_list_client_records(JCR *jcr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
{
bdb_lock();
- if (type == VERT_LIST) {
+ if (type == VERT_LIST || type == JSON_LIST) {
Mmsg(cmd, "SELECT ClientId,Name,Uname,AutoPrune,FileRetention,"
"JobRetention "
"FROM Client %s ORDER BY ClientId", get_acl(DB_ACL_CLIENT, true));
}
switch (type) {
+ case JSON_LIST:
case VERT_LIST:
Mmsg(cmd,
"SELECT Object.ObjectId, Object.JobId, Object.Path, Object.Filename, Object.PluginName, Object.ObjectCategory, "
POOL_MEM msg;
switch (type) {
+ case JSON_LIST:
case VERT_LIST:
Mmsg(cmd,
"SELECT Object.ObjectId, Object.JobId, Object.Path, Object.Filename, Object.PluginName, Object.ObjectCategory, "
}
bdb_lock();
- if (type == VERT_LIST) {
+ if (type == VERT_LIST || type == JSON_LIST) {
Mmsg(cmd, "SELECT JobId, RestoreObjectId, ObjectName, "
"PluginName, ObjectType "
"FROM RestoreObject JOIN Job USING (JobId) WHERE JobId IN (%s) %s "
const char *where = get_acl(DB_ACL_POOL, false);
const char *join = *where ? get_acl_join_filter(DB_ACL_BIT(DB_ACL_POOL)) : "";
- if (type == VERT_LIST) {
+ if (type == VERT_LIST || type == JSON_LIST) {
if (mdbr->VolumeName[0] != 0) {
Mmsg(cmd, "SELECT MediaId,VolumeName,Slot,PoolId,"
"MediaType,MediaTypeId,FirstWritten,LastWritten,LabelDate,VolJobs,"
DB_ACL_BIT(DB_ACL_FILESET) |
DB_ACL_BIT(DB_ACL_CLIENT)) : "";
- if (type == VERT_LIST) {
+ if (type == VERT_LIST || type == JSON_LIST) {
if (JobId > 0) { /* do by JobId */
Mmsg(cmd, "SELECT JobMediaId,JobId,Media.MediaId,Media.VolumeName,"
"FirstIndex,LastIndex,StartFile,JobMedia.EndFile,StartBlock,"
}
bdb_lock();
- if (type == VERT_LIST) {
+ if (type == VERT_LIST || type == JSON_LIST) {
Mmsg(cmd, "SELECT JobId,FileIndex,Media.MediaId,Media.VolumeName,"
"BlockAddress,RecordNo,FileOffset "
"FROM FileMedia,Media WHERE Media.MediaId=FileMedia.MediaId "
DB_ACL_BIT(DB_ACL_FILESET) |
DB_ACL_BIT(DB_ACL_CLIENT)) : "";
- if (type == VERT_LIST) {
+ if (type == VERT_LIST || type == JSON_LIST) {
Mmsg(cmd, "SELECT Time,LogText FROM Log %s "
"WHERE Log.JobId=%s %s ORDER BY LogId ASC",
join,
}
switch (type) {
+ case JSON_LIST:
case VERT_LIST:
Mmsg(cmd,
"SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level,"
pm_strcat(filter, " ORDER BY SnapshotId DESC");
}
- if (type == VERT_LIST || type == ARG_LIST) {
+ if (type == VERT_LIST || type == ARG_LIST || type == JSON_LIST) {
Mmsg(cmd, "SELECT SnapshotId, Snapshot.Name, CreateDate, Client.Name AS Client, "
"FileSet.FileSet AS FileSet, JobId, Volume, Device, Type, Retention, Comment "
"FROM Snapshot JOIN Client USING (ClientId) LEFT JOIN FileSet USING (FileSetId) %s %s", filter, where);
extern int qhelp_cmd(UAContext *ua, const char *cmd);
extern bool dot_status_cmd(UAContext *ua, const char *cmd);
extern void bvfs_set_acl(UAContext *ua, Bvfs *bvfs);
+extern bool jlist_cmd(UAContext *ua, const char *cmd);
/* Forward referenced functions */
static bool admin_cmds(UAContext *ua, const char *cmd);
{ NT_(".help"), dot_help_cmd, NULL, false},
{ NT_(".jobs"), jobscmd, NULL, true},
{ NT_(".estimate"), dotestimatecmd, NULL, false},
+ { NT_(".jlist"), jlist_cmd, NULL, false},
{ NT_(".levels"), levelscmd, NULL, false},
{ NT_(".messages"), getmsgscmd, NULL, false},
{ NT_(".msgs"), msgscmd, NULL, false},
*/
/* Do long or full listing */
+bool jlist_cmd(UAContext *ua, const char *cmd)
+{
+ return do_list_cmd(ua, cmd, JSON_LIST);
+}
+
int llist_cmd(UAContext *ua, const char *cmd)
{
return do_list_cmd(ua, cmd, VERT_LIST);
POOL_DBR pr;
MEDIA_DBR mr;
- if (!open_new_client_db(ua))
+ if (!open_new_client_db(ua)) {
return 1;
+ }
bmemset(&jr, 0, sizeof(jr));
bmemset(&pr, 0, sizeof(pr));
} else if (B_ISALPHA(ua->argv[j][0])) {
jr.JobLevel = ua->argv[j][0]; /* TODO: Check if the code is correct */
}
- } else if (strcasecmp(ua->argk[j], NT_("level")) == 0) {
-
-
} else if (strcasecmp(ua->argk[j], NT_("client")) == 0) {
if (is_name_valid(ua->argv[j], NULL)) {
CLIENT_DBR cr;
/* List JOBID=nn */
} else if (strcasecmp(ua->argk[i], NT_("jobid")) == 0) {
if (ua->argv[i]) {
- jobid = str_to_int64(ua->argv[i]);
- if (jobid > 0) {
- jr.JobId = jobid;
- db_list_job_records(ua->jcr, ua->db, &jr, prtit, ua, llist);
+ /* .jlist joblog jobid=1 should display only one json struct */
+ if (llist == JSON_LIST && i > 1) {
+ /* nop */
+ } else {
+ jobid = str_to_int64(ua->argv[i]);
+ if (jobid > 0) {
+ jr.JobId = jobid;
+ db_list_job_records(ua->jcr, ua->db, &jr, prtit, ua, llist);
+ }
}
}