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