]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/cats/cats.h
ebl Small fix on accurate code for new restore menu option
[bacula/bacula] / bacula / src / cats / cats.h
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
5
6    The main author of Bacula is Kern Sibbald, with contributions from
7    many others, a complete list can be found in the file AUTHORS.
8    This program is Free Software; you can redistribute it and/or
9    modify it under the terms of version two of the GNU General Public
10    License as published by the Free Software Foundation and included
11    in the file LICENSE.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23    Bacula® is a registered trademark of Kern Sibbald.
24    The licensor of Bacula is the Free Software Foundation Europe
25    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26    Switzerland, email:ftf@fsfeurope.org.
27 */
28 /*
29  * SQL header file
30  *
31  *   by Kern E. Sibbald
32  *
33  *   Anyone who accesses the database will need to include
34  *   this file.
35  *
36  * This file contains definitions common to sql.c and
37  * the external world, and definitions destined only
38  * for the external world. This is control with
39  * the define __SQL_C, which is defined only in sql.c
40  *
41  *    Version $Id$
42  */
43
44 /*
45    Here is how database versions work.
46
47    While I am working on a new release with database changes, the
48    update scripts are in the src/cats directory under the names
49    update_xxx_tables.in.  Most of the time, I make database updates
50    in one go and immediately update the version, but not always.  If
51    there are going to be several updates as is the case with version
52    1.37, then I will often forgo changing the version until the last
53    update otherwise I will end up with too many versions and a lot
54    of confusion.
55
56    When I am pretty sure there will be no more updates, I will
57    change the version from 8 to 9 (in the present case), and when I
58    am 100% sure there will be no more changes, the update script
59    will be copied to the updatedb directory with the correct name
60    (in the present case 8 to 9).
61
62    Now, in principle, each of the different DB implementations
63    can have a different version, but in practice they are all
64    the same (simplifies things). The exception is the internal
65    database, which is no longer used, and hence, no longer changes.
66  */
67
68
69 #ifndef __SQL_H_
70 #define __SQL_H_ 1
71
72 enum {
73    SQL_TYPE_MYSQL      = 0,
74    SQL_TYPE_POSTGRESQL = 1,
75    SQL_TYPE_SQLITE     = 2,
76    SQL_TYPE_SQLITE3
77 };
78
79
80 typedef void (DB_LIST_HANDLER)(void *, const char *);
81 typedef int (DB_RESULT_HANDLER)(void *, int, char **);
82
83 #define db_lock(mdb)   _db_lock(__FILE__, __LINE__, mdb)
84 #define db_unlock(mdb) _db_unlock(__FILE__, __LINE__, mdb)
85
86 #ifdef __SQL_C
87
88 #if defined(BUILDING_CATS)
89 #ifdef HAVE_SQLITE
90
91 #define BDB_VERSION 11
92
93 #include <sqlite.h>
94
95 /* Define opaque structure for sqlite */
96 struct sqlite {
97    char dummy;
98 };
99
100 #define IS_NUM(x)             ((x) == 1)
101 #define IS_NOT_NULL(x)        ((x) == 1)
102
103 typedef struct s_sql_field {
104    char *name;                        /* name of column */
105    int length;                        /* length */
106    int max_length;                    /* max length */
107    uint32_t type;                     /* type */
108    uint32_t flags;                    /* flags */
109 } SQL_FIELD;
110
111 /*
112  * This is the "real" definition that should only be
113  * used inside sql.c and associated database interface
114  * subroutines.
115  *                    S Q L I T E
116  */
117 struct B_DB {
118    BQUEUE bq;                         /* queue control */
119    brwlock_t lock;                    /* transaction lock */
120    struct sqlite *db;
121    char **result;
122    int status;
123    int nrow;                          /* nrow returned from sqlite */
124    int ncolumn;                       /* ncolum returned from sqlite */
125    int num_rows;                      /* used by code */
126    int row;                           /* seek row */
127    int field;                         /* seek field */
128    SQL_FIELD **fields;                /* defined fields */
129    int ref_count;
130    char *db_name;
131    char *db_user;
132    char *db_address;                  /* host name address */
133    char *db_socket;                   /* socket for local access */
134    char *db_password;
135    int  db_port;                      /* port for host name address */
136    bool connected;                    /* connection made to db */
137    bool have_insert_id;               /* do not have insert id */
138    bool fields_defined;               /* set when fields defined */
139    char *sqlite_errmsg;               /* error message returned by sqlite */
140    POOLMEM *errmsg;                   /* nicely edited error message */
141    POOLMEM *cmd;                      /* SQL command string */
142    POOLMEM *cached_path;              /* cached path name */
143    int cached_path_len;               /* length of cached path */
144    uint32_t cached_path_id;           /* cached path id */
145    bool allow_transactions;           /* transactions allowed */
146    bool transaction;                  /* transaction started */
147    int changes;                       /* changes during transaction */
148    POOLMEM *fname;                    /* Filename only */
149    POOLMEM *path;                     /* Path only */
150    POOLMEM *esc_name;                 /* Escaped file name */
151    POOLMEM *esc_path;                 /* Escaped path name */
152    int fnl;                           /* file name length */
153    int pnl;                           /* path name length */
154 };
155
156
157 /*
158  * "Generic" names for easier conversion
159  *
160  *                    S Q L I T E
161  */
162 #define sql_store_result(x)   (x)->result
163 #define sql_free_result(x)    my_sqlite_free_table(x)
164 #define sql_fetch_row(x)      my_sqlite_fetch_row(x)
165 #define sql_query(x, y)       my_sqlite_query((x), (y))
166 #ifdef HAVE_SQLITE3
167 #define sql_insert_id(x,y)    sqlite3_last_insert_rowid((x)->db)
168 #define sql_close(x)          sqlite3_close((x)->db)
169 #else
170 #define sql_insert_id(x,y)    sqlite_last_insert_rowid((x)->db)
171 #define sql_close(x)          sqlite_close((x)->db)
172 #endif
173 #define sql_strerror(x)       (x)->sqlite_errmsg?(x)->sqlite_errmsg:"unknown"
174 #define sql_num_rows(x)       (x)->nrow
175 #define sql_data_seek(x, i)   (x)->row = (i)
176 #define sql_affected_rows(x)  1
177 #define sql_field_seek(x, y)  my_sqlite_field_seek((x), (y))
178 #define sql_fetch_field(x)    my_sqlite_fetch_field(x)
179 #define sql_num_fields(x)     ((x)->ncolumn)
180 #define SQL_ROW               char**
181
182 #define sql_batch_start(x,y)    my_batch_start(x,y)
183 #define sql_batch_end(x,y,z)    my_batch_end(x,y,z)
184 #define sql_batch_insert(x,y,z) my_batch_insert(x,y,z)
185 #define sql_batch_lock_path_query       my_sqlite_batch_lock_query
186 #define sql_batch_lock_filename_query   my_sqlite_batch_lock_query
187 #define sql_batch_unlock_tables_query   my_sqlite_batch_unlock_query
188 #define sql_batch_fill_filename_query   my_sqlite_batch_fill_filename_query
189 #define sql_batch_fill_path_query       my_sqlite_batch_fill_path_query
190
191 /* In cats/sqlite.c */
192 void       my_sqlite_free_table(B_DB *mdb);
193 SQL_ROW    my_sqlite_fetch_row(B_DB *mdb);
194 int        my_sqlite_query(B_DB *mdb, const char *cmd);
195 void       my_sqlite_field_seek(B_DB *mdb, int field);
196 SQL_FIELD *my_sqlite_fetch_field(B_DB *mdb);
197 extern const char* my_sqlite_batch_lock_query;
198 extern const char* my_sqlite_batch_unlock_query;
199 extern const char* my_sqlite_batch_fill_filename_query;
200 extern const char* my_sqlite_batch_fill_path_query;
201
202
203 #else
204
205 /*                    S Q L I T E 3            */
206
207
208 #ifdef HAVE_SQLITE3
209
210
211 #define BDB_VERSION 11
212
213 #include <sqlite3.h>
214
215 /* Define opaque structure for sqlite */
216 struct sqlite3 {
217    char dummy;
218 };
219
220 #define IS_NUM(x)             ((x) == 1)
221 #define IS_NOT_NULL(x)        ((x) == 1)
222
223 typedef struct s_sql_field {
224    char *name;                        /* name of column */
225    int length;                        /* length */
226    int max_length;                    /* max length */
227    uint32_t type;                     /* type */
228    uint32_t flags;                    /* flags */
229 } SQL_FIELD;
230
231 /*
232  * This is the "real" definition that should only be
233  * used inside sql.c and associated database interface
234  * subroutines.
235  *                    S Q L I T E
236  */
237 struct B_DB {
238    BQUEUE bq;                         /* queue control */
239    brwlock_t lock;                    /* transaction lock */
240    struct sqlite3 *db;
241    char **result;
242    int status;
243    int nrow;                          /* nrow returned from sqlite */
244    int ncolumn;                       /* ncolum returned from sqlite */
245    int num_rows;                      /* used by code */
246    int row;                           /* seek row */
247    int field;                         /* seek field */
248    SQL_FIELD **fields;                /* defined fields */
249    int ref_count;
250    char *db_name;
251    char *db_user;
252    char *db_address;                  /* host name address */
253    char *db_socket;                   /* socket for local access */
254    char *db_password;
255    int  db_port;                      /* port for host name address */
256    bool connected;                    /* connection made to db */
257    bool have_insert_id;               /* do not have insert id */
258    bool fields_defined;               /* set when fields defined */
259    char *sqlite_errmsg;               /* error message returned by sqlite */
260    POOLMEM *errmsg;                   /* nicely edited error message */
261    POOLMEM *cmd;                      /* SQL command string */
262    POOLMEM *cached_path;              /* cached path name */
263    int cached_path_len;               /* length of cached path */
264    uint32_t cached_path_id;           /* cached path id */
265    bool allow_transactions;           /* transactions allowed */
266    bool transaction;                  /* transaction started */
267    int changes;                       /* changes during transaction */
268    POOLMEM *fname;                    /* Filename only */
269    POOLMEM *path;                     /* Path only */
270    POOLMEM *esc_name;                 /* Escaped file name */
271    POOLMEM *esc_path;                 /* Escaped path name */
272    int fnl;                           /* file name length */
273    int pnl;                           /* path name length */
274 };
275
276 /*
277  * Conversion of sqlite 2 names to sqlite3
278  */
279 #define sqlite_last_insert_rowid sqlite3_last_insert_rowid
280 #define sqlite_open sqlite3_open
281 #define sqlite_close sqlite3_close
282 #define sqlite_result sqlite3_result
283 #define sqlite_exec sqlite3_exec
284 #define sqlite_get_table sqlite3_get_table
285 #define sqlite_free_table sqlite3_free_table
286
287
288 /*
289  * "Generic" names for easier conversion
290  *
291  *                    S Q L I T E 3
292  */
293 #define sql_store_result(x)   (x)->result
294 #define sql_free_result(x)    my_sqlite_free_table(x)
295 #define sql_fetch_row(x)      my_sqlite_fetch_row(x)
296 #define sql_query(x, y)       my_sqlite_query((x), (y))
297 #ifdef HAVE_SQLITE3
298 #define sql_insert_id(x,y)    sqlite3_last_insert_rowid((x)->db)
299 #define sql_close(x)          sqlite3_close((x)->db)
300 #else
301 #define sql_insert_id(x,y)    sqlite_last_insert_rowid((x)->db)
302 #define sql_close(x)          sqlite_close((x)->db)
303 #endif
304 #define sql_strerror(x)       (x)->sqlite_errmsg?(x)->sqlite_errmsg:"unknown"
305 #define sql_num_rows(x)       (x)->nrow
306 #define sql_data_seek(x, i)   (x)->row = (i)
307 #define sql_affected_rows(x)  1
308 #define sql_field_seek(x, y)  my_sqlite_field_seek((x), (y))
309 #define sql_fetch_field(x)    my_sqlite_fetch_field(x)
310 #define sql_num_fields(x)     ((x)->ncolumn)
311 #define sql_batch_start(x,y)    my_batch_start(x,y)
312 #define sql_batch_end(x,y,z)    my_batch_end(x,y,z)
313 #define sql_batch_insert(x,y,z) my_batch_insert(x,y,z)
314 #define SQL_ROW               char**
315 #define sql_batch_lock_path_query       my_sqlite_batch_lock_query
316 #define sql_batch_lock_filename_query   my_sqlite_batch_lock_query
317 #define sql_batch_unlock_tables_query   my_sqlite_batch_unlock_query
318 #define sql_batch_fill_filename_query   my_sqlite_batch_fill_filename_query
319 #define sql_batch_fill_path_query       my_sqlite_batch_fill_path_query
320
321 /* In cats/sqlite.c */
322 void       my_sqlite_free_table(B_DB *mdb);
323 SQL_ROW    my_sqlite_fetch_row(B_DB *mdb);
324 int        my_sqlite_query(B_DB *mdb, const char *cmd);
325 void       my_sqlite_field_seek(B_DB *mdb, int field);
326 SQL_FIELD *my_sqlite_fetch_field(B_DB *mdb);
327 extern const char* my_sqlite_batch_lock_query;
328 extern const char* my_sqlite_batch_unlock_query;
329 extern const char* my_sqlite_batch_fill_filename_query;
330 extern const char* my_sqlite_batch_fill_path_query;
331
332
333 #else
334
335 #ifdef HAVE_MYSQL
336
337 #define BDB_VERSION 11
338
339 #include <mysql.h>
340
341 /*
342  * This is the "real" definition that should only be
343  * used inside sql.c and associated database interface
344  * subroutines.
345  *
346  *                     M Y S Q L
347  */
348 struct B_DB {
349    BQUEUE bq;                         /* queue control */
350    brwlock_t lock;                    /* transaction lock */
351    MYSQL mysql;
352    MYSQL *db;
353    MYSQL_RES *result;
354    int status;
355    my_ulonglong num_rows;
356    int ref_count;
357    char *db_name;
358    char *db_user;
359    char *db_password;
360    char *db_address;                  /* host address */
361    char *db_socket;                   /* socket for local access */
362    int db_port;                       /* port of host address */
363    int have_insert_id;                /* do have insert_id() */
364    bool connected;
365    POOLMEM *errmsg;                   /* nicely edited error message */
366    POOLMEM *cmd;                      /* SQL command string */
367    POOLMEM *cached_path;
368    int cached_path_len;               /* length of cached path */
369    uint32_t cached_path_id;
370    bool allow_transactions;           /* transactions allowed */ 
371    int changes;                       /* changes made to db */
372    POOLMEM *fname;                    /* Filename only */
373    POOLMEM *path;                     /* Path only */
374    POOLMEM *esc_name;                 /* Escaped file name */
375    POOLMEM *esc_path;                 /* Escaped path name */
376    int fnl;                           /* file name length */
377    int pnl;                           /* path name length */
378 };
379
380 #define DB_STATUS int
381
382 /* "Generic" names for easier conversion */
383 #define sql_store_result(x)   mysql_store_result((x)->db)
384 #define sql_use_result(x)     mysql_use_result((x)->db)
385 #define sql_free_result(x)    my_mysql_free_result(x)
386 #define sql_fetch_row(x)      mysql_fetch_row((x)->result)
387 #define sql_query(x, y)       mysql_query((x)->db, (y))
388 #define sql_strerror(x)       mysql_error((x)->db)
389 #define sql_num_rows(x)       mysql_num_rows((x)->result)
390 #define sql_data_seek(x, i)   mysql_data_seek((x)->result, (i))
391 #define sql_affected_rows(x)  mysql_affected_rows((x)->db)
392 #define sql_insert_id(x,y)    mysql_insert_id((x)->db)
393 #define sql_field_seek(x, y)  mysql_field_seek((x)->result, (y))
394 #define sql_fetch_field(x)    mysql_fetch_field((x)->result)
395 #define sql_num_fields(x)     (int)mysql_num_fields((x)->result)
396 #define SQL_ROW               MYSQL_ROW
397 #define SQL_FIELD             MYSQL_FIELD
398
399 #define sql_batch_start(x,y)    my_batch_start(x,y)
400 #define sql_batch_end(x,y,z)    my_batch_end(x,y,z)
401 #define sql_batch_insert(x,y,z) my_batch_insert(x,y,z)
402 #define sql_batch_lock_path_query       my_mysql_batch_lock_path_query
403 #define sql_batch_lock_filename_query   my_mysql_batch_lock_filename_query
404 #define sql_batch_unlock_tables_query   my_mysql_batch_unlock_tables_query
405 #define sql_batch_fill_filename_query   my_mysql_batch_fill_filename_query
406 #define sql_batch_fill_path_query       my_mysql_batch_fill_path_query
407
408
409 extern const char* my_mysql_batch_lock_path_query;
410 extern const char* my_mysql_batch_lock_filename_query;
411 extern const char* my_mysql_batch_unlock_tables_query;
412 extern const char* my_mysql_batch_fill_filename_query;
413 extern const char* my_mysql_batch_fill_path_query;
414 extern void  my_mysql_free_result(B_DB *mdb);
415
416 #else
417
418 #ifdef HAVE_POSTGRESQL
419
420 #define BDB_VERSION 11
421
422 #include <libpq-fe.h>
423
424 /* TEMP: the following is taken from select OID, typname from pg_type; */
425 #define IS_NUM(x)        ((x) == 20 || (x) == 21 || (x) == 23 || (x) == 700 || (x) == 701)
426 #define IS_NOT_NULL(x)   ((x) == 1)
427
428 typedef char **POSTGRESQL_ROW;
429 typedef struct pg_field {
430    char         *name;
431    int           max_length;
432    unsigned int  type;
433    unsigned int  flags;       // 1 == not null
434 } POSTGRESQL_FIELD;
435
436
437 /*
438  * This is the "real" definition that should only be
439  * used inside sql.c and associated database interface
440  * subroutines.
441  *
442  *                     P O S T G R E S Q L
443  */
444 struct B_DB {
445    BQUEUE bq;                         /* queue control */
446    brwlock_t lock;                    /* transaction lock */
447    PGconn *db;
448    PGresult *result;
449    int status;
450    POSTGRESQL_ROW row;
451    POSTGRESQL_FIELD *fields;
452    int num_rows;
453    int row_size;                  /* size of malloced rows */
454    int num_fields;
455    int fields_size;               /* size of malloced fields */
456    int row_number;                /* row number from my_postgresql_data_seek */
457    int field_number;              /* field number from my_postgresql_field_seek */
458    int ref_count;
459    char *db_name;
460    char *db_user;
461    char *db_password;
462    char *db_address;              /* host address */
463    char *db_socket;               /* socket for local access */
464    int db_port;                   /* port of host address */
465    int have_insert_id;            /* do have insert_id() */
466    bool connected;
467    POOLMEM *errmsg;               /* nicely edited error message */
468    POOLMEM *cmd;                  /* SQL command string */
469    POOLMEM *cached_path;
470    int cached_path_len;           /* length of cached path */
471    uint32_t cached_path_id;
472    bool allow_transactions;       /* transactions allowed */
473    bool transaction;              /* transaction started */
474    int changes;                   /* changes made to db */
475    POOLMEM *fname;                /* Filename only */
476    POOLMEM *path;                 /* Path only */
477    POOLMEM *esc_name;             /* Escaped file name */
478    POOLMEM *esc_path;             /* Escaped path name */
479    int fnl;                       /* file name length */
480    int pnl;                       /* path name length */
481 };
482
483 void               my_postgresql_free_result(B_DB *mdb);
484 POSTGRESQL_ROW     my_postgresql_fetch_row  (B_DB *mdb);
485 int                my_postgresql_query      (B_DB *mdb, const char *query);
486 void               my_postgresql_data_seek  (B_DB *mdb, int row);
487 int                my_postgresql_currval    (B_DB *mdb, const char *table_name);
488 void               my_postgresql_field_seek (B_DB *mdb, int row);
489 POSTGRESQL_FIELD * my_postgresql_fetch_field(B_DB *mdb);
490
491 int my_postgresql_batch_start(JCR *jcr, B_DB *mdb);
492 int my_postgresql_batch_end(JCR *jcr, B_DB *mdb, const char *error);
493 typedef struct ATTR_DBR ATTR_DBR;
494 int my_postgresql_batch_insert(JCR *jcr, B_DB *mdb, ATTR_DBR *ar);
495 char *my_postgresql_copy_escape(char *dest, char *src, size_t len);
496
497 extern const char* my_pg_batch_lock_path_query;
498 extern const char* my_pg_batch_lock_filename_query;
499 extern const char* my_pg_batch_unlock_tables_query;
500 extern const char* my_pg_batch_fill_filename_query;
501 extern const char* my_pg_batch_fill_path_query;
502
503 /* "Generic" names for easier conversion */
504 #define sql_store_result(x)   ((x)->result)
505 #define sql_free_result(x)    my_postgresql_free_result(x)
506 #define sql_fetch_row(x)      my_postgresql_fetch_row(x)
507 #define sql_query(x, y)       my_postgresql_query((x), (y))
508 #define sql_close(x)          PQfinish((x)->db)
509 #define sql_strerror(x)       PQerrorMessage((x)->db)
510 #define sql_num_rows(x)       ((unsigned) PQntuples((x)->result))
511 #define sql_data_seek(x, i)   my_postgresql_data_seek((x), (i))
512 #define sql_affected_rows(x)  ((unsigned) atoi(PQcmdTuples((x)->result)))
513 #define sql_insert_id(x,y)    my_postgresql_currval((x), (y))
514 #define sql_field_seek(x, y)  my_postgresql_field_seek((x), (y))
515 #define sql_fetch_field(x)    my_postgresql_fetch_field(x)
516 #define sql_num_fields(x)     ((x)->num_fields)
517
518 #define sql_batch_start(x,y)    my_postgresql_batch_start(x,y)
519 #define sql_batch_end(x,y,z)    my_postgresql_batch_end(x,y,z)
520 #define sql_batch_insert(x,y,z) my_postgresql_batch_insert(x,y,z)
521 #define sql_batch_lock_path_query       my_pg_batch_lock_path_query
522 #define sql_batch_lock_filename_query   my_pg_batch_lock_filename_query
523 #define sql_batch_unlock_tables_query   my_pg_batch_unlock_tables_query
524 #define sql_batch_fill_filename_query   my_pg_batch_fill_filename_query
525 #define sql_batch_fill_path_query       my_pg_batch_fill_path_query
526
527 #define SQL_ROW               POSTGRESQL_ROW
528 #define SQL_FIELD             POSTGRESQL_FIELD
529
530 #else
531
532 #ifdef HAVE_DBI
533
534 #define BDB_VERSION 11
535
536 #include <dbi/dbi.h>
537
538 #ifdef HAVE_BATCH_FILE_INSERT
539 #include <dbi/dbi-dev.h>
540 #endif //HAVE_BATCH_FILE_INSERT
541
542 #define IS_NUM(x)        ((x) == 1 || (x) == 2 )
543 #define IS_NOT_NULL(x)   ((x) == (1 << 0))
544
545 typedef char **DBI_ROW;
546 typedef struct dbi_field {
547    char         *name;
548    int           max_length;
549    unsigned int  type;
550    unsigned int  flags;       // 1 == not null
551 } DBI_FIELD;
552
553 typedef struct dbi_field_get {
554    BQUEUE bq;
555    char *value;
556 } DBI_FIELD_GET;
557
558 /*
559  * This is the "real" definition that should only be
560  * used inside sql.c and associated database interface
561  * subroutines.
562  *
563  *                     D B I
564  */
565 struct B_DB {
566    BQUEUE bq;                         /* queue control */
567    brwlock_t lock;                    /* transaction lock */
568    dbi_conn *db;
569    dbi_result *result;
570    dbi_inst instance;
571    dbi_error_flag status;
572    DBI_ROW row;
573    DBI_FIELD *fields;
574    DBI_FIELD_GET *field_get;
575    int num_rows;
576    int row_size;                  /* size of malloced rows */
577    int num_fields;
578    int fields_size;               /* size of malloced fields */
579    int row_number;                /* row number from my_postgresql_data_seek */
580    int field_number;              /* field number from my_postgresql_field_seek */
581    int ref_count;
582    int db_type;                   /* DBI driver defined */
583    char *db_driverdir ;           /* DBI driver dir */
584    char *db_driver;               /* DBI type database */
585    char *db_name;
586    char *db_user;
587    char *db_password;
588    char *db_address;              /* host address */
589    char *db_socket;               /* socket for local access */
590    int db_port;                   /* port of host address */
591    int have_insert_id;            /* do have insert_id() */
592    bool connected;
593    POOLMEM *errmsg;               /* nicely edited error message */
594    POOLMEM *cmd;                  /* SQL command string */
595    POOLMEM *cached_path;
596    int cached_path_len;           /* length of cached path */
597    uint32_t cached_path_id;
598    bool allow_transactions;       /* transactions allowed */
599    bool transaction;              /* transaction started */
600    int changes;                   /* changes made to db */
601    POOLMEM *fname;                /* Filename only */
602    POOLMEM *path;                 /* Path only */
603    POOLMEM *esc_name;             /* Escaped file name */
604    POOLMEM *esc_path;             /* Escaped path name */
605    int fnl;                       /* file name length */
606    int pnl;                       /* path name length */
607 };
608
609 void               my_dbi_free_result(B_DB *mdb);
610 DBI_ROW            my_dbi_fetch_row  (B_DB *mdb);
611 int                my_dbi_query      (B_DB *mdb, const char *query);
612 void               my_dbi_data_seek  (B_DB *mdb, int row);
613 void               my_dbi_field_seek (B_DB *mdb, int row);
614 DBI_FIELD *        my_dbi_fetch_field(B_DB *mdb);
615 const char *       my_dbi_strerror   (B_DB *mdb);
616 int                my_dbi_getisnull  (dbi_result *result, int row_number, int column_number);
617 char *             my_dbi_getvalue   (dbi_result *result, int row_number, unsigned int column_number);
618 //int                my_dbi_getvalue   (dbi_result *result, int row_number, unsigned int column_number, char *value);
619 int                my_dbi_sql_insert_id(B_DB *mdb, char *table_name);
620
621 int my_dbi_batch_start(JCR *jcr, B_DB *mdb);
622 int my_dbi_batch_end(JCR *jcr, B_DB *mdb, const char *error);
623 typedef struct ATTR_DBR ATTR_DBR;
624 int my_dbi_batch_insert(JCR *jcr, B_DB *mdb, ATTR_DBR *ar);
625 char *my_postgresql_copy_escape(char *dest, char *src, size_t len);
626 // typedefs for libdbi work with postgresql copy insert
627 typedef int (*custom_function_insert_t)(void*, const char*, int);
628 typedef char* (*custom_function_error_t)(void*);
629 typedef int (*custom_function_end_t)(void*, const char*);
630
631 extern const char* my_dbi_batch_lock_path_query[4];
632 extern const char* my_dbi_batch_lock_filename_query[4];
633 extern const char* my_dbi_batch_unlock_tables_query[4];
634 extern const char* my_dbi_batch_fill_filename_query[4];
635 extern const char* my_dbi_batch_fill_path_query[4];
636
637 /* "Generic" names for easier conversion */
638 #define sql_store_result(x)   (x)->result
639 #define sql_free_result(x)    my_dbi_free_result(x)
640 #define sql_fetch_row(x)      my_dbi_fetch_row(x)
641 #define sql_query(x, y)       my_dbi_query((x), (y))
642 #define sql_close(x)          dbi_conn_close((x)->db)
643 #define sql_strerror(x)       my_dbi_strerror(x)
644 #define sql_num_rows(x)       dbi_result_get_numrows((x)->result)
645 #define sql_data_seek(x, i)   my_dbi_data_seek((x), (i))
646 /* #define sql_affected_rows(x)  dbi_result_get_numrows_affected((x)->result) */
647 #define sql_affected_rows(x)  1
648 #define sql_insert_id(x,y)    my_dbi_sql_insert_id((x), (y))
649 #define sql_field_seek(x, y)  my_dbi_field_seek((x), (y))
650 #define sql_fetch_field(x)    my_dbi_fetch_field(x)
651 #define sql_num_fields(x)     ((x)->num_fields)
652 #define sql_batch_start(x,y)    my_dbi_batch_start(x,y)
653 #define sql_batch_end(x,y,z)    my_dbi_batch_end(x,y,z)
654 #define sql_batch_insert(x,y,z) my_dbi_batch_insert(x,y,z)
655 #define sql_batch_lock_path_query       my_dbi_batch_lock_path_query[db_type]
656 #define sql_batch_lock_filename_query   my_dbi_batch_lock_filename_query[db_type]
657 #define sql_batch_unlock_tables_query   my_dbi_batch_unlock_tables_query[db_type]
658 #define sql_batch_fill_filename_query   my_dbi_batch_fill_filename_query[db_type]
659 #define sql_batch_fill_path_query       my_dbi_batch_fill_path_query[db_type]
660
661 #define SQL_ROW               DBI_ROW
662 #define SQL_FIELD             DBI_FIELD
663
664
665 #else  /* USE BACULA DB routines */
666
667 #define HAVE_BACULA_DB 1
668
669 /* Change this each time there is some incompatible
670  * file format change!!!!
671  */
672 #define BDB_VERSION 13                /* file version number */
673
674 struct s_control {
675    int bdb_version;                   /* Version number */
676    uint32_t JobId;                    /* next Job Id */
677    uint32_t PoolId;                   /* next Pool Id */
678    uint32_t MediaId;                  /* next Media Id */
679    uint32_t JobMediaId;               /* next JobMedia Id */
680    uint32_t ClientId;                 /* next Client Id */
681    uint32_t FileSetId;                /* nest FileSet Id */
682    time_t time;                       /* time file written */
683 };
684
685
686 /* This is the REAL definition for using the
687  *  Bacula internal DB
688  */
689 struct B_DB {
690    BQUEUE bq;                         /* queue control */
691 /* pthread_mutex_t mutex;  */         /* single thread lock */
692    brwlock_t lock;                    /* transaction lock */
693    int ref_count;                     /* number of times opened */
694    struct s_control control;          /* control file structure */
695    int cfd;                           /* control file device */
696    FILE *jobfd;                       /* Jobs records file descriptor */
697    FILE *poolfd;                      /* Pool records fd */
698    FILE *mediafd;                     /* Media records fd */
699    FILE *jobmediafd;                  /* JobMedia records fd */
700    FILE *clientfd;                    /* Client records fd */
701    FILE *filesetfd;                   /* FileSet records fd */
702    char *db_name;                     /* name of database */
703    POOLMEM *errmsg;                   /* nicely edited error message */
704    POOLMEM *cmd;                      /* Command string */
705    POOLMEM *cached_path;
706    int cached_path_len;               /* length of cached path */
707    uint32_t cached_path_id;
708 };
709
710 #endif /* HAVE_SQLITE3 */
711 #endif /* HAVE_MYSQL */
712 #endif /* HAVE_SQLITE */
713 #endif /* HAVE_POSTGRESQL */
714 #endif /* HAVE_DBI */
715 #endif
716
717 /* Use for better error location printing */
718 #define UPDATE_DB(jcr, db, cmd) UpdateDB(__FILE__, __LINE__, jcr, db, cmd)
719 #define INSERT_DB(jcr, db, cmd) InsertDB(__FILE__, __LINE__, jcr, db, cmd)
720 #define QUERY_DB(jcr, db, cmd) QueryDB(__FILE__, __LINE__, jcr, db, cmd)
721 #define DELETE_DB(jcr, db, cmd) DeleteDB(__FILE__, __LINE__, jcr, db, cmd)
722
723
724 #else    /* not __SQL_C */
725
726 /* This is a "dummy" definition for use outside of sql.c
727  */
728 struct B_DB {
729    int dummy;                         /* for SunOS compiler */
730 };
731
732 #endif /*  __SQL_C */
733
734 /* ==============================================================
735  *
736  *  What follows are definitions that are used "globally" for all
737  *   the different SQL engines and both inside and external to the
738  *   cats directory.
739  */
740
741 extern uint32_t bacula_db_version;
742
743 #define faddr_t long
744
745 /*
746  * Structure used when calling db_get_query_ids()
747  *  allows the subroutine to return a list of ids.
748  */
749 class dbid_list : public SMARTALLOC {
750 public:
751    DBId_t *DBId;                      /* array of DBIds */
752    char *PurgedFiles;                 /* Array of PurgedFile flags */
753    int num_ids;                       /* num of ids actually stored */
754    int max_ids;                       /* size of id array */
755    int num_seen;                      /* number of ids processed */
756    int tot_ids;                       /* total to process */
757
758    dbid_list();                       /* in sql.c */
759    ~dbid_list();                      /* in sql.c */
760 };
761
762
763
764
765 /* Job information passed to create job record and update
766  * job record at end of job. Note, although this record
767  * contains all the fields found in the Job database record,
768  * it also contains fields found in the JobMedia record.
769  */
770 /* Job record */
771 struct JOB_DBR {
772    JobId_t JobId;
773    char Job[MAX_NAME_LENGTH];         /* Job unique name */
774    char Name[MAX_NAME_LENGTH];        /* Job base name */
775    int JobType;                       /* actually char(1) */
776    int JobLevel;                      /* actually char(1) */
777    int JobStatus;                     /* actually char(1) */
778    DBId_t ClientId;                   /* Id of client */
779    DBId_t PoolId;                     /* Id of pool */
780    DBId_t FileSetId;                  /* Id of FileSet */
781    DBId_t PriorJobId;                 /* Id of migrated (prior) job */
782    time_t SchedTime;                  /* Time job scheduled */
783    time_t StartTime;                  /* Job start time */
784    time_t EndTime;                    /* Job termination time of orig job */
785    time_t RealEndTime;                /* Job termination time of this job */
786    utime_t JobTDate;                  /* Backup time/date in seconds */
787    uint32_t VolSessionId;
788    uint32_t VolSessionTime;
789    uint32_t JobFiles;
790    uint32_t JobErrors;
791    uint32_t JobMissingFiles;
792    uint64_t JobBytes;
793    uint64_t ReadBytes;
794    int PurgedFiles;
795    int HasBase;
796
797    /* Note, FirstIndex, LastIndex, Start/End File and Block
798     * are only used in the JobMedia record.
799     */
800    uint32_t FirstIndex;               /* First index this Volume */
801    uint32_t LastIndex;                /* Last index this Volume */
802    uint32_t StartFile;
803    uint32_t EndFile;
804    uint32_t StartBlock;
805    uint32_t EndBlock;
806
807    char cSchedTime[MAX_TIME_LENGTH];
808    char cStartTime[MAX_TIME_LENGTH];
809    char cEndTime[MAX_TIME_LENGTH];
810    char cRealEndTime[MAX_TIME_LENGTH];
811    /* Extra stuff not in DB */
812    int limit;                         /* limit records to display */
813    faddr_t rec_addr;
814    uint32_t FileIndex;                /* added during Verify */
815 };
816
817 /* Job Media information used to create the media records
818  * for each Volume used for the job.
819  */
820 /* JobMedia record */
821 struct JOBMEDIA_DBR {
822    DBId_t JobMediaId;                 /* record id */
823    JobId_t  JobId;                    /* JobId */
824    DBId_t MediaId;                    /* MediaId */
825    uint32_t FirstIndex;               /* First index this Volume */
826    uint32_t LastIndex;                /* Last index this Volume */
827    uint32_t StartFile;                /* File for start of data */
828    uint32_t EndFile;                  /* End file on Volume */
829    uint32_t StartBlock;               /* start block on tape */
830    uint32_t EndBlock;                 /* last block */
831    uint32_t Copy;                     /* identical copy */
832 };
833
834
835 /* Volume Parameter structure */
836 struct VOL_PARAMS {
837    char VolumeName[MAX_NAME_LENGTH];  /* Volume name */
838    char MediaType[MAX_NAME_LENGTH];   /* Media Type */
839    char Storage[MAX_NAME_LENGTH];     /* Storage name */
840    uint32_t VolIndex;                 /* Volume seqence no. */
841    uint32_t FirstIndex;               /* First index this Volume */
842    uint32_t LastIndex;                /* Last index this Volume */
843    int32_t Slot;                      /* Slot */
844    uint64_t StartAddr;                /* Start address */
845    uint64_t EndAddr;                  /* End address */
846    int32_t InChanger;                 /* InChanger flag */
847 // uint32_t Copy;                     /* identical copy */
848 // uint32_t Stripe;                   /* RAIT strip number */
849 };
850
851
852 /* Attributes record -- NOT same as in database because
853  *  in general, this "record" creates multiple database
854  *  records (e.g. pathname, filename, fileattributes).
855  */
856 struct ATTR_DBR {
857    char *fname;                       /* full path & filename */
858    char *link;                        /* link if any */
859    char *attr;                        /* attributes statp */
860    uint32_t FileIndex;
861    uint32_t Stream;
862    JobId_t  JobId;
863    DBId_t ClientId;
864    DBId_t PathId;
865    DBId_t FilenameId;
866    FileId_t FileId;
867    char *Digest;
868    int DigestType;
869 };
870
871
872 /* File record -- same format as database */
873 struct FILE_DBR {
874    FileId_t FileId;
875    uint32_t FileIndex;
876    JobId_t  JobId;
877    DBId_t FilenameId;
878    DBId_t PathId;
879    JobId_t  MarkId;
880    char LStat[256];
881    char Digest[BASE64_SIZE(CRYPTO_DIGEST_MAX_SIZE)];
882    int DigestType;                    /* NO_SIG/MD5_SIG/SHA1_SIG */
883 };
884
885 /* Pool record -- same format as database */
886 struct POOL_DBR {
887    DBId_t PoolId;
888    char Name[MAX_NAME_LENGTH];        /* Pool name */
889    uint32_t NumVols;                  /* total number of volumes */
890    uint32_t MaxVols;                  /* max allowed volumes */
891    int32_t LabelType;                 /* Bacula/ANSI/IBM */
892    int32_t UseOnce;                   /* set to use once only */
893    int32_t UseCatalog;                /* set to use catalog */
894    int32_t AcceptAnyVolume;           /* set to accept any volume sequence */
895    int32_t AutoPrune;                 /* set to prune automatically */
896    int32_t Recycle;                   /* default Vol recycle flag */
897    utime_t  VolRetention;             /* retention period in seconds */
898    utime_t  VolUseDuration;           /* time in secs volume can be used */
899    uint32_t MaxVolJobs;               /* Max Jobs on Volume */
900    uint32_t MaxVolFiles;              /* Max files on Volume */
901    uint64_t MaxVolBytes;              /* Max bytes on Volume */
902    DBId_t RecyclePoolId;              /* RecyclePool destination when media is purged */
903    DBId_t ScratchPoolId;              /* ScratchPool source when media is needed */
904    char PoolType[MAX_NAME_LENGTH];
905    char LabelFormat[MAX_NAME_LENGTH];
906    /* Extra stuff not in DB */
907    faddr_t rec_addr;
908 };
909
910 class DEVICE_DBR {
911 public:
912    DBId_t DeviceId;
913    char Name[MAX_NAME_LENGTH];        /* Device name */
914    DBId_t MediaTypeId;                /* MediaType */
915    DBId_t StorageId;                  /* Storage id if autochanger */
916    uint32_t DevMounts;                /* Number of times mounted */
917    uint32_t DevErrors;                /* Number of read/write errors */
918    uint64_t DevReadBytes;             /* Number of bytes read */
919    uint64_t DevWriteBytes;            /* Number of bytew written */
920    uint64_t DevReadTime;              /* time spent reading volume */
921    uint64_t DevWriteTime;             /* time spent writing volume */
922    uint64_t DevReadTimeSincCleaning;  /* read time since cleaning */
923    uint64_t DevWriteTimeSincCleaning; /* write time since cleaning */
924    time_t   CleaningDate;             /* time last cleaned */
925    utime_t  CleaningPeriod;           /* time between cleanings */
926 };
927
928 class STORAGE_DBR {
929 public:
930    DBId_t StorageId;
931    char Name[MAX_NAME_LENGTH];        /* Device name */
932    int AutoChanger;                   /* Set if autochanger */
933
934    /* Not in database */
935    bool created;                      /* set if created by db_create ... */
936 };
937
938 class MEDIATYPE_DBR {
939 public:
940    DBId_t MediaTypeId;
941    char MediaType[MAX_NAME_LENGTH];   /* MediaType string */
942    int ReadOnly;                      /* Set if read-only */
943 };
944
945
946 /* Media record -- same as the database */
947 struct MEDIA_DBR {
948    DBId_t MediaId;                    /* Unique volume id */
949    char VolumeName[MAX_NAME_LENGTH];  /* Volume name */
950    char MediaType[MAX_NAME_LENGTH];   /* Media type */
951    DBId_t PoolId;                     /* Pool id */
952    time_t   FirstWritten;             /* Time Volume first written this usage */
953    time_t   LastWritten;              /* Time Volume last written */
954    time_t   LabelDate;                /* Date/Time Volume labeled */
955    time_t   InitialWrite;             /* Date/Time Volume first written */
956    int32_t  LabelType;                /* Label (Bacula/ANSI/IBM) */
957    uint32_t VolJobs;                  /* number of jobs on this medium */
958    uint32_t VolFiles;                 /* Number of files */
959    uint32_t VolBlocks;                /* Number of blocks */
960    uint32_t VolMounts;                /* Number of times mounted */
961    uint32_t VolErrors;                /* Number of read/write errors */
962    uint32_t VolWrites;                /* Number of writes */
963    uint32_t VolReads;                 /* Number of reads */
964    uint64_t VolBytes;                 /* Number of bytes written */
965    uint32_t VolParts;                 /* Number of parts written */
966    uint64_t MaxVolBytes;              /* Max bytes to write to Volume */
967    uint64_t VolCapacityBytes;         /* capacity estimate */
968    uint64_t VolReadTime;              /* time spent reading volume */
969    uint64_t VolWriteTime;             /* time spent writing volume */
970    utime_t  VolRetention;             /* Volume retention in seconds */
971    utime_t  VolUseDuration;           /* time in secs volume can be used */
972    uint32_t MaxVolJobs;               /* Max Jobs on Volume */
973    uint32_t MaxVolFiles;              /* Max files on Volume */
974    int32_t  Recycle;                  /* recycle yes/no */
975    int32_t  Slot;                     /* slot in changer */
976    int32_t  Enabled;                  /* 0=disabled, 1=enabled, 2=archived */
977    int32_t  InChanger;                /* Volume currently in changer */
978    DBId_t   StorageId;                /* Storage record Id */
979    uint32_t EndFile;                  /* Last file on volume */
980    uint32_t EndBlock;                 /* Last block on volume */
981    uint32_t RecycleCount;             /* Number of times recycled */
982    char     VolStatus[20];            /* Volume status */
983    DBId_t   DeviceId;                 /* Device where Vol last written */
984    DBId_t   LocationId;               /* Where Volume is -- user defined */
985    DBId_t   ScratchPoolId;            /* Where to move if scratch */
986    DBId_t   RecyclePoolId;            /* Where to move when recycled */
987    /* Extra stuff not in DB */
988    faddr_t rec_addr;                  /* found record address */
989    /* Since the database returns times as strings, this is how we pass
990     *   them back.
991     */
992    char    cFirstWritten[MAX_TIME_LENGTH]; /* FirstWritten returned from DB */
993    char    cLastWritten[MAX_TIME_LENGTH];  /* LastWritten returned from DB */
994    char    cLabelDate[MAX_TIME_LENGTH];    /* LabelData returned from DB */
995    char    cInitialWrite[MAX_TIME_LENGTH]; /* InitialWrite returned from DB */
996    bool    set_first_written;
997    bool    set_label_date;
998 };
999
1000 /* Client record -- same as the database */
1001 struct CLIENT_DBR {
1002    DBId_t ClientId;                   /* Unique Client id */
1003    int AutoPrune;
1004    utime_t FileRetention;
1005    utime_t JobRetention;
1006    char Name[MAX_NAME_LENGTH];        /* Client name */
1007    char Uname[256];                   /* Uname for client */
1008 };
1009
1010 /* Counter record as in database */
1011 struct COUNTER_DBR {
1012    char Counter[MAX_NAME_LENGTH];
1013    int32_t MinValue;
1014    int32_t MaxValue;
1015    int32_t CurrentValue;
1016    char WrapCounter[MAX_NAME_LENGTH];
1017 };
1018
1019
1020 /* FileSet record -- same as the database */
1021 struct FILESET_DBR {
1022    DBId_t FileSetId;                  /* Unique FileSet id */
1023    char FileSet[MAX_NAME_LENGTH];     /* FileSet name */
1024    char MD5[50];                      /* MD5 signature of include/exclude */
1025    time_t CreateTime;                 /* date created */
1026    /*
1027     * This is where we return CreateTime
1028     */
1029    char cCreateTime[MAX_TIME_LENGTH]; /* CreateTime as returned from DB */
1030    /* Not in DB but returned by db_create_fileset() */
1031    bool created;                      /* set when record newly created */
1032 };
1033
1034 /* Call back context for getting a 32/64 bit value from the database */
1035 struct db_int64_ctx {
1036    int64_t value;                     /* value returned */
1037    int count;                         /* number of values seen */
1038 };
1039
1040
1041 #include "protos.h"
1042 #include "jcr.h"
1043 #include "sql_cmds.h"
1044
1045 /*
1046  * Exported globals from sql.c
1047  */
1048 extern int DLL_IMP_EXP db_type;        /* SQL engine type index */
1049
1050 /*
1051  * Some functions exported by sql.c for use within the
1052  *   cats directory.
1053  */
1054 void list_result(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type);
1055 void list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx);
1056 int get_sql_record_max(JCR *jcr, B_DB *mdb);
1057 bool check_tables_version(JCR *jcr, B_DB *mdb);
1058 void _db_unlock(const char *file, int line, B_DB *mdb);
1059 void _db_lock(const char *file, int line, B_DB *mdb);
1060 const char *db_get_type(void);
1061
1062 void print_dashes(B_DB *mdb);
1063 void print_result(B_DB *mdb);
1064 int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
1065 int InsertDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
1066 int DeleteDB(const char *file, int line, JCR *jcr, B_DB *db, char *delete_cmd);
1067 int UpdateDB(const char *file, int line, JCR *jcr, B_DB *db, char *update_cmd);
1068 void split_path_and_file(JCR *jcr, B_DB *mdb, const char *fname);
1069 #endif /* __SQL_H_ */