1 /*
2    Bacula(R) - The Network Backup Solution
3 
4    Copyright (C) 2000-2020 Kern Sibbald
5 
6    The original author of Bacula is Kern Sibbald, with contributions
7    from many others, a complete list can be found in the file AUTHORS.
8 
9    You may use this file and others of this release according to the
10    license defined in the LICENSE file, which includes the Affero General
11    Public License, v3.0 ("AGPLv3") and some additional permissions and
12    terms pursuant to its AGPLv3 Section 7.
13 
14    This notice must be preserved when any source code is
15    conveyed and/or propagated.
16 
17    Bacula(R) is a registered trademark of Kern Sibbald.
18 */
19 /*
20  *
21  *  Database routines that are exported by the cats library for
22  *    use elsewhere in Bacula (mainly the Director).
23  *
24  * Note: the interface that is used by the core Bacula code outside
25  *  of the cats directory has names that are:
26  *  db_xxx(x, db, y, ...)
27  *  usually with a database pointer such as db as an argument.
28  *  This simplifies the vast bulk of the code and makes it easier to read.
29  *  These are translated into class calls on the db pointer by a #define
30  *  in this file.
31  *
32  *  The actual class code is named bdb_xxx(x, y, ...) and is called with
33  *  the class pointer such as db->bdb_xxx(x, y, ...)  The code in this
34  *  cats directory can use the db_xxx() calls or the db->bdb_xxx() calls.
35  *  In the Bacula core code we prefer using only the db_xxx() calls.
36  *
37  *    Written by Kern Sibbald, MM
38  */
39 
40 #ifndef __SQL_PROTOS_H
41 #define __SQL_PROTOS_H
42 
43 #include "cats.h"
44 
45 BDB *db_init_database(JCR *jcr, const char *db_driver, const char *db_name,
46         const char *db_user, const char *db_password,
47         const char *db_address, int db_port,
48         const char *db_socket,
49         const char *db_ssl_mode, const char *db_ssl_key,
50         const char *db_ssl_cert, const char *db_ssl_ca,
51         const char *db_ssl_capath, const char *db_ssl_cipher,
52         bool mult_db_connections, bool disable_batch_insert);
53 
54 /* Database prototypes and defines */
55 
56 /* Misc */
57 #define db_lock(mdb) \
58    mdb->bdb_lock(__FILE__, __LINE__)
59 #define db_unlock(mdb) \
60    mdb->bdb_unlock()
61 
62 
63 /* Virtual methods */
64 #define db_escape_string(jcr, mdb, snew, old, len) \
65            mdb->bdb_escape_string(jcr, snew, old, len)
66 #define db_escape_object(jcr, mdb, old, len) \
67            mdb->bdb_escape_object(jcr, old, len)
68 #define db_unescape_object(jcr, mdb, from, expected_len, dest, len) \
69            mdb->bdb_unescape_object(jcr, from, expected_len, dest, len)
70 #define db_open_database(jcr, mdb) \
71            mdb->bdb_open_database(jcr)
72 #define db_close_database(jcr, mdb) \
73            mdb->bdb_close_database(jcr)
74 #define db_start_transaction(jcr, mdb) \
75            mdb->bdb_start_transaction(jcr)
76 #define db_end_transaction(jcr, mdb) \
77         if (mdb) mdb->bdb_end_transaction(jcr)
78 #define db_sql_query(mdb, query, result_handler, ctx) \
79            mdb->bdb_sql_query(query, result_handler, ctx)
80 #define db_thread_cleanup(mdb) \
81         if (mdb)  mdb->bdb_thread_cleanup()
82 
83 /* sql.c */
84 int db_int64_handler(void *ctx, int num_fields, char **row);
85 int db_strtime_handler(void *ctx, int num_fields, char **row);
86 int db_list_handler(void *ctx, int num_fields, char **row);
87 int db_string_list_handler(void *ctx, int num_fields, char **row);
88 int db_int_handler(void *ctx, int num_fields, char **row);
89 void bdb_debug_print(JCR *jcr, FILE *fp);
90 void db_free_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr);
91 
92 #define db_open_batch_connexion(jcr, mdb) \
93            mdb->bdb_open_batch_connexion(jcr)
94 #define db_strerror(mdb) \
95            mdb->bdb_strerror()
96 #define db_debug_print(jcr, fp) \
97            bdb_debug_print(jcr, fp)
98 #define db_check_max_connections(jcr, mdb, maxc) \
99            mdb->bdb_check_max_connections(jcr, maxc)
100 
101 /* sql_create.c */
102 bool bdb_write_batch_file_records(JCR *jcr);
103 void bdb_disable_batch_insert(bool disable);
104 
105 /* sql_get.c */
106 void bdb_free_restoreobject_record(JCR *jcr, ROBJECT_DBR *rr);
107 #define db_get_client_pool(jcr, mdb, results)    \
108    mdb->bdb_get_client_pool(jcr, results)
109 
110 /* sql_create.c */
111 #define db_create_log_record(jcr, mdb, jobid, mtime, msg)        \
112            mdb->bdb_create_log_record(jcr, jobid, mtime, msg)
113 #define db_create_events_record(jcr, mdb, rec) \
114            mdb->bdb_create_events_record(jcr, rec)
115 #define db_create_path_record(jcr, mdb, ar) \
116            mdb->bdb_create_path_record(jcr, ar)
117 #define db_create_file_attributes_record(jcr, mdb, ar) \
118            mdb->bdb_create_file_attributes_record(jcr, ar)
119 #define db_create_job_record(jcr, mdb, jr) \
120            mdb->bdb_create_job_record(jcr, jr)
121 #define db_create_media_record(jcr, mdb, media_dbr) \
122            mdb->bdb_create_media_record(jcr, media_dbr)
123 #define db_create_client_record(jcr, mdb, cr) \
124            mdb->bdb_create_client_record(jcr, cr)
125 #define db_create_fileset_record(jcr, mdb, fsr) \
126            mdb->bdb_create_fileset_record(jcr, fsr)
127 #define db_create_pool_record(jcr, mdb, pool_dbr) \
128            mdb->bdb_create_pool_record(jcr, pool_dbr)
129 #define db_create_jobmedia_record(jcr, mdb, jr) \
130            mdb->bdb_create_jobmedia_record(jcr, jr)
131 #define db_create_filemedia_record(jcr, mdb, fr) \
132            mdb->bdb_create_filemedia_record(jcr, fr)
133 #define db_create_counter_record(jcr, mdb, cr) \
134            mdb->bdb_create_counter_record(jcr, cr)
135 #define db_create_device_record(jcr, mdb, dr) \
136            mdb->bdb_create_device_record(jcr, dr)
137 #define db_create_storage_record(jcr, mdb, sr) \
138            mdb->bdb_create_storage_record(jcr, sr)
139 #define db_create_mediatype_record(jcr, mdb, mr) \
140            mdb->bdb_create_mediatype_record(jcr, mr)
141 #define db_write_batch_file_records(jcr) \
142            bdb_write_batch_file_records(jcr)
143 #define db_create_attributes_record(jcr, mdb, ar) \
144            mdb->bdb_create_attributes_record(jcr, ar)
145 #define db_create_restore_object_record(jcr, mdb, ar) \
146            mdb->bdb_create_restore_object_record(jcr, ar)
147 #define db_create_base_file_attributes_record(jcr, mdb, ar) \
148            mdb->bdb_create_base_file_attributes_record(jcr, ar)
149 #define db_commit_base_file_attributes_record(jcr, mdb) \
150            mdb->bdb_commit_base_file_attributes_record(jcr)
151 #define db_create_base_file_list(jcr, mdb, jobids) \
152            mdb->bdb_create_base_file_list(jcr, jobids)
153 #define db_disable_batch_insert(disable) \
154            bdb_disable_batch_insert(disable)
155 #define db_create_snapshot_record(jcr, mdb, sr) \
156            mdb->bdb_create_snapshot_record(jcr, sr)
157 
158 
159 /* sql_delete.c */
160 #define db_delete_pool_record(jcr, mdb, pool_dbr) \
161            mdb->bdb_delete_pool_record(jcr, pool_dbr)
162 #define db_delete_media_record(jcr, mdb, mr) \
163            mdb->bdb_delete_media_record(jcr, mr)
164 #define db_purge_media_record(jcr, mdb, mr) \
165            mdb->bdb_purge_media_record(jcr, mr)
166 #define db_delete_snapshot_record(jcr, mdb, sr) \
167            mdb->bdb_delete_snapshot_record(jcr, sr)
168 #define db_delete_client_record(jcr, mdb, cr)         \
169            mdb->bdb_delete_client_record(jcr, cr)
170 
171 
172 /* sql_find.c */
173 #define db_find_last_job_end_time(jcr, mdb, jr, etime, job) \
174            mdb->bdb_find_last_job_end_time(jcr, jr, etime, job)
175 #define db_find_last_job_start_time(jcr, mdb, jr, stime, job, JobLevel) \
176            mdb->bdb_find_last_job_start_time(jcr, jr, stime, job, JobLevel)
177 #define db_find_job_start_time(jcr, mdb, jr, stime, job) \
178            mdb->bdb_find_job_start_time(jcr, jr, stime, job)
179 #define db_find_last_jobid(jcr, mdb, Name, jr) \
180            mdb->bdb_find_last_jobid(jcr, Name, jr)
181 #define db_find_next_volume(jcr, mdb, index, InChanger, mr) \
182            mdb->bdb_find_next_volume(jcr, index, InChanger, mr)
183 #define db_find_failed_job_since(jcr, mdb, jr, stime, JobLevel) \
184            mdb->bdb_find_failed_job_since(jcr, jr, stime, JobLevel)
185 
186 /* sql_get.c */
187 #define db_get_file_record(jcr, mdb, jr, fr) \
188            mdb->bdb_get_file_record(jcr, jr, fr)
189 #define db_get_volume_jobids(jcr, mdb, mr, lst) \
190            mdb->bdb_get_volume_jobids(jcr, mr, lst)
191 #define db_get_client_jobids(jcr, mdb, cr, lst) \
192            mdb->bdb_get_client_jobids(jcr, cr, lst)
193 #define db_get_base_file_list(jcr, mdb, use_md5, result_handler, ctx)   \
194            mdb->bdb_get_base_file_list(jcr, use_md5, result_handler, ctx)
195 #define db_get_path_record(jcr, mdb) \
196            mdb->bdb_get_path_record(jcr)
197 #define db_get_pool_record(jcr, mdb, pdbr) \
198            mdb->bdb_get_pool_record(jcr, pdbr)
199 #define db_get_pool_numvols(jcr, mdb, pdbr) \
200            mdb->bdb_get_pool_numvols(jcr, pdbr)
201 #define db_get_client_record(jcr, mdb, cr) \
202            mdb->bdb_get_client_record(jcr, cr)
203 #define db_get_jobmedia_record(jcr, mdb, jmr)   \
204            mdb->bdb_get_jobmedia_record(jcr, jmr)
205 #define db_get_job_record(jcr, mdb, jr) \
206            mdb->bdb_get_job_record(jcr, jr)
207 #define db_get_job_volume_names(jcr, mdb, JobId, VolumeNames) \
208            mdb->bdb_get_job_volume_names(jcr, JobId, VolumeNames)
209 #define db_get_file_attributes_record(jcr, mdb, fname, jr, fdbr) \
210            mdb->bdb_get_file_attributes_record(jcr, fname, jr, fdbr)
211 #define db_get_fileset_record(jcr, mdb, fsr) \
212            mdb->bdb_get_fileset_record(jcr, fsr)
213 #define db_get_media_record(jcr, mdb, mr) \
214            mdb->bdb_get_media_record(jcr, mr)
215 #define db_get_num_media_records(jcr, mdb) \
216            mdb->bdb_get_num_media_records(jcr)
217 #define db_get_num_pool_records(jcr, mdb) \
218            mdb->bdb_get_num_pool_records(jcr)
219 #define db_get_pool_ids(jcr, mdb, num_ids, ids) \
220            mdb->bdb_get_pool_ids(jcr, num_ids, ids)
221 #define db_get_client_ids(jcr, mdb, num_ids, ids) \
222            mdb->bdb_get_client_ids(jcr, num_ids, ids)
223 #define db_get_media_ids(jcr, mdb, mr, num_ids, ids) \
224            mdb->bdb_get_media_ids(jcr, mr, num_ids, ids)
225 #define db_get_job_volume_parameters(jcr, mdb, JobId, VolParams) \
226            mdb->bdb_get_job_volume_parameters(jcr, JobId, VolParams)
227 #define db_get_counter_record(jcr, mdb, cr) \
228            mdb->bdb_get_counter_record(jcr, cr)
229 #define db_get_query_dbids(jcr, mdb, query, ids) \
230            mdb->bdb_get_query_dbids(jcr, query, ids)
231 #define db_get_file_list(jcr, mdb, jobids, opts, result_handler, ctx) \
232            mdb->bdb_get_file_list(jcr, jobids, opts, result_handler, ctx)
233 #define db_get_base_jobid(jcr, mdb, jr, jobid) \
234            mdb->bdb_get_base_jobid(jcr, jr, jobid)
235 #define db_get_accurate_jobids(jcr, mdb, jr, jobids) \
236            mdb->bdb_get_accurate_jobids(jcr, jr, jobids)
237 #define db_get_used_base_jobids(jcr, mdb, jobids, result) \
238            mdb->bdb_get_used_base_jobids(jcr, jobids, result)
239 #define db_get_restoreobject_record(jcr, mdb, rr) \
240            mdb->bdb_get_restoreobject_record(jcr, rr)
241 #define db_get_num_restoreobject_records(jcr, mdb, rr) \
242            mdb->bdb_get_num_restoreobject_records(jcr, rr)
243 #define db_get_type_index(mdb) \
244            mdb->bdb_get_type_index()
245 #define db_get_engine_name(mdb) \
246            mdb->bdb_get_engine_name()
247 #define db_get_snapshot_record(jcr, mdb, sr) \
248            mdb->bdb_get_snapshot_record(jcr, sr)
249 #define db_get_job_statistics(jcr, mdb, jr)      \
250            mdb->bdb_get_job_statistics(jcr, jr)
251 /* sql_list.c */
252 #define db_list_pool_records(jcr, mdb, pr, sendit, ctx, type) \
253            mdb->bdb_list_pool_records(jcr, pr, sendit, ctx, type)
254 #define db_list_job_records(jcr, mdb, jr, sendit, ctx, type) \
255            mdb->bdb_list_job_records(jcr, jr, sendit, ctx, type)
256 #define db_list_job_totals(jcr, mdb, jr, sendit, ctx) \
257            mdb->bdb_list_job_totals(jcr, jr, sendit, ctx)
258 #define db_list_files_for_job(jcr, mdb, jobid, deleted, sendit, ctx)     \
259            mdb->bdb_list_files_for_job(jcr, jobid, deleted, sendit, ctx)
260 #define db_list_media_records(jcr, mdb, mdbr, sendit, ctx, type) \
261            mdb->bdb_list_media_records(jcr, mdbr, sendit, ctx, type)
262 #define db_list_jobmedia_records(jcr, mdb, JobId, sendit, ctx, type) \
263            mdb->bdb_list_jobmedia_records(jcr, JobId, sendit, ctx, type)
264 #define db_list_filemedia_records(jcr, mdb, JobId, FI, sendit, ctx, type) \
265            mdb->bdb_list_filemedia_records(jcr, JobId, FI, sendit, ctx, type)
266 #define db_list_joblog_records(jcr, mdb, JobId, sendit, ctx, type)      \
267            mdb->bdb_list_joblog_records(jcr, JobId, sendit, ctx, type)
268 #define db_list_sql_query(jcr, mdb, query, sendit, ctx, verbose, type) \
269            mdb->bdb_list_sql_query(jcr, query, sendit, ctx, verbose, type)
270 #define db_list_client_records(jcr, mdb, sendit, ctx, type) \
271            mdb->bdb_list_client_records(jcr, sendit, ctx, type)
272 #define db_list_copies_records(jcr, mdb, limit, jobids, sendit, ctx, type) \
273            mdb->bdb_list_copies_records(jcr, limit, jobids, sendit, ctx, type)
274 #define db_list_events_records(jcr, mdb, rec, sendit, ctx, type) \
275            mdb->bdb_list_events_records(jcr, rec, sendit, ctx, type)
276 #define db_list_base_files_for_job(jcr, mdb, jobid, sendit, ctx) \
277            mdb->bdb_list_base_files_for_job(jcr, jobid, sendit, ctx)
278 #define db_list_restore_objects(jcr, mdb, rr, sendit, ctx, type) \
279            mdb->bdb_list_restore_objects(jcr, rr, sendit, ctx, type)
280 #define db_list_snapshot_records(jcr, mdb, snapdbr, sendit, ua, llist) \
281            mdb->bdb_list_snapshot_records(jcr, snapdbr, sendit, ua, llist)
282 #define db_list_files(jcr, mdb, filedbr, sendit, ua) \
283            mdb->bdb_list_files(jcr, filedbr, sendit, ua);
284 
285 /* sql_update.c */
286 #define db_update_job_start_record(jcr, mdb, jr) \
287            mdb->bdb_update_job_start_record(jcr, jr)
288 #define db_update_job_end_record(jcr, mdb, jr) \
289            mdb->bdb_update_job_end_record(jcr, jr)
290 #define db_update_client_record(jcr, mdb, cr) \
291            mdb->bdb_update_client_record(jcr, cr)
292 #define db_update_pool_record(jcr, mdb, pr) \
293            mdb->bdb_update_pool_record(jcr, pr)
294 #define db_update_storage_record(jcr, mdb, sr) \
295            mdb->bdb_update_storage_record(jcr, sr)
296 #define db_update_media_record(jcr, mdb, mr) \
297            mdb->bdb_update_media_record(jcr, mr)
298 #define db_update_media_defaults(jcr, mdb, mr) \
299            mdb->bdb_update_media_defaults(jcr, mr)
300 #define db_update_counter_record(jcr, mdb, cr) \
301            mdb->bdb_update_counter_record(jcr, cr)
302 #define db_add_digest_to_file_record(jcr, mdb, FileId, digest, type) \
303            mdb->bdb_add_digest_to_file_record(jcr, FileId, digest, type)
304 #define db_mark_file_record(jcr, mdb, FileId, JobId) \
305            mdb->bdb_mark_file_record(jcr, FileId, JobId)
306 #define db_make_inchanger_unique(jcr, mdb, mr) \
307            mdb->bdb_make_inchanger_unique(jcr, mr)
308 #define db_update_stats(jcr, mdb, age) \
309            mdb->bdb_update_stats(jcr, age)
310 #define db_update_snapshot_record(jcr, mdb, sr) \
311            mdb->bdb_update_snapshot_record(jcr, sr)
312 
313 
314 #endif /* __SQL_PROTOS_H */
315