]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/cats/sql_list.c
This commit was manufactured by cvs2svn to create tag
[bacula/bacula] / bacula / src / cats / sql_list.c
1 /*
2  * Bacula Catalog Database List records interface routines
3  *
4  *    Kern Sibbald, March 2000
5  *
6  *    Version $Id$
7  */
8 /*
9    Copyright (C) 2000-2006 Kern Sibbald
10
11    This program is free software; you can redistribute it and/or
12    modify it under the terms of the GNU General Public License
13    version 2 as amended with additional clauses defined in the
14    file LICENSE in the main source directory.
15
16    This program is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
19    the file LICENSE for additional details.
20
21  */
22
23 /* The following is necessary so that we do not include
24  * the dummy external definition of DB.
25  */
26 #define __SQL_C                       /* indicate that this is sql.c */
27
28 #include "bacula.h"
29 #include "cats.h"
30
31 #if    HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL
32
33 /* -----------------------------------------------------------------------
34  *
35  *   Generic Routines (or almost generic)
36  *
37  * -----------------------------------------------------------------------
38  */
39
40 /* Imported subroutines */
41 extern void list_result(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type);
42 extern int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
43
44
45 /*
46  * Submit general SQL query
47  */
48 int db_list_sql_query(JCR *jcr, B_DB *mdb, char *query, DB_LIST_HANDLER *sendit,
49                       void *ctx, int verbose, e_list_type type)
50 {
51    db_lock(mdb);
52    if (sql_query(mdb, query) != 0) {
53       Mmsg(mdb->errmsg, _("Query failed: %s\n"), sql_strerror(mdb));
54       if (verbose) {
55          sendit(ctx, mdb->errmsg);
56       }
57       db_unlock(mdb);
58       return 0;
59    }
60
61    mdb->result = sql_store_result(mdb);
62
63    if (mdb->result) {
64       list_result(jcr, mdb, sendit, ctx, type);
65       sql_free_result(mdb);
66    }
67    db_unlock(mdb);
68    return 1;
69 }
70
71 void
72 db_list_pool_records(JCR *jcr, B_DB *mdb, POOL_DBR *pdbr, 
73                      DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
74 {
75    db_lock(mdb);
76    if (type == VERT_LIST) {
77       if (pdbr->Name[0] != 0) {
78          Mmsg(mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,"
79             "AcceptAnyVolume,VolRetention,VolUseDuration,MaxVolJobs,MaxVolBytes,"
80             "AutoPrune,Recycle,PoolType,LabelFormat,Enabled,ScratchPoolId,"
81             "RecyclePoolId,LabelType "
82             " FROM Pool WHERE Name='%s'", pdbr->Name);
83       } else {
84          Mmsg(mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,UseOnce,UseCatalog,"
85             "AcceptAnyVolume,VolRetention,VolUseDuration,MaxVolJobs,MaxVolBytes,"
86             "AutoPrune,Recycle,PoolType,LabelFormat,Enabled,ScratchPoolId,"
87             "RecyclePoolId,LabelType "
88             " FROM Pool ORDER BY PoolId");
89       }
90    } else {
91       if (pdbr->Name[0] != 0) {
92          Mmsg(mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat "
93            "FROM Pool WHERE Name='%s'", pdbr->Name);
94       } else {
95          Mmsg(mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat "
96            "FROM Pool ORDER BY PoolId");
97       }
98    }
99
100    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
101       db_unlock(mdb);
102       return;
103    }
104
105    list_result(jcr, mdb, sendit, ctx, type);
106
107    sql_free_result(mdb);
108    db_unlock(mdb);
109 }
110
111 void
112 db_list_client_records(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
113 {
114    db_lock(mdb);
115    if (type == VERT_LIST) {
116       Mmsg(mdb->cmd, "SELECT ClientId,Name,Uname,AutoPrune,FileRetention,"
117          "JobRetention "
118          "FROM Client ORDER BY ClientId");
119    } else {
120       Mmsg(mdb->cmd, "SELECT ClientId,Name,FileRetention,JobRetention "
121          "FROM Client ORDER BY ClientId");
122    }
123
124    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
125       db_unlock(mdb);
126       return;
127    }
128
129    list_result(jcr, mdb, sendit, ctx, type);
130
131    sql_free_result(mdb);
132    db_unlock(mdb);
133 }
134
135
136 /*
137  * If VolumeName is non-zero, list the record for that Volume
138  *   otherwise, list the Volumes in the Pool specified by PoolId
139  */
140 void
141 db_list_media_records(JCR *jcr, B_DB *mdb, MEDIA_DBR *mdbr,
142                       DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
143 {
144    char ed1[50];
145    db_lock(mdb);
146    if (type == VERT_LIST) {
147       if (mdbr->VolumeName[0] != 0) {
148          Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,Slot,PoolId,"
149             "MediaType,FirstWritten,LastWritten,LabelDate,VolJobs,"
150             "VolFiles,VolBlocks,VolMounts,VolBytes,VolErrors,VolWrites,"
151             "VolCapacityBytes,VolStatus,Recycle,VolRetention,"
152             "VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes,InChanger,"
153             "EndFile,EndBlock,VolParts,LabelType,StorageId"
154             " FROM Media WHERE Media.VolumeName='%s'", mdbr->VolumeName);
155       } else {
156          Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,Slot,PoolId,"
157             "MediaType,FirstWritten,LastWritten,LabelDate,VolJobs,"
158             "VolFiles,VolBlocks,VolMounts,VolBytes,VolErrors,VolWrites,"
159             "VolCapacityBytes,VolStatus,Recycle,VolRetention,"
160             "VolUseDuration,MaxVolJobs,MaxVolFiles,MaxVolBytes,InChanger,"
161             "EndFile,EndBlock,VolParts,LabelType,StorageId"
162             " FROM Media WHERE Media.PoolId=%s ORDER BY MediaId", 
163             edit_int64(mdbr->PoolId, ed1));
164       }
165    } else {
166       if (mdbr->VolumeName[0] != 0) {
167          Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolStatus,"
168             "VolBytes,VolFiles,VolRetention,Recycle,Slot,InChanger,MediaType,LastWritten "
169             "FROM Media WHERE Media.VolumeName='%s'", mdbr->VolumeName);
170       } else {
171          Mmsg(mdb->cmd, "SELECT MediaId,VolumeName,VolStatus,"
172             "VolBytes,VolFiles,VolRetention,Recycle,Slot,InChanger,MediaType,LastWritten "
173             "FROM Media WHERE Media.PoolId=%s ORDER BY MediaId", 
174             edit_int64(mdbr->PoolId, ed1));
175       }
176    }
177
178    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
179       db_unlock(mdb);
180       return;
181    }
182
183    list_result(jcr, mdb, sendit, ctx, type);
184
185    sql_free_result(mdb);
186    db_unlock(mdb);
187 }
188
189 void db_list_jobmedia_records(JCR *jcr, B_DB *mdb, uint32_t JobId,
190                               DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
191 {
192    char ed1[50];
193    db_lock(mdb);
194    if (type == VERT_LIST) {
195       if (JobId > 0) {                   /* do by JobId */
196          Mmsg(mdb->cmd, "SELECT JobMediaId,JobId,Media.MediaId,Media.VolumeName,"
197             "FirstIndex,LastIndex,StartFile,JobMedia.EndFile,StartBlock,"
198             "JobMedia.EndBlock,Copy,Stripe "
199             "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId "
200             "AND JobMedia.JobId=%s", edit_int64(JobId, ed1));
201       } else {
202          Mmsg(mdb->cmd, "SELECT JobMediaId,JobId,Media.MediaId,Media.VolumeName,"
203             "FirstIndex,LastIndex,StartFile,JobMedia.EndFile,StartBlock,"
204             "JobMedia.EndBlock,Copy,Stripe "
205             "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId");
206       }
207
208    } else {
209       if (JobId > 0) {                   /* do by JobId */
210          Mmsg(mdb->cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex "
211             "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId "
212             "AND JobMedia.JobId=%s", edit_int64(JobId, ed1));
213       } else {
214          Mmsg(mdb->cmd, "SELECT JobId,Media.VolumeName,FirstIndex,LastIndex "
215             "FROM JobMedia,Media WHERE Media.MediaId=JobMedia.MediaId");
216       }
217    }
218    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
219       db_unlock(mdb);
220       return;
221    }
222
223    list_result(jcr, mdb, sendit, ctx, type);
224
225    sql_free_result(mdb);
226    db_unlock(mdb);
227 }
228
229
230
231 /*
232  * List Job record(s) that match JOB_DBR
233  *
234  *  Currently, we return all jobs or if jr->JobId is set,
235  *  only the job with the specified id.
236  */
237 void
238 db_list_job_records(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit,
239                     void *ctx, e_list_type type)
240 {
241    char ed1[50];
242    char limit[100];
243    db_lock(mdb);
244    if (jr->limit > 0) {
245       snprintf(limit, sizeof(limit), " LIMIT %d", jr->limit);
246    } else {
247       limit[0] = 0;
248    }
249    if (type == VERT_LIST) {
250       if (jr->JobId == 0 && jr->Job[0] == 0) {
251          Mmsg(mdb->cmd,
252             "SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level,"
253             "Job.ClientId,Client.Name,JobStatus,SchedTime,"
254             "StartTime,EndTime,JobTDate,"
255             "VolSessionId,VolSessionTime,JobFiles,JobErrors,"
256             "JobMissingFiles,Job.PoolId,Pool.Name,Job.FileSetId,FileSet.FileSet "
257             "FROM Job,Client,Pool,FileSet WHERE "
258             "Client.ClientId=Job.ClientId AND Pool.PoolId=Job.PoolId "
259             "AND FileSet.FileSetId=Job.FileSetId  ORDER BY StartTime%s", limit);
260       } else {                           /* single record */
261          Mmsg(mdb->cmd,
262             "SELECT JobId,Job,Job.Name,PurgedFiles,Type,Level,"
263             "Job.ClientId,Client.Name,JobStatus,SchedTime,"
264             "StartTime,EndTime,JobTDate,"
265             "VolSessionId,VolSessionTime,JobFiles,JobErrors,"
266             "JobMissingFiles,Job.PoolId,Pool.Name,Job.FileSetId,FileSet.FileSet "
267             "FROM Job,Client,Pool,FileSet WHERE Job.JobId=%s AND "
268             "Client.ClientId=Job.ClientId AND Pool.PoolId=Job.PoolId "
269             "AND FileSet.FileSetId=Job.FileSetId", 
270             edit_int64(jr->JobId, ed1));
271       }
272    } else {
273       if (jr->Name[0] != 0) {
274          Mmsg(mdb->cmd,
275             "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
276             "FROM Job WHERE Name='%s' ORDER BY StartTime,JobId ASC", jr->Name);
277       } else if (jr->Job[0] != 0) {
278          Mmsg(mdb->cmd,
279             "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
280             "FROM Job WHERE Job='%s' ORDER BY StartTime,JobId ASC", jr->Job);
281       } else if (jr->JobId != 0) {
282          Mmsg(mdb->cmd, 
283             "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
284             "FROM Job WHERE JobId=%s", edit_int64(jr->JobId, ed1));
285       } else {                           /* all records */
286          Mmsg(mdb->cmd,
287            "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
288            "FROM Job ORDER BY StartTime,JobId ASC%s", limit);
289       }
290    }
291    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
292       db_unlock(mdb);
293       return;
294    }
295    list_result(jcr, mdb, sendit, ctx, type);
296
297    sql_free_result(mdb);
298    db_unlock(mdb);
299 }
300
301 /*
302  * List Job totals
303  *
304  */
305 void
306 db_list_job_totals(JCR *jcr, B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx)
307 {
308    db_lock(mdb);
309
310    /* List by Job */
311    Mmsg(mdb->cmd, "SELECT  count(*) AS Jobs,sum(JobFiles) "
312       "AS Files,sum(JobBytes) AS Bytes,Name AS Job FROM Job GROUP BY Name");
313
314    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
315       db_unlock(mdb);
316       return;
317    }
318
319    list_result(jcr, mdb, sendit, ctx, HORZ_LIST);
320
321    sql_free_result(mdb);
322
323    /* Do Grand Total */
324    Mmsg(mdb->cmd, "SELECT count(*) AS Jobs,sum(JobFiles) "
325         "AS Files,sum(JobBytes) As Bytes FROM Job");
326
327    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
328       db_unlock(mdb);
329       return;
330    }
331
332    list_result(jcr, mdb, sendit, ctx, HORZ_LIST);
333
334    sql_free_result(mdb);
335    db_unlock(mdb);
336 }
337
338 /*
339  * Stupid MySQL is NON-STANDARD !
340  */
341 #ifdef HAVE_MYSQL
342 #define FN "CONCAT(Path.Path,Filename.Name)"
343 #else
344 #define FN "Path.Path||Filename.Name"
345 #endif
346
347 void
348 db_list_files_for_job(JCR *jcr, B_DB *mdb, JobId_t jobid, DB_LIST_HANDLER *sendit, void *ctx)
349 {
350    char ed1[50];
351    db_lock(mdb);
352
353    Mmsg(mdb->cmd, "SELECT " FN " AS Filename FROM File,"
354 "Filename,Path WHERE File.JobId=%s AND Filename.FilenameId=File.FilenameId "
355 "AND Path.PathId=File.PathId",
356       edit_int64(jobid, ed1));
357
358    if (!QUERY_DB(jcr, mdb, mdb->cmd)) {
359       db_unlock(mdb);
360       return;
361    }
362
363    list_result(jcr, mdb, sendit, ctx, HORZ_LIST);
364
365    sql_free_result(mdb);
366    db_unlock(mdb);
367 }
368
369
370 #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL*/