]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/cats/sql_list.c
c2197b69bf0a53ee817e82e15bb077b9b53bd4fe
[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 {
56    P(mdb->mutex);
57    if (sql_query(mdb, query) != 0) {
58       Mmsg(&mdb->errmsg, _("Query failed: %s\n"), sql_strerror(mdb));
59       sendit(ctx, mdb->errmsg);
60       V(mdb->mutex);
61       return 0;
62    }
63
64    mdb->result = sql_store_result(mdb);
65
66    if (mdb->result) {
67       list_result(mdb, sendit, ctx);
68       sql_free_result(mdb);
69    }
70    V(mdb->mutex);
71    return 1;
72 }
73
74 void
75 db_list_pool_records(B_DB *mdb, DB_LIST_HANDLER *sendit, void *ctx) 
76 {
77    Mmsg(&mdb->cmd, "SELECT PoolId,Name,NumVols,MaxVols,PoolType,LabelFormat \
78 FROM Pool");
79
80    P(mdb->mutex);
81    if (!QUERY_DB(mdb, mdb->cmd)) {
82       V(mdb->mutex);
83       return;
84    }
85
86    list_result(mdb, sendit, ctx);
87    
88    sql_free_result(mdb);
89    V(mdb->mutex);
90 }
91
92 void
93 db_list_media_records(B_DB *mdb, MEDIA_DBR *mdbr, DB_LIST_HANDLER *sendit, void *ctx)
94 {
95
96    Mmsg(&mdb->cmd, "SELECT VolumeName,MediaType,VolStatus,\
97 VolBytes,LastWritten,VolRetention,Recycle \
98 FROM Media WHERE Media.PoolId=%d ORDER BY MediaId", mdbr->PoolId);
99
100    P(mdb->mutex);
101    if (!QUERY_DB(mdb, mdb->cmd)) {
102       V(mdb->mutex);
103       return;
104    }
105
106    list_result(mdb, sendit, ctx);
107    
108    sql_free_result(mdb);
109    V(mdb->mutex);
110 }
111
112 void db_list_jobmedia_records(B_DB *mdb, uint32_t JobId, DB_LIST_HANDLER *sendit, void *ctx)
113 {
114    if (JobId > 0) {                   /* do by JobId */
115       Mmsg(&mdb->cmd, "SELECT JobId, Media.VolumeName, FirstIndex, LastIndex \
116 FROM JobMedia, Media WHERE Media.MediaId=JobMedia.MediaId and JobMedia.JobId=%d", 
117            JobId);
118    } else {
119       Mmsg(&mdb->cmd, "SELECT JobId, Media.VolumeName, FirstIndex, LastIndex \
120 FROM JobMedia, Media WHERE Media.MediaId=JobMedia.MediaId");
121    }
122
123    P(mdb->mutex);
124    if (!QUERY_DB(mdb, mdb->cmd)) {
125       V(mdb->mutex);
126       return;
127    }
128
129    list_result(mdb, sendit, ctx);
130    
131    sql_free_result(mdb);
132    V(mdb->mutex);
133 }
134
135
136
137 /*
138  * List Job record(s) that match JOB_DBR
139  *
140  *  Currently, we return all jobs or if jr->JobId is set,
141  *  only the job with the specified id.
142  */
143 void
144 db_list_job_records(B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx)
145 {
146
147    if (jr->JobId == 0 && jr->Job[0] == 0) {
148       Mmsg(&mdb->cmd, "SELECT JobId,Name,StartTime,Type,Level,\
149 JobFiles,JobBytes,JobStatus FROM Job");
150    } else {                           /* single record */
151       Mmsg(&mdb->cmd, "SELECT JobId,Name,StartTime,Type,Level,\
152 JobFiles,JobBytes,JobStatus FROM Job WHERE Job.JobId=%d", jr->JobId);
153    }
154
155    P(mdb->mutex);
156    if (!QUERY_DB(mdb, mdb->cmd)) {
157       V(mdb->mutex);
158       return;
159    }
160
161    list_result(mdb, sendit, ctx);
162    
163    sql_free_result(mdb);
164    V(mdb->mutex);
165 }
166
167 /*
168  * List Job totals
169  *
170  */
171 void
172 db_list_job_totals(B_DB *mdb, JOB_DBR *jr, DB_LIST_HANDLER *sendit, void *ctx)
173 {
174
175
176    P(mdb->mutex);
177
178    /* List by Job */
179    Mmsg(&mdb->cmd, "SELECT  count(*) AS Jobs, sum(JobFiles) \
180 AS Files, sum(JobBytes) AS Bytes, Name AS Job FROM Job GROUP BY Name");
181
182    if (!QUERY_DB(mdb, mdb->cmd)) {
183       V(mdb->mutex);
184       return;
185    }
186
187    list_result(mdb, sendit, ctx);
188    
189    sql_free_result(mdb);
190
191    /* Do Grand Total */
192    Mmsg(&mdb->cmd, "SELECT count(*) AS Jobs,sum(JobFiles) \
193 AS Files,sum(JobBytes) As Bytes FROM Job");
194
195    if (!QUERY_DB(mdb, mdb->cmd)) {
196       V(mdb->mutex);
197       return;
198    }
199
200    list_result(mdb, sendit, ctx);
201    
202    sql_free_result(mdb);
203    V(mdb->mutex);
204 }
205
206
207 void
208 db_list_files_for_job(B_DB *mdb, uint32_t jobid, DB_LIST_HANDLER *sendit, void *ctx)
209 {
210
211    Mmsg(&mdb->cmd, "SELECT Path.Path,Filename.Name FROM File,\
212 Filename,Path WHERE File.JobId=%d and Filename.FilenameId=File.FilenameId \
213 and Path.PathId=File.PathId",
214       jobid);
215
216    P(mdb->mutex);
217    if (!QUERY_DB(mdb, mdb->cmd)) {
218       V(mdb->mutex);
219       return;
220    }
221
222    list_result(mdb, sendit, ctx);
223    
224    sql_free_result(mdb);
225    V(mdb->mutex);
226 }
227
228
229 #endif /* HAVE_MYSQL || HAVE_SQLITE */