2 * Bacula Catalog Database List records interface routines
4 * Bacula Catalog Database routines written specifically
5 * for Bacula. Note, these routines are VERY dumb and
6 * do not provide all the functionality of an SQL database.
7 * The purpose of these routines is to ensure that Bacula
8 * can limp along if no real database is loaded on the
11 * Kern Sibbald, January MMI
17 Copyright (C) 2001-2003 Kern Sibbald and John Walker
19 This program is free software; you can redistribute it and/or
20 modify it under the terms of the GNU General Public License as
21 published by the Free Software Foundation; either version 2 of
22 the License, or (at your option) any later version.
24 This program is distributed in the hope that it will be useful,
25 but WITHOUT ANY WARRANTY; without even the implied warranty of
26 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27 General Public License for more details.
29 You should have received a copy of the GNU General Public
30 License along with this program; if not, write to the Free
31 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
37 /* The following is necessary so that we do not include
38 * the dummy external definition of DB.
40 #define __SQL_C /* indicate that this is sql.c */
48 /* Forward referenced functions */
50 /* -----------------------------------------------------------------------
52 * Bacula specific defines and subroutines
54 * -----------------------------------------------------------------------
58 * Submit general SQL query
60 int db_list_sql_query(JCR *jcr, B_DB *mdb, char *query, DB_LIST_HANDLER *sendit,
61 void *ctx, int verbose)
63 sendit(ctx, "SQL Queries not implemented with internal database.\n");
69 * List all the pool records
71 void db_list_pool_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx)
76 Dmsg0(90, "Enter list_pool_records\n");
78 if (!bdb_open_pools_file(mdb)) {
82 sendit(ctx, " PoolId NumVols MaxVols Type PoolName\n");
83 sendit(ctx, "===================================================\n");
84 fseek(mdb->poolfd, 0L, SEEK_SET); /* rewind file */
86 while (fread(&pr, len, 1, mdb->poolfd) > 0) {
87 Mmsg(&mdb->cmd, " %7d %6d %6d %-10s %s\n",
88 pr.PoolId, pr.NumVols, pr.MaxVols, pr.PoolType, pr.Name);
89 sendit(ctx, mdb->cmd);
91 sendit(ctx, "===================================================\n");
93 Dmsg0(90, "Leave list_pool_records\n");
101 void db_list_media_records(JCR *jcr, B_DB *mdb, MEDIA_DBR *mdbr,
102 DB_LIST_HANDLER *sendit, void *ctx)
109 if (!bdb_open_media_file(mdb)) {
113 sendit(ctx, " Status VolBytes MediaType VolumeName\n");
114 sendit(ctx, "=============================================================\n");
115 fseek(mdb->mediafd, 0L, SEEK_SET); /* rewind file */
117 while (fread(&mr, len, 1, mdb->mediafd) > 0) {
118 Mmsg(&mdb->cmd, " %-10s %17s %-15s %s\n",
119 mr.VolStatus, edit_uint64_with_commas(mr.VolBytes, ewc),
120 mr.MediaType, mr.VolumeName);
121 sendit(ctx, mdb->cmd);
123 sendit(ctx, "====================================================================\n");
128 void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, uint32_t JobId,
129 DB_LIST_HANDLER *sendit, void *ctx)
136 if (!bdb_open_jobmedia_file(mdb)) {
140 if (!bdb_open_media_file(mdb)) {
144 sendit(ctx, " JobId VolumeName FirstIndex LastIndex\n");
145 sendit(ctx, "============================================\n");
148 fseek(mdb->jobmediafd, 0L, SEEK_SET); /* rewind the file */
149 while (fread(&jm, jmlen, 1, mdb->jobmediafd) > 0) {
152 if (jm.JobId == JobId) {
153 /* Now find VolumeName in corresponding Media record */
154 fseek(mdb->mediafd, 0L, SEEK_SET);
155 while (fread(&mr, mrlen, 1, mdb->mediafd) > 0) {
156 if (mr.MediaId == jm.MediaId) {
157 Mmsg(&mdb->cmd, " %7d %-10s %10d %10d\n",
158 jm.JobId, mr.VolumeName, jm.FirstIndex, jm.LastIndex);
159 sendit(ctx, mdb->cmd);
165 /* List all records */
166 fseek(mdb->mediafd, 0L, SEEK_SET);
167 while (fread(&mr, mrlen, 1, mdb->mediafd) > 0) {
168 if (mr.MediaId == jm.MediaId) {
169 Mmsg(&mdb->cmd, " %7d %-10s %10d %10d\n",
170 jm.JobId, mr.VolumeName, jm.FirstIndex, jm.LastIndex);
171 sendit(ctx, mdb->cmd);
178 sendit(ctx, "============================================\n");
187 void db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr,
188 DB_LIST_HANDLER *sendit, void *ctx)
193 char ewc1[30], ewc2[30];
194 char dt[MAX_TIME_LENGTH];
198 if (!bdb_open_jobs_file(mdb)) {
202 fseek(mdb->jobfd, 0L, SEEK_SET); /* rewind file */
204 * Linear search through Job records
206 sendit(ctx, " JobId StartTime Type Level Bytes Files Stat JobName\n");
207 sendit(ctx, "==========================================================================\n");
209 while (!done && fread(&ojr, jrlen, 1, mdb->jobfd) > 0) {
210 if (jr->JobId != 0) {
211 if (jr->JobId == ojr.JobId) {
217 localtime_r(&ojr.StartTime, &tm);
218 strftime(dt, sizeof(dt), "%m-%d %H:%M", &tm);
219 Mmsg(&mdb->cmd, " %7d %-10s %c %c %14s %10s %c %s\n",
220 ojr.JobId, dt, (char)ojr.Type, (char)ojr.Level,
221 edit_uint64_with_commas(ojr.JobBytes, ewc1),
222 edit_uint64_with_commas(ojr.JobFiles, ewc2),
223 (char)ojr.JobStatus, ojr.Name);
224 sendit(ctx, mdb->cmd);
226 sendit(ctx, "============================================================================\n");
235 void db_list_job_totals(JCR *jcr, B_DB *mdb, JOB_DBR *jr,
236 DB_LIST_HANDLER *sendit, void *ctx)
238 char ewc1[30], ewc2[30], ewc3[30];
241 uint64_t total_bytes = 0;
242 uint64_t total_files = 0;
243 uint32_t total_jobs = 0;
246 if (!bdb_open_jobs_file(mdb)) {
250 fseek(mdb->jobfd, 0L, SEEK_SET); /* rewind file */
252 * Linear search through JobStart records
254 sendit(ctx, " NumJobs NumFiles NumBytes\n");
255 sendit(ctx, "=======================================\n");
257 while (fread(&ojr, jrlen, 1, mdb->jobfd) > 0) {
258 total_files += ojr.JobFiles;
259 total_bytes += ojr.JobBytes;
262 Mmsg(&mdb->cmd, " %7s %10s %15s\n",
263 edit_uint64_with_commas(total_jobs, ewc1),
264 edit_uint64_with_commas(total_files, ewc2),
265 edit_uint64_with_commas(total_bytes, ewc3));
266 sendit(ctx, mdb->cmd);
267 sendit(ctx, "=======================================\n");
274 void db_list_files_for_job(JCR *jcr, B_DB *mdb, uint32_t jobid, DB_LIST_HANDLER *sendit, void *ctx)
277 void db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx)
280 int db_list_sql_query(JCR *jcr, B_DB *mdb, char *query, DB_LIST_HANDLER *sendit,
281 void *ctx, int verbose, e_list_type type)
287 db_list_pool_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
291 db_list_media_records(JCR *jcr, B_DB *mdb, MEDIA_DBR *mdbr,
292 DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
295 void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, uint32_t JobId,
296 DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
300 db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit,
301 void *ctx, e_list_type type)
305 db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
311 #endif /* HAVE_BACULA_DB */