From a79b6393d20c8d689a494fc380fb00dbece6439f Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Thu, 3 Apr 2003 16:01:58 +0000 Subject: [PATCH] Fix NumVols in Pools, implement full listing of DB tables git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@414 91ce42f0-d328-0410-95d8-f526ca767f89 --- bacula/scripts/startmysql.in | 4 +- bacula/src/cats/create_mysql_database.in | 2 +- bacula/src/cats/create_sqlite_database.in | 2 +- bacula/src/cats/drop_mysql_tables.in | 2 +- bacula/src/cats/grant_mysql_privileges.in | 2 +- bacula/src/cats/make_mysql_tables.in | 2 +- bacula/src/cats/make_sqlite_tables.in | 2 +- bacula/src/cats/mysql.c | 67 ++++++++--- bacula/src/cats/mysql.in | 2 +- bacula/src/cats/protos.h | 14 +-- bacula/src/cats/sql_list.c | 137 ++++++++++++++++------ bacula/src/cats/sqlite.c | 65 +++++++--- bacula/src/dird/backup.c | 2 +- bacula/src/dird/dird.c | 2 +- bacula/src/dird/protos.h | 40 +++---- bacula/src/dird/ua_cmds.c | 11 +- bacula/src/dird/ua_output.c | 18 +-- bacula/src/dird/ua_restore.c | 8 +- bacula/src/dird/ua_select.c | 4 +- bacula/src/version.h | 4 +- 20 files changed, 262 insertions(+), 128 deletions(-) diff --git a/bacula/scripts/startmysql.in b/bacula/scripts/startmysql.in index ee60a5b865..dc35bd786c 100755 --- a/bacula/scripts/startmysql.in +++ b/bacula/scripts/startmysql.in @@ -1,11 +1,11 @@ #!/bin/sh cd @SQL_BINDIR@ if [ -x ./safe_mysqld ]; then - ./safe_mysqld & + ./safe_mysqld $* & exit $? fi if [ -x ./mysqld_safe ]; then - ./mysqld_safe & + ./mysqld_safe $* & exit $? fi echo "Neither safe_mysqld nor mysqld_safe found!" diff --git a/bacula/src/cats/create_mysql_database.in b/bacula/src/cats/create_mysql_database.in index f0bae06f48..88753cf696 100644 --- a/bacula/src/cats/create_mysql_database.in +++ b/bacula/src/cats/create_mysql_database.in @@ -5,7 +5,7 @@ bindir=@SQL_BINDIR@ -if $bindir/mysql -f <result == NULL) { @@ -356,15 +360,27 @@ list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx) sql_field_seek(mdb, 0); for (i = 0; i < sql_num_fields(mdb); i++) { field = sql_fetch_field(mdb); - if (IS_NUM(field->type) && field->max_length > 0) { /* fixup for commas */ - field->max_length += (field->max_length - 1) / 3; - } col_len = strlen(field->name); - if (col_len < field->max_length) - col_len = field->max_length; - if (col_len < 4 && !IS_NOT_NULL(field->flags)) - col_len = 4; /* 4 = length of the word "NULL" */ - field->max_length = col_len; /* reset column info */ + if (full_list) { + if (col_len > max_len) { + max_len = col_len; + } + } else { + if (IS_NUM(field->type) && field->max_length > 0) { /* fixup for commas */ + field->max_length += (field->max_length - 1) / 3; + } + if (col_len < field->max_length) { + col_len = field->max_length; + } + if (col_len < 4 && !IS_NOT_NULL(field->flags)) { + col_len = 4; /* 4 = length of the word "NULL" */ + } + field->max_length = col_len; /* reset column info */ + } + } + + if (full_list) { + goto horizontal_list; } list_dashes(mdb, send, ctx); @@ -372,7 +388,7 @@ list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx) sql_field_seek(mdb, 0); for (i = 0; i < sql_num_fields(mdb); i++) { field = sql_fetch_field(mdb); - sprintf(buf, " %-*s |", (int)field->max_length, field->name); + bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, field->name); send(ctx, buf); } send(ctx, "\n"); @@ -384,18 +400,39 @@ list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx) for (i = 0; i < sql_num_fields(mdb); i++) { field = sql_fetch_field(mdb); if (row[i] == NULL) { - sprintf(buf, " %-*s |", (int)field->max_length, "NULL"); + bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, "NULL"); } else if (IS_NUM(field->type)) { - sprintf(buf, " %*s |", (int)field->max_length, + bsnprintf(buf, sizeof(buf), " %*s |", (int)field->max_length, add_commas(row[i], ewc)); } else { - sprintf(buf, " %-*s |", (int)field->max_length, row[i]); + bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, row[i]); } send(ctx, buf); } send(ctx, "\n"); } list_dashes(mdb, send, ctx); + return; + +horizontal_list: + + while ((row = sql_fetch_row(mdb)) != NULL) { + sql_field_seek(mdb, 0); + for (i = 0; i < sql_num_fields(mdb); i++) { + field = sql_fetch_field(mdb); + if (row[i] == NULL) { + bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL"); + } else if (IS_NUM(field->type)) { + bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, + add_commas(row[i], ewc)); + } else { + bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, row[i]); + } + send(ctx, buf); + } + send(ctx, "\n"); + } + return; } diff --git a/bacula/src/cats/mysql.in b/bacula/src/cats/mysql.in index e1252dadf2..094e3b28b4 100644 --- a/bacula/src/cats/mysql.in +++ b/bacula/src/cats/mysql.in @@ -4,4 +4,4 @@ # bindir=@SQL_BINDIR@ -$bindir/mysql bacula +$bindir/mysql $* bacula diff --git a/bacula/src/cats/protos.h b/bacula/src/cats/protos.h index d0cc24cb15..71fe9fccdd 100644 --- a/bacula/src/cats/protos.h +++ b/bacula/src/cats/protos.h @@ -51,7 +51,7 @@ int db_create_job_record(void *jcr, B_DB *db, JOB_DBR *jr); int db_create_media_record(void *jcr, B_DB *db, MEDIA_DBR *media_dbr); int db_create_client_record(void *jcr, B_DB *db, CLIENT_DBR *cr); int db_create_fileset_record(void *jcr, B_DB *db, FILESET_DBR *fsr); -int db_create_pool_record(void *jcr, B_DB *db, POOL_DBR *pool_dbr); +int db_create_pool_record(void *jcr, B_DB *db, POOL_DBR *pool_dbr); int db_create_jobmedia_record(void *jcr, B_DB *mdb, JOBMEDIA_DBR *jr); /* delete.c */ @@ -81,14 +81,14 @@ int db_get_client_record(void *jcr, B_DB *mdb, CLIENT_DBR *cdbr); /* list.c */ -void db_list_pool_records(void *jcr, B_DB *db, DB_LIST_HANDLER sendit, void *ctx); -void db_list_job_records(void *jcr, B_DB *db, JOB_DBR *jr, DB_LIST_HANDLER sendit, void *ctx); +void db_list_pool_records(void *jcr, B_DB *db, DB_LIST_HANDLER sendit, void *ctx, int full); +void db_list_job_records(void *jcr, B_DB *db, JOB_DBR *jr, DB_LIST_HANDLER sendit, void *ctx, int full); void db_list_job_totals(void *jcr, B_DB *db, JOB_DBR *jr, DB_LIST_HANDLER sendit, void *ctx); void db_list_files_for_job(void *jcr, B_DB *db, uint32_t jobid, DB_LIST_HANDLER sendit, void *ctx); -void db_list_media_records(void *jcr, B_DB *mdb, MEDIA_DBR *mdbr, DB_LIST_HANDLER *sendit, void *ctx); -void db_list_jobmedia_records(void *jcr, B_DB *mdb, uint32_t JobId, DB_LIST_HANDLER *sendit, void *ctx); -int db_list_sql_query(void *jcr, B_DB *mdb, char *query, DB_LIST_HANDLER *sendit, void *ctx, int verbose); -void db_list_client_records(void *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx); +void db_list_media_records(void *jcr, B_DB *mdb, MEDIA_DBR *mdbr, DB_LIST_HANDLER *sendit, void *ctx, int full); +void db_list_jobmedia_records(void *jcr, B_DB *mdb, uint32_t JobId, DB_LIST_HANDLER *sendit, void *ctx, int full); +int db_list_sql_query(void *jcr, B_DB *mdb, char *query, DB_LIST_HANDLER *sendit, void *ctx, int verbose, int full); +void db_list_client_records(void *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, int full); /* update.c */ int db_update_job_start_record(void *jcr, B_DB *db, JOB_DBR *jr); diff --git a/bacula/src/cats/sql_list.c b/bacula/src/cats/sql_list.c index 58676a0e5b..e53b91760c 100644 --- a/bacula/src/cats/sql_list.c +++ b/bacula/src/cats/sql_list.c @@ -44,7 +44,7 @@ */ /* Imported subroutines */ -extern void list_result(B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx); +extern void list_result(B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, int full_list); extern int QueryDB(char *file, int line, void *jcr, B_DB *db, char *select_cmd); @@ -52,7 +52,7 @@ extern int QueryDB(char *file, int line, void *jcr, B_DB *db, char *select_cmd); * Submit general SQL query */ int db_list_sql_query(void *jcr, B_DB *mdb, char *query, DB_LIST_HANDLER *sendit, - void *ctx, int verbose) + void *ctx, int verbose, int full) { db_lock(mdb); if (sql_query(mdb, query) != 0) { @@ -67,7 +67,7 @@ int db_list_sql_query(void *jcr, B_DB *mdb, char *query, DB_LIST_HANDLER *sendit mdb->result = sql_store_result(mdb); if (mdb->result) { - list_result(mdb, sendit, ctx); + list_result(mdb, sendit, ctx, full); sql_free_result(mdb); } db_unlock(mdb); @@ -75,10 +75,17 @@ int db_list_sql_query(void *jcr, B_DB *mdb, char *query, DB_LIST_HANDLER *sendit } void -db_list_pool_records(void *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx) +db_list_pool_records(void *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, int full) { - Mmsg(&mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat " -"FROM Pool ORDER BY PoolId"); + if (full) { + Mmsg(&mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog," + "AcceptAnyVolume,VolRetention,VolUseDuration,MaxVolJobs,MaxVolBytes," + "AutoPrune,Recycle,PoolType,LabelFormat " + "FROM Pool ORDER BY PoolId"); + } else { + Mmsg(&mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat " + "FROM Pool ORDER BY PoolId"); + } db_lock(mdb); if (!QUERY_DB(jcr, mdb, mdb->cmd)) { @@ -86,17 +93,23 @@ db_list_pool_records(void *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx) return; } - list_result(mdb, sendit, ctx); + list_result(mdb, sendit, ctx, full); sql_free_result(mdb); db_unlock(mdb); } void -db_list_client_records(void *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx) +db_list_client_records(void *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, int full) { - Mmsg(&mdb->cmd, "SELECT ClientId,Name,FileRetention,JobRetention " -"FROM Client ORDER BY ClientId"); + if (full) { + Mmsg(&mdb->cmd, "SELECT ClientId,Name,Uname,AutoPrune,FileRetention," + "FileRetention,JobRetention " + "FROM Client ORDER BY ClientId"); + } else { + Mmsg(&mdb->cmd, "SELECT ClientId,Name,FileRetention,JobRetention " + "FROM Client ORDER BY ClientId"); + } db_lock(mdb); if (!QUERY_DB(jcr, mdb, mdb->cmd)) { @@ -104,7 +117,7 @@ db_list_client_records(void *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx) return; } - list_result(mdb, sendit, ctx); + list_result(mdb, sendit, ctx, full); sql_free_result(mdb); db_unlock(mdb); @@ -112,11 +125,21 @@ db_list_client_records(void *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx) void -db_list_media_records(void *jcr, B_DB *mdb, MEDIA_DBR *mdbr, DB_LIST_HANDLER *sendit, void *ctx) +db_list_media_records(void *jcr, B_DB *mdb, MEDIA_DBR *mdbr, + DB_LIST_HANDLER *sendit, void *ctx, int full) { - Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,MediaType,VolStatus,\ -VolBytes,LastWritten,VolRetention,Recycle,Slot \ -FROM Media WHERE Media.PoolId=%u ORDER BY MediaId", mdbr->PoolId); + if (full) { + Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,Slot,PoolId," + "MediaType,FirstWritten,LastWritten,LabelDate,VolJobs," + "VolFiles,VolBlocks,VolMounts,VolBytes,VolErrors,VolWrites," + "VolCapacityBytes,VolStatus,Recycle,VolRetention," + "VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes " + "FROM Media WHERE Media.PoolId=%u ORDER BY MediaId", mdbr->PoolId); + } else { + Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,MediaType,VolStatus," + "VolBytes,LastWritten,VolRetention,Recycle,Slot " + "FROM Media WHERE Media.PoolId=%u ORDER BY MediaId", mdbr->PoolId); + } db_lock(mdb); if (!QUERY_DB(jcr, mdb, mdb->cmd)) { @@ -124,30 +147,44 @@ FROM Media WHERE Media.PoolId=%u ORDER BY MediaId", mdbr->PoolId); return; } - list_result(mdb, sendit, ctx); + list_result(mdb, sendit, ctx, full); sql_free_result(mdb); db_unlock(mdb); } -void db_list_jobmedia_records(void *jcr, B_DB *mdb, uint32_t JobId, DB_LIST_HANDLER *sendit, void *ctx) +void db_list_jobmedia_records(void *jcr, B_DB *mdb, uint32_t JobId, + DB_LIST_HANDLER *sendit, void *ctx, int full) { - if (JobId > 0) { /* do by JobId */ - Mmsg(&mdb->cmd, "SELECT JobId, Media.VolumeName, FirstIndex, LastIndex \ -FROM JobMedia, Media WHERE Media.MediaId=JobMedia.MediaId and JobMedia.JobId=%u", - JobId); + if (full) { + if (JobId > 0) { /* do by JobId */ + Mmsg(&mdb->cmd, "SELECT JobMediaId,JobId,MediaId,Media.VolumeName," + "FirstIndex,LastIndex,StartFile,EndFile,StartBlock,EndBlock " + "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId " + "AND JobMedia.JobId=%u", JobId); + } else { + Mmsg(&mdb->cmd, "SELECT JobMediaId,JobId,MediaId,Media.VolumeName," + "FirstIndex,LastIndex,StartFile,EndFile,StartBlock,EndBlock " + "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId"); + } + } else { - Mmsg(&mdb->cmd, "SELECT JobId, Media.VolumeName, FirstIndex, LastIndex \ -FROM JobMedia, Media WHERE Media.MediaId=JobMedia.MediaId"); + if (JobId > 0) { /* do by JobId */ + Mmsg(&mdb->cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex" + "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId " + "AND JobMedia.JobId=%u", JobId); + } else { + Mmsg(&mdb->cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex " + "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId"); + } } - db_lock(mdb); if (!QUERY_DB(jcr, mdb, mdb->cmd)) { db_unlock(mdb); return; } - list_result(mdb, sendit, ctx); + list_result(mdb, sendit, ctx, full); sql_free_result(mdb); db_unlock(mdb); @@ -162,24 +199,48 @@ FROM JobMedia, Media WHERE Media.MediaId=JobMedia.MediaId"); * only the job with the specified id. */ void -db_list_job_records(void *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx) +db_list_job_records(void *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, + void *ctx, int full) { - if (jr->JobId == 0 && jr->Job[0] == 0) { - Mmsg(&mdb->cmd, -"SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus " -"FROM Job ORDER BY JobId"); - } else { /* single record */ - Mmsg(&mdb->cmd, "SELECT JobId,Name,StartTime,Type,Level,\ -JobFiles,JobBytes,JobStatus FROM Job WHERE Job.JobId=%u", jr->JobId); + if (full) { + if (jr->JobId == 0 && jr->Job[0] == 0) { + Mmsg(&mdb->cmd, + "SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level," + "Job.ClientId,Client.Name,JobStatus,SchedTime," + "StartTime,EndTime,JobTDate," + "VolSessionId,VolSessionTime,JobFiles,JobErrors," + "JobMissingFiles,Job.PoolId,Pool.Name,Job.FileSetId,FileSet.FileSet " + "FROM Job,Client,Pool,FileSet WHERE " + "Client.ClientId=Job.ClientId AND Pool.PoolId=Job.PoolId " + "AND FileSet.FileSetId=Job.FileSetId ORDER BY JobId"); + } else { /* single record */ + Mmsg(&mdb->cmd, + "SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level," + "Job.ClientId,Client.Name,JobStatus,SchedTime," + "StartTime,EndTime,JobTDate," + "VolSessionId,VolSessionTime,JobFiles,JobErrors," + "JobMissingFiles,Job.PoolId,Pool.Name,Job.FileSetId,FileSet.FileSet " + "FROM Job,Client,Pool,FileSet WHERE Job.JobId=%u AND " + "Client.ClientId=Job.ClientId AND Pool.PoolId=Job.PoolId " + "AND FileSet.FileSetId=Job.FileSetId", jr->JobId); + } + } else { + if (jr->JobId == 0 && jr->Job[0] == 0) { + Mmsg(&mdb->cmd, + "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus " + "FROM Job ORDER BY JobId"); + } else { /* single record */ + Mmsg(&mdb->cmd, "SELECT JobId,Name,StartTime,Type,Level," + "JobFiles,JobBytes,JobStatus FROM Job WHERE JobId=%u", jr->JobId); + } } - db_lock(mdb); if (!QUERY_DB(jcr, mdb, mdb->cmd)) { db_unlock(mdb); return; } - list_result(mdb, sendit, ctx); + list_result(mdb, sendit, ctx, full); sql_free_result(mdb); db_unlock(mdb); @@ -203,7 +264,7 @@ AS Files, sum(JobBytes) AS Bytes, Name AS Job FROM Job GROUP BY Name"); return; } - list_result(mdb, sendit, ctx); + list_result(mdb, sendit, ctx, 0); sql_free_result(mdb); @@ -216,7 +277,7 @@ AS Files,sum(JobBytes) As Bytes FROM Job"); return; } - list_result(mdb, sendit, ctx); + list_result(mdb, sendit, ctx, 0); sql_free_result(mdb); db_unlock(mdb); @@ -238,7 +299,7 @@ AND Path.PathId=File.PathId", return; } - list_result(mdb, sendit, ctx); + list_result(mdb, sendit, ctx, 0); sql_free_result(mdb); db_unlock(mdb); diff --git a/bacula/src/cats/sqlite.c b/bacula/src/cats/sqlite.c index 9049e7bf60..acf91cde32 100644 --- a/bacula/src/cats/sqlite.c +++ b/bacula/src/cats/sqlite.c @@ -401,12 +401,16 @@ list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx) send(ctx, "\n"); } +/* + * If full_list is set, we list vertically, otherwise, we + * list on one line horizontally. + */ void -list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx) +list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, int full_list) { SQL_FIELD *field; SQL_ROW row; - unsigned int i, col_len; + unsigned int i, col_len, max_len = 0; char buf[2000], ewc[30]; if (mdb->result == NULL || mdb->nrow == 0) { @@ -417,15 +421,27 @@ list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx) sql_field_seek(mdb, 0); for (i = 0; i < sql_num_fields(mdb); i++) { field = sql_fetch_field(mdb); - if (IS_NUM(field->type) && field->max_length > 0) { /* fixup for commas */ - field->max_length += (field->max_length - 1) / 3; - } col_len = strlen(field->name); - if (col_len < field->max_length) - col_len = field->max_length; - if (col_len < 4 && !IS_NOT_NULL(field->flags)) - col_len = 4; /* 4 = length of the word "NULL" */ - field->max_length = col_len; /* reset column info */ + if (full_list) { + if (col_len > max_len) { + max_len = col_len; + } + } else { + if (IS_NUM(field->type) && field->max_length > 0) { /* fixup for commas */ + field->max_length += (field->max_length - 1) / 3; + } + if (col_len < field->max_length) { + col_len = field->max_length; + } + if (col_len < 4 && !IS_NOT_NULL(field->flags)) { + col_len = 4; /* 4 = length of the word "NULL" */ + } + field->max_length = col_len; /* reset column info */ + } + } + + if (full_list) { + goto horizontal_list; } list_dashes(mdb, send, ctx); @@ -433,7 +449,7 @@ list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx) sql_field_seek(mdb, 0); for (i = 0; i < sql_num_fields(mdb); i++) { field = sql_fetch_field(mdb); - sprintf(buf, " %-*s |", field->max_length, field->name); + bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, field->name); send(ctx, buf); } send(ctx, "\n"); @@ -445,18 +461,39 @@ list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx) for (i = 0; i < sql_num_fields(mdb); i++) { field = sql_fetch_field(mdb); if (row[i] == NULL) { - sprintf(buf, " %-*s |", field->max_length, "NULL"); + bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, "NULL"); } else if (IS_NUM(field->type)) { - sprintf(buf, " %*s |", field->max_length, + bsnprintf(buf, sizeof(buf), " %*s |", (int)field->max_length, add_commas(row[i], ewc)); } else { - sprintf(buf, " %-*s |", field->max_length, row[i]); + bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, row[i]); } send(ctx, buf); } send(ctx, "\n"); } list_dashes(mdb, send, ctx); + return; + +horizontal_list: + + while ((row = sql_fetch_row(mdb)) != NULL) { + sql_field_seek(mdb, 0); + for (i = 0; i < sql_num_fields(mdb); i++) { + field = sql_fetch_field(mdb); + if (row[i] == NULL) { + bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL"); + } else if (IS_NUM(field->type)) { + bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, + add_commas(row[i], ewc)); + } else { + bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, row[i]); + } + send(ctx, buf); + } + send(ctx, "\n"); + } + return; } diff --git a/bacula/src/dird/backup.c b/bacula/src/dird/backup.c index b854ecd511..577c1298c0 100644 --- a/bacula/src/dird/backup.c +++ b/bacula/src/dird/backup.c @@ -148,7 +148,7 @@ int do_backup(JCR *jcr) strcpy(pr.Name, jcr->pool->hdr.name); while (!db_get_pool_record(jcr, jcr->db, &pr)) { /* get by Name */ /* Try to create the pool */ - if (create_pool(jcr, jcr->db, jcr->pool, 0) < 0) { + if (create_pool(jcr, jcr->db, jcr->pool, 1) < 0) { Jmsg(jcr, M_FATAL, 0, _("Pool %s not in database. %s"), pr.Name, db_strerror(jcr->db)); goto bail_out; diff --git a/bacula/src/dird/dird.c b/bacula/src/dird/dird.c index a8ced2eae9..1495df2164 100644 --- a/bacula/src/dird/dird.c +++ b/bacula/src/dird/dird.c @@ -379,7 +379,7 @@ Without that I don't know who I am :-(\n"), configfile); * record if it is not already created. */ if (job->pool) { - create_pool(NULL, db, job->pool, 1); + create_pool(NULL, db, job->pool, 0); /* update request */ } db_close_database(NULL, db); } diff --git a/bacula/src/dird/protos.h b/bacula/src/dird/protos.h index d4178c1cf8..c9a11cbc67 100644 --- a/bacula/src/dird/protos.h +++ b/bacula/src/dird/protos.h @@ -48,13 +48,13 @@ extern char *level_to_str(int level); /* fd_cmds.c */ extern int connect_to_file_daemon(JCR *jcr, int retry_interval, - int max_retry_time, int verbose); + int max_retry_time, int verbose); extern int send_include_list(JCR *jcr); extern int send_exclude_list(JCR *jcr); extern int get_attributes_and_put_in_catalog(JCR *jcr); extern int get_attributes_and_compare_to_catalog(JCR *jcr, JobId_t JobId); extern int put_file_into_catalog(JCR *jcr, long file_index, char *fname, - char *link, char *attr, int stream); + char *link, char *attr, int stream); /* job.c */ extern void set_jcr_defaults(JCR *jcr, JOB *job); @@ -67,7 +67,7 @@ extern void mount_request(JCR *jcr, BSOCK *bs, char *buf); /* msgchan.c */ extern int connect_to_storage_daemon(JCR *jcr, int retry_interval, - int max_retry_time, int verbose); + int max_retry_time, int verbose); extern int start_storage_daemon_job(JCR *jcr); extern int start_storage_daemon_message_thread(JCR *jcr); extern int32_t bget_msg(BSOCK *bs, int type); @@ -83,7 +83,7 @@ int do_a_dot_command(UAContext *ua, char *cmd); int qmessagescmd(UAContext *ua, char *cmd); int open_db(UAContext *ua); void close_db(UAContext *ua); -int create_pool(JCR *jcr, B_DB *db, POOL *pool, int update); +int create_pool(JCR *jcr, B_DB *db, POOL *pool, int create); void set_pool_dbr_defaults_in_media_dbr(MEDIA_DBR *mr, POOL_DBR *pr); /* ua_input.c */ @@ -98,27 +98,27 @@ void prtit(void *ctx, char *msg); void bsendmsg(void *sock, char *fmt, ...); /* ua_select.c */ -STORE *select_storage_resource(UAContext *ua); -JOB *select_job_resource(UAContext *ua); -JOB *select_restore_job_resource(UAContext *ua); -CLIENT *select_client_resource(UAContext *ua); +STORE *select_storage_resource(UAContext *ua); +JOB *select_job_resource(UAContext *ua); +JOB *select_restore_job_resource(UAContext *ua); +CLIENT *select_client_resource(UAContext *ua); FILESET *select_fileset_resource(UAContext *ua); -int select_pool_and_media_dbr(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr); -int select_pool_dbr(UAContext *ua, POOL_DBR *pr); -int select_client_dbr(UAContext *ua, CLIENT_DBR *cr); - -void start_prompt(UAContext *ua, char *msg); -void add_prompt(UAContext *ua, char *prompt); -int do_prompt(UAContext *ua, char *msg, char *prompt, int max_prompt); -CAT *get_catalog_resource(UAContext *ua); +int select_pool_and_media_dbr(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr); +int select_pool_dbr(UAContext *ua, POOL_DBR *pr); +int select_client_dbr(UAContext *ua, CLIENT_DBR *cr); + +void start_prompt(UAContext *ua, char *msg); +void add_prompt(UAContext *ua, char *prompt); +int do_prompt(UAContext *ua, char *msg, char *prompt, int max_prompt); +CAT *get_catalog_resource(UAContext *ua); STORE *get_storage_resource(UAContext *ua, char *cmd); -int get_media_type(UAContext *ua, char *MediaType, int max_media); -int get_pool_dbr(UAContext *ua, POOL_DBR *pr); -int get_client_dbr(UAContext *ua, CLIENT_DBR *cr); +int get_media_type(UAContext *ua, char *MediaType, int max_media); +int get_pool_dbr(UAContext *ua, POOL_DBR *pr); +int get_client_dbr(UAContext *ua, CLIENT_DBR *cr); POOL *get_pool_resource(UAContext *ua); POOL *select_pool_resource(UAContext *ua); CLIENT *get_client_resource(UAContext *ua); -int get_job_dbr(UAContext *ua, JOB_DBR *jr); +int get_job_dbr(UAContext *ua, JOB_DBR *jr); int find_arg_keyword(UAContext *ua, char **list); int do_keyword_prompt(UAContext *ua, char *msg, char **list); diff --git a/bacula/src/dird/ua_cmds.c b/bacula/src/dird/ua_cmds.c index fd15a4ff05..310b3a3d5d 100644 --- a/bacula/src/dird/ua_cmds.c +++ b/bacula/src/dird/ua_cmds.c @@ -161,7 +161,6 @@ void set_pool_dbr_defaults_in_media_dbr(MEDIA_DBR *mr, POOL_DBR *pr) /* * Add Volumes to an existing Pool - * */ static int addcmd(UAContext *ua, char *cmd) { @@ -516,7 +515,7 @@ void set_pooldbr_from_poolres(POOL_DBR *pr, POOL *pool, int create) * 1 record created */ -int create_pool(JCR *jcr, B_DB *db, POOL *pool, int update) +int create_pool(JCR *jcr, B_DB *db, POOL *pool, int create) { POOL_DBR pr; @@ -526,8 +525,8 @@ int create_pool(JCR *jcr, B_DB *db, POOL *pool, int update) if (db_get_pool_record(jcr, db, &pr)) { /* Pool Exists */ - if (update) { - set_pooldbr_from_poolres(&pr, pool, 1); + if (!create) { /* update request */ + set_pooldbr_from_poolres(&pr, pool, 0); db_update_pool_record(jcr, db, &pr); } return 0; /* exists */ @@ -560,7 +559,7 @@ static int createcmd(UAContext *ua, char *cmd) return 1; } - switch (create_pool(ua->jcr, ua->db, pool, 0)) { + switch (create_pool(ua->jcr, ua->db, pool, 1)) { case 0: bsendmsg(ua, _("Error: Pool %s already exists.\n\ Use update to change it.\n"), pool->hdr.name); @@ -928,7 +927,7 @@ static int update_pool(UAContext *ua) } query = get_pool_memory(PM_MESSAGE); Mmsg(&query, list_pool, pr.PoolId); - db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1); + db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, 0); free_pool_memory(query); bsendmsg(ua, _("Pool DB record updated from resource.\n")); return 1; diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index 5d15c3f58b..658bc84df1 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -229,7 +229,7 @@ static int do_listcmd(UAContext *ua, char *cmd, int llist) for (i=1; iargc; i++) { /* List JOBS */ if (strcasecmp(ua->argk[i], _("jobs")) == 0) { - db_list_job_records(ua->jcr, ua->db, &jr, prtit, ua); + db_list_job_records(ua->jcr, ua->db, &jr, prtit, ua, llist); /* List JOBTOTALS */ } else if (strcasecmp(ua->argk[i], _("jobtotals")) == 0) { @@ -241,7 +241,7 @@ static int do_listcmd(UAContext *ua, char *cmd, int llist) jobid = atoi(ua->argv[i]); if (jobid > 0) { jr.JobId = jobid; - db_list_job_records(ua->jcr, ua->db, &jr, prtit, ua); + db_list_job_records(ua->jcr, ua->db, &jr, prtit, ua, llist); } } @@ -249,7 +249,7 @@ static int do_listcmd(UAContext *ua, char *cmd, int llist) } else if (strcasecmp(ua->argk[i], _("job")) == 0 && ua->argv[i]) { bstrncpy(jr.Job, ua->argv[i], MAX_NAME_LENGTH); jr.JobId = 0; - db_list_job_records(ua->jcr, ua->db, &jr, prtit, ua); + db_list_job_records(ua->jcr, ua->db, &jr, prtit, ua, llist); /* List FILES */ } else if (strcasecmp(ua->argk[i], _("files")) == 0) { @@ -284,20 +284,20 @@ static int do_listcmd(UAContext *ua, char *cmd, int llist) } else { continue; } - db_list_jobmedia_records(ua->jcr, ua->db, jobid, prtit, ua); + db_list_jobmedia_records(ua->jcr, ua->db, jobid, prtit, ua, llist); done = TRUE; } if (!done) { /* List for all jobs (jobid=0) */ - db_list_jobmedia_records(ua->jcr, ua->db, 0, prtit, ua); + db_list_jobmedia_records(ua->jcr, ua->db, 0, prtit, ua, llist); } /* List POOLS */ } else if (strcasecmp(ua->argk[i], _("pools")) == 0) { - db_list_pool_records(ua->jcr, ua->db, prtit, ua); + db_list_pool_records(ua->jcr, ua->db, prtit, ua, llist); } else if (strcasecmp(ua->argk[i], _("clients")) == 0) { - db_list_client_records(ua->jcr, ua->db, prtit, ua); + db_list_client_records(ua->jcr, ua->db, prtit, ua, llist); /* List MEDIA or VOLUMES */ @@ -332,7 +332,7 @@ static int do_listcmd(UAContext *ua, char *cmd, int llist) return 1; } mr.PoolId = pr.PoolId; - db_list_media_records(ua->jcr, ua->db, &mr, prtit, ua); + db_list_media_records(ua->jcr, ua->db, &mr, prtit, ua, llist); return 1; } } @@ -351,7 +351,7 @@ static int do_listcmd(UAContext *ua, char *cmd, int llist) bsendmsg(ua, _("Pool: %s\n"), pr.Name); } mr.PoolId = ids[i]; - db_list_media_records(ua->jcr, ua->db, &mr, prtit, ua); + db_list_media_records(ua->jcr, ua->db, &mr, prtit, ua, llist); } free(ids); return 1; diff --git a/bacula/src/dird/ua_restore.c b/bacula/src/dird/ua_restore.c index fa03450b1f..77e91858f7 100644 --- a/bacula/src/dird/ua_restore.c +++ b/bacula/src/dird/ua_restore.c @@ -317,7 +317,7 @@ static int user_select_jobids(UAContext *ua, JobIds *ji) case -1: /* error */ return 0; case 0: /* list last 20 Jobs run */ - db_list_sql_query(ua->jcr, ua->db, uar_list_jobs, prtit, ua, 1); + db_list_sql_query(ua->jcr, ua->db, uar_list_jobs, prtit, ua, 1, 0); done = 0; break; case 1: /* list where a file is saved */ @@ -332,7 +332,7 @@ static int user_select_jobids(UAContext *ua, JobIds *ji) query = get_pool_memory(PM_MESSAGE); Mmsg(&query, uar_file, fname); free(fname); - db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1); + db_list_sql_query(ua->jcr, ua->db, query, prtit, ua, 1, 0); free_pool_memory(query); done = 0; break; @@ -346,7 +346,7 @@ static int user_select_jobids(UAContext *ua, JobIds *ji) if (!get_cmd(ua, _("Enter SQL list command: "))) { return 0; } - db_list_sql_query(ua->jcr, ua->db, ua->cmd, prtit, ua, 1); + db_list_sql_query(ua->jcr, ua->db, ua->cmd, prtit, ua, 1, 0); done = 0; break; case 4: /* Select the most recent backups */ @@ -414,7 +414,7 @@ static int user_select_jobids(UAContext *ua, JobIds *ji) bsendmsg(ua, "%s\n", db_strerror(ua->db)); } free_pool_memory(query); - db_list_sql_query(ua->jcr, ua->db, uar_list_temp, prtit, ua, 1); + db_list_sql_query(ua->jcr, ua->db, uar_list_temp, prtit, ua, 1, 0); if (!db_sql_query(ua->db, uar_sel_jobid_temp, jobid_handler, (void *)ji)) { bsendmsg(ua, "%s\n", db_strerror(ua->db)); diff --git a/bacula/src/dird/ua_select.c b/bacula/src/dird/ua_select.c index f365f2aa03..824602a6e8 100644 --- a/bacula/src/dird/ua_select.c +++ b/bacula/src/dird/ua_select.c @@ -444,7 +444,7 @@ int select_pool_and_media_dbr(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr) bstrncpy(mr->VolumeName, ua->argv[i], sizeof(mr->VolumeName)); } if (mr->VolumeName[0] == 0) { - db_list_media_records(ua->jcr, ua->db, mr, prtit, ua); + db_list_media_records(ua->jcr, ua->db, mr, prtit, ua, 0); if (!get_cmd(ua, _("Enter MediaId or Volume name: "))) { return 0; } @@ -511,7 +511,7 @@ POOL *get_pool_resource(UAContext *ua) */ int select_job_dbr(UAContext *ua, JOB_DBR *jr) { - db_list_job_records(ua->jcr, ua->db, jr, prtit, ua); + db_list_job_records(ua->jcr, ua->db, jr, prtit, ua, 0); if (!get_cmd(ua, _("Enter the JobId to select: "))) { return 0; } diff --git a/bacula/src/version.h b/bacula/src/version.h index 5c79b5b4da..74e4586876 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -1,8 +1,8 @@ /* */ #define VERSION "1.30" #define VSTRING "1" -#define BDATE "02 April 2003" -#define LSMDATE "02Apr03" +#define BDATE "03 April 2003" +#define LSMDATE "03Apr03" /* Debug flags */ #define DEBUG 1 -- 2.39.5