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-2006 Kern Sibbald
19 This program is free software; you can redistribute it and/or
20 modify it under the terms of the GNU General Public License
21 version 2 as amended with additional clauses defined in the
22 file LICENSE in the main source directory.
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
27 the file LICENSE for additional details.
32 /* The following is necessary so that we do not include
33 * the dummy external definition of DB.
35 #define __SQL_C /* indicate that this is sql.c */
43 /* Forward referenced functions */
45 /* -----------------------------------------------------------------------
47 * Bacula specific defines and subroutines
49 * -----------------------------------------------------------------------
53 * Submit general SQL query
55 int db_list_sql_query(JCR *jcr, B_DB *mdb, const char *query, DB_LIST_HANDLER *sendit,
56 void *ctx, int verbose)
58 sendit(ctx, "SQL Queries not implemented with internal database.\n");
64 * List all the pool records
66 void db_list_pool_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx)
71 Dmsg0(90, "Enter list_pool_records\n");
73 if (!bdb_open_pools_file(mdb)) {
77 sendit(ctx, " PoolId NumVols MaxVols Type PoolName\n");
78 sendit(ctx, "===================================================\n");
79 fseek(mdb->poolfd, 0L, SEEK_SET); /* rewind file */
81 while (fread(&pr, len, 1, mdb->poolfd) > 0) {
82 Mmsg(mdb->cmd, " %7d %6d %6d %-10s %s\n",
83 pr.PoolId, pr.NumVols, pr.MaxVols, pr.PoolType, pr.Name);
84 sendit(ctx, mdb->cmd);
86 sendit(ctx, "===================================================\n");
88 Dmsg0(90, "Leave list_pool_records\n");
96 void db_list_media_records(JCR *jcr, B_DB *mdb, MEDIA_DBR *mdbr,
97 DB_LIST_HANDLER *sendit, void *ctx)
104 if (!bdb_open_media_file(mdb)) {
108 sendit(ctx, " Status VolBytes MediaType VolumeName\n");
109 sendit(ctx, "=============================================================\n");
110 fseek(mdb->mediafd, 0L, SEEK_SET); /* rewind file */
112 while (fread(&mr, len, 1, mdb->mediafd) > 0) {
113 Mmsg(mdb->cmd, " %-10s %17s %-15s %s\n",
114 mr.VolStatus, edit_uint64_with_commas(mr.VolBytes, ewc),
115 mr.MediaType, mr.VolumeName);
116 sendit(ctx, mdb->cmd);
118 sendit(ctx, "====================================================================\n");
123 void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, uint32_t JobId,
124 DB_LIST_HANDLER *sendit, void *ctx)
131 if (!bdb_open_jobmedia_file(mdb)) {
135 if (!bdb_open_media_file(mdb)) {
139 sendit(ctx, " JobId VolumeName FirstIndex LastIndex\n");
140 sendit(ctx, "============================================\n");
143 fseek(mdb->jobmediafd, 0L, SEEK_SET); /* rewind the file */
144 while (fread(&jm, jmlen, 1, mdb->jobmediafd) > 0) {
147 if (jm.JobId == JobId) {
148 /* Now find VolumeName in corresponding Media record */
149 fseek(mdb->mediafd, 0L, SEEK_SET);
150 while (fread(&mr, mrlen, 1, mdb->mediafd) > 0) {
151 if (mr.MediaId == jm.MediaId) {
152 Mmsg(mdb->cmd, " %7d %-10s %10d %10d\n",
153 jm.JobId, mr.VolumeName, jm.FirstIndex, jm.LastIndex);
154 sendit(ctx, mdb->cmd);
160 /* List all records */
161 fseek(mdb->mediafd, 0L, SEEK_SET);
162 while (fread(&mr, mrlen, 1, mdb->mediafd) > 0) {
163 if (mr.MediaId == jm.MediaId) {
164 Mmsg(mdb->cmd, " %7d %-10s %10d %10d\n",
165 jm.JobId, mr.VolumeName, jm.FirstIndex, jm.LastIndex);
166 sendit(ctx, mdb->cmd);
173 sendit(ctx, "============================================\n");
182 void db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr,
183 DB_LIST_HANDLER *sendit, void *ctx)
188 char ewc1[30], ewc2[30];
189 char dt[MAX_TIME_LENGTH];
193 if (!bdb_open_jobs_file(mdb)) {
197 fseek(mdb->jobfd, 0L, SEEK_SET); /* rewind file */
199 * Linear search through Job records
201 sendit(ctx, " JobId StartTime Type Level Bytes Files Stat JobName\n");
202 sendit(ctx, "==========================================================================\n");
204 while (!done && fread(&ojr, jrlen, 1, mdb->jobfd) > 0) {
205 if (jr->JobId != 0) {
206 if (jr->JobId == ojr.JobId) {
212 localtime_r(&ojr.StartTime, &tm);
213 strftime(dt, sizeof(dt), "%m-%d %H:%M", &tm);
214 Mmsg(mdb->cmd, " %7d %-10s %c %c %14s %10s %c %s\n",
215 ojr.JobId, dt, (char)ojr.JobType, (char)ojr.JobLevel,
216 edit_uint64_with_commas(ojr.JobBytes, ewc1),
217 edit_uint64_with_commas(ojr.JobFiles, ewc2),
218 (char)ojr.JobStatus, ojr.Name);
219 sendit(ctx, mdb->cmd);
221 sendit(ctx, "============================================================================\n");
230 void db_list_job_totals(JCR *jcr, B_DB *mdb, JOB_DBR *jr,
231 DB_LIST_HANDLER *sendit, void *ctx)
233 char ewc1[30], ewc2[30], ewc3[30];
236 uint64_t total_bytes = 0;
237 uint64_t total_files = 0;
238 uint32_t total_jobs = 0;
241 if (!bdb_open_jobs_file(mdb)) {
245 fseek(mdb->jobfd, 0L, SEEK_SET); /* rewind file */
247 * Linear search through JobStart records
249 sendit(ctx, " NumJobs NumFiles NumBytes\n");
250 sendit(ctx, "=======================================\n");
252 while (fread(&ojr, jrlen, 1, mdb->jobfd) > 0) {
253 total_files += ojr.JobFiles;
254 total_bytes += ojr.JobBytes;
257 Mmsg(mdb->cmd, " %7s %10s %15s\n",
258 edit_uint64_with_commas(total_jobs, ewc1),
259 edit_uint64_with_commas(total_files, ewc2),
260 edit_uint64_with_commas(total_bytes, ewc3));
261 sendit(ctx, mdb->cmd);
262 sendit(ctx, "=======================================\n");
269 void db_list_files_for_job(JCR *jcr, B_DB *mdb, uint32_t jobid, DB_LIST_HANDLER *sendit, void *ctx)
272 void db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx)
275 int db_list_sql_query(JCR *jcr, B_DB *mdb, const char *query, DB_LIST_HANDLER *sendit,
276 void *ctx, int verbose, e_list_type type)
282 db_list_pool_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
286 db_list_media_records(JCR *jcr, B_DB *mdb, MEDIA_DBR *mdbr,
287 DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
290 void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, uint32_t JobId,
291 DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
295 db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit,
296 void *ctx, e_list_type type)
300 db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
306 #endif /* HAVE_BACULA_DB */