]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/cats/sql_list.c
Better bootstrap file + static daemons
[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);
48 extern int QueryDB(char *file, int line, B_DB *db, char *select_cmd);
49
50
51 /* 
52  * Submit general SQL query
53  */
54 int db_list_sql_query(B_DB *mdb, char *query, DB_LIST_HANDLER *sendit, void *ctx,
55                       int verbose)
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);
71       sql_free_result(mdb);
72    }
73    db_unlock(mdb);
74    return 1;
75 }
76
77 void
78 db_list_pool_records(B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx) 
79 {
80    Mmsg(&mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat "
81 "FROM Pool ORDER BY PoolId");
82
83    db_lock(mdb);
84    if (!QUERY_DB(mdb, mdb->cmd)) {
85       db_unlock(mdb);
86       return;
87    }
88
89    list_result(mdb, sendit, ctx);
90    
91    sql_free_result(mdb);
92    db_unlock(mdb);
93 }
94
95 void
96 db_list_client_records(B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx) 
97 {
98    Mmsg(&mdb->cmd, "SELECT ClientId,Name,FileRetention,JobRetention "
99 "FROM Client ORDER BY ClientId");
100
101    db_lock(mdb);
102    if (!QUERY_DB(mdb, mdb->cmd)) {
103       db_unlock(mdb);
104       return;
105    }
106
107    list_result(mdb, sendit, ctx);
108    
109    sql_free_result(mdb);
110    db_unlock(mdb);
111 }
112
113
114 void
115 db_list_media_records(B_DB *mdb, MEDIA_DBR *mdbr, DB_LIST_HANDLER *sendit, void *ctx)
116 {
117    Mmsg(&mdb->cmd, "SELECT MediaId,VolumeName,MediaType,VolStatus,\
118 VolBytes,LastWritten,VolRetention,Recycle,Slot \
119 FROM Media WHERE Media.PoolId=%u ORDER BY MediaId", mdbr->PoolId);
120
121    db_lock(mdb);
122    if (!QUERY_DB(mdb, mdb->cmd)) {
123       db_unlock(mdb);
124       return;
125    }
126
127    list_result(mdb, sendit, ctx);
128    
129    sql_free_result(mdb);
130    db_unlock(mdb);
131 }
132
133 void db_list_jobmedia_records(B_DB *mdb, uint32_t JobId, DB_LIST_HANDLER *sendit, void *ctx)
134 {
135    if (JobId > 0) {                   /* do by JobId */
136       Mmsg(&mdb->cmd, "SELECT JobId, Media.VolumeName, FirstIndex, LastIndex \
137 FROM JobMedia, Media WHERE Media.MediaId=JobMedia.MediaId and JobMedia.JobId=%u", 
138            JobId);
139    } else {
140       Mmsg(&mdb->cmd, "SELECT JobId, Media.VolumeName, FirstIndex, LastIndex \
141 FROM JobMedia, Media WHERE Media.MediaId=JobMedia.MediaId");
142    }
143
144    db_lock(mdb);
145    if (!QUERY_DB(mdb, mdb->cmd)) {
146       db_unlock(mdb);
147       return;
148    }
149
150    list_result(mdb, sendit, ctx);
151    
152    sql_free_result(mdb);
153    db_unlock(mdb);
154 }
155
156
157
158 /*
159  * List Job record(s) that match JOB_DBR
160  *
161  *  Currently, we return all jobs or if jr->JobId is set,
162  *  only the job with the specified id.
163  */
164 void
165 db_list_job_records(B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx)
166 {
167    if (jr->JobId == 0 && jr->Job[0] == 0) {
168       Mmsg(&mdb->cmd, 
169 "SELECT JobId,Name,StartTime,Type,Level,JobFiles,JobBytes,JobStatus "
170 "FROM Job ORDER BY JobId");
171    } else {                           /* single record */
172       Mmsg(&mdb->cmd, "SELECT JobId,Name,StartTime,Type,Level,\
173 JobFiles,JobBytes,JobStatus FROM Job WHERE Job.JobId=%u", jr->JobId);
174    }
175
176    db_lock(mdb);
177    if (!QUERY_DB(mdb, mdb->cmd)) {
178       db_unlock(mdb);
179       return;
180    }
181
182    list_result(mdb, sendit, ctx);
183    
184    sql_free_result(mdb);
185    db_unlock(mdb);
186 }
187
188 /*
189  * List Job totals
190  *
191  */
192 void
193 db_list_job_totals(B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx)
194 {
195    db_lock(mdb);
196
197    /* List by Job */
198    Mmsg(&mdb->cmd, "SELECT  count(*) AS Jobs, sum(JobFiles) \
199 AS Files, sum(JobBytes) AS Bytes, Name AS Job FROM Job GROUP BY Name");
200
201    if (!QUERY_DB(mdb, mdb->cmd)) {
202       db_unlock(mdb);
203       return;
204    }
205
206    list_result(mdb, sendit, ctx);
207    
208    sql_free_result(mdb);
209
210    /* Do Grand Total */
211    Mmsg(&mdb->cmd, "SELECT count(*) AS Jobs,sum(JobFiles) \
212 AS Files,sum(JobBytes) As Bytes FROM Job");
213
214    if (!QUERY_DB(mdb, mdb->cmd)) {
215       db_unlock(mdb);
216       return;
217    }
218
219    list_result(mdb, sendit, ctx);
220    
221    sql_free_result(mdb);
222    db_unlock(mdb);
223 }
224
225
226 void
227 db_list_files_for_job(B_DB *mdb, uint32_t jobid, DB_LIST_HANDLER *sendit, void *ctx)
228 {
229
230    Mmsg(&mdb->cmd, "SELECT Path.Path,Filename.Name FROM File,\
231 Filename,Path WHERE File.JobId=%u AND Filename.FilenameId=File.FilenameId \
232 AND Path.PathId=File.PathId",
233       jobid);
234
235    db_lock(mdb);
236    if (!QUERY_DB(mdb, mdb->cmd)) {
237       db_unlock(mdb);
238       return;
239    }
240
241    list_result(mdb, sendit, ctx);
242    
243    sql_free_result(mdb);
244    db_unlock(mdb);
245 }
246
247
248 #endif /* HAVE_MYSQL || HAVE_SQLITE */