6 * Anyone who accesses the database will need to include
9 * This file contains definitions common to sql.c and
10 * the external world, and definitions destined only
11 * for the external world. This is control with
12 * the define __SQL_C, which is defined only in sql.c
17 Copyright (C) 2000-2006 Kern Sibbald
19 This program is free software; you can redistribute it and/or
20 modify it under the terms of the GNU General Public License
21 version 2 as amended with additional clauses defined in the
22 file LICENSE in the main source directory.
24 This program is distributed in the hope that it will be useful,
25 but WITHOUT ANY WARRANTY; without even the implied warranty of
26 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 the file LICENSE for additional details.
32 Here is how database versions work.
34 While I am working on a new release with database changes, the
35 update scripts are in the src/cats directory under the names
36 update_xxx_tables.in. Most of the time, I make database updates
37 in one go and immediately update the version, but not always. If
38 there are going to be several updates as is the case with version
39 1.37, then I will often forgo changing the version until the last
40 update otherwise I will end up with too many versions and a lot
43 When I am pretty sure there will be no more updates, I will
44 change the version from 8 to 9 (in the present case), and when I
45 am 100% sure there will be no more changes, the update script
46 will be copied to the updatedb directory with the correct name
47 (in the present case 8 to 9).
49 Now, in principle, each of the different DB implementations
50 can have a different version, but in practice they are all
51 the same (simplifies things). The exception is the internal
52 database, which is no longer used, and hence, no longer changes.
60 typedef void (DB_LIST_HANDLER)(void *, const char *);
61 typedef int (DB_RESULT_HANDLER)(void *, int, char **);
63 #define db_lock(mdb) _db_lock(__FILE__, __LINE__, mdb)
64 #define db_unlock(mdb) _db_unlock(__FILE__, __LINE__, mdb)
68 #if defined(BUILDING_CATS)
71 #define BDB_VERSION 10
75 /* Define opaque structure for sqlite */
80 #define IS_NUM(x) ((x) == 1)
81 #define IS_NOT_NULL(x) ((x) == 1)
83 typedef struct s_sql_field {
84 char *name; /* name of column */
85 int length; /* length */
86 int max_length; /* max length */
87 uint32_t type; /* type */
88 uint32_t flags; /* flags */
92 * This is the "real" definition that should only be
93 * used inside sql.c and associated database interface
98 BQUEUE bq; /* queue control */
99 brwlock_t lock; /* transaction lock */
103 int nrow; /* nrow returned from sqlite */
104 int ncolumn; /* ncolum returned from sqlite */
105 int num_rows; /* used by code */
106 int row; /* seek row */
107 int field; /* seek field */
108 SQL_FIELD **fields; /* defined fields */
112 char *db_address; /* host name address */
113 char *db_socket; /* socket for local access */
115 int db_port; /* port for host name address */
116 bool connected; /* connection made to db */
117 bool have_insert_id; /* do not have insert id */
118 bool fields_defined; /* set when fields defined */
119 char *sqlite_errmsg; /* error message returned by sqlite */
120 POOLMEM *errmsg; /* nicely edited error message */
121 POOLMEM *cmd; /* SQL command string */
122 POOLMEM *cached_path; /* cached path name */
123 int cached_path_len; /* length of cached path */
124 uint32_t cached_path_id; /* cached path id */
125 bool allow_transactions; /* transactions allowed */
126 bool transaction; /* transaction started */
127 int changes; /* changes during transaction */
128 POOLMEM *fname; /* Filename only */
129 POOLMEM *path; /* Path only */
130 POOLMEM *esc_name; /* Escaped file/path name */
131 int fnl; /* file name length */
132 int pnl; /* path name length */
137 * "Generic" names for easier conversion
141 #define sql_store_result(x) (x)->result
142 #define sql_free_result(x) my_sqlite_free_table(x)
143 #define sql_fetch_row(x) my_sqlite_fetch_row(x)
144 #define sql_query(x, y) my_sqlite_query((x), (y))
146 #define sql_insert_id(x,y) sqlite3_last_insert_rowid((x)->db)
147 #define sql_close(x) sqlite3_close((x)->db)
149 #define sql_insert_id(x,y) sqlite_last_insert_rowid((x)->db)
150 #define sql_close(x) sqlite_close((x)->db)
152 #define sql_strerror(x) (x)->sqlite_errmsg?(x)->sqlite_errmsg:"unknown"
153 #define sql_num_rows(x) (x)->nrow
154 #define sql_data_seek(x, i) (x)->row = (i)
155 #define sql_affected_rows(x) 1
156 #define sql_field_seek(x, y) my_sqlite_field_seek((x), (y))
157 #define sql_fetch_field(x) my_sqlite_fetch_field(x)
158 #define sql_num_fields(x) ((x)->ncolumn)
159 #define SQL_ROW char**
163 /* In cats/sqlite.c */
164 void my_sqlite_free_table(B_DB *mdb);
165 SQL_ROW my_sqlite_fetch_row(B_DB *mdb);
166 int my_sqlite_query(B_DB *mdb, const char *cmd);
167 void my_sqlite_field_seek(B_DB *mdb, int field);
168 SQL_FIELD *my_sqlite_fetch_field(B_DB *mdb);
179 #define BDB_VERSION 10
183 /* Define opaque structure for sqlite */
188 #define IS_NUM(x) ((x) == 1)
189 #define IS_NOT_NULL(x) ((x) == 1)
191 typedef struct s_sql_field {
192 char *name; /* name of column */
193 int length; /* length */
194 int max_length; /* max length */
195 uint32_t type; /* type */
196 uint32_t flags; /* flags */
200 * This is the "real" definition that should only be
201 * used inside sql.c and associated database interface
206 BQUEUE bq; /* queue control */
207 brwlock_t lock; /* transaction lock */
211 int nrow; /* nrow returned from sqlite */
212 int ncolumn; /* ncolum returned from sqlite */
213 int num_rows; /* used by code */
214 int row; /* seek row */
215 int field; /* seek field */
216 SQL_FIELD **fields; /* defined fields */
220 char *db_address; /* host name address */
221 char *db_socket; /* socket for local access */
223 int db_port; /* port for host name address */
224 bool connected; /* connection made to db */
225 bool have_insert_id; /* do not have insert id */
226 bool fields_defined; /* set when fields defined */
227 char *sqlite_errmsg; /* error message returned by sqlite */
228 POOLMEM *errmsg; /* nicely edited error message */
229 POOLMEM *cmd; /* SQL command string */
230 POOLMEM *cached_path; /* cached path name */
231 int cached_path_len; /* length of cached path */
232 uint32_t cached_path_id; /* cached path id */
233 bool allow_transactions; /* transactions allowed */
234 bool transaction; /* transaction started */
235 int changes; /* changes during transaction */
236 POOLMEM *fname; /* Filename only */
237 POOLMEM *path; /* Path only */
238 POOLMEM *esc_name; /* Escaped file/path name */
239 int fnl; /* file name length */
240 int pnl; /* path name length */
244 * Conversion of sqlite 2 names to sqlite3
246 #define sqlite_last_insert_rowid sqlite3_last_insert_rowid
247 #define sqlite_open sqlite3_open
248 #define sqlite_close sqlite3_close
249 #define sqlite_result sqlite3_result
250 #define sqlite_exec sqlite3_exec
251 #define sqlite_get_table sqlite3_get_table
252 #define sqlite_free_table sqlite3_free_table
256 * "Generic" names for easier conversion
260 #define sql_store_result(x) (x)->result
261 #define sql_free_result(x) my_sqlite_free_table(x)
262 #define sql_fetch_row(x) my_sqlite_fetch_row(x)
263 #define sql_query(x, y) my_sqlite_query((x), (y))
265 #define sql_insert_id(x,y) sqlite3_last_insert_rowid((x)->db)
266 #define sql_close(x) sqlite3_close((x)->db)
268 #define sql_insert_id(x,y) sqlite_last_insert_rowid((x)->db)
269 #define sql_close(x) sqlite_close((x)->db)
271 #define sql_strerror(x) (x)->sqlite_errmsg?(x)->sqlite_errmsg:"unknown"
272 #define sql_num_rows(x) (x)->nrow
273 #define sql_data_seek(x, i) (x)->row = (i)
274 #define sql_affected_rows(x) 1
275 #define sql_field_seek(x, y) my_sqlite_field_seek((x), (y))
276 #define sql_fetch_field(x) my_sqlite_fetch_field(x)
277 #define sql_num_fields(x) ((x)->ncolumn)
278 #define SQL_ROW char**
282 /* In cats/sqlite.c */
283 void my_sqlite_free_table(B_DB *mdb);
284 SQL_ROW my_sqlite_fetch_row(B_DB *mdb);
285 int my_sqlite_query(B_DB *mdb, const char *cmd);
286 void my_sqlite_field_seek(B_DB *mdb, int field);
287 SQL_FIELD *my_sqlite_fetch_field(B_DB *mdb);
294 #define BDB_VERSION 10
299 * This is the "real" definition that should only be
300 * used inside sql.c and associated database interface
306 BQUEUE bq; /* queue control */
307 brwlock_t lock; /* transaction lock */
312 my_ulonglong num_rows;
317 char *db_address; /* host address */
318 char *db_socket; /* socket for local access */
319 int db_port; /* port of host address */
320 int have_insert_id; /* do have insert_id() */
322 POOLMEM *errmsg; /* nicely edited error message */
323 POOLMEM *cmd; /* SQL command string */
324 POOLMEM *cached_path;
325 int cached_path_len; /* length of cached path */
326 uint32_t cached_path_id;
327 int changes; /* changes made to db */
328 POOLMEM *fname; /* Filename only */
329 POOLMEM *path; /* Path only */
330 POOLMEM *esc_name; /* Escaped file/path name */
331 int fnl; /* file name length */
332 int pnl; /* path name length */
335 #define DB_STATUS int
337 /* "Generic" names for easier conversion */
338 #define sql_store_result(x) mysql_store_result((x)->db)
339 #define sql_use_result(x) mysql_use_result((x)->db)
340 #define sql_free_result(x) mysql_free_result((x)->result)
341 #define sql_fetch_row(x) mysql_fetch_row((x)->result)
342 #define sql_query(x, y) mysql_query((x)->db, (y))
343 #define sql_close(x) mysql_close((x)->db)
344 #define sql_strerror(x) mysql_error((x)->db)
345 #define sql_num_rows(x) mysql_num_rows((x)->result)
346 #define sql_data_seek(x, i) mysql_data_seek((x)->result, (i))
347 #define sql_affected_rows(x) mysql_affected_rows((x)->db)
348 #define sql_insert_id(x,y) mysql_insert_id((x)->db)
349 #define sql_field_seek(x, y) mysql_field_seek((x)->result, (y))
350 #define sql_fetch_field(x) mysql_fetch_field((x)->result)
351 #define sql_num_fields(x) (int)mysql_num_fields((x)->result)
352 #define SQL_ROW MYSQL_ROW
353 #define SQL_FIELD MYSQL_FIELD
357 #ifdef HAVE_POSTGRESQL
359 #define BDB_VERSION 10
361 #include <libpq-fe.h>
363 /* TEMP: the following is taken from select OID, typname from pg_type; */
364 #define IS_NUM(x) ((x) == 20 || (x) == 21 || (x) == 23 || (x) == 700 || (x) == 701)
365 #define IS_NOT_NULL(x) ((x) == 1)
367 typedef char **POSTGRESQL_ROW;
368 typedef struct pg_field {
372 unsigned int flags; // 1 == not null
377 * This is the "real" definition that should only be
378 * used inside sql.c and associated database interface
381 * P O S T G R E S Q L
384 BQUEUE bq; /* queue control */
385 brwlock_t lock; /* transaction lock */
390 POSTGRESQL_FIELD *fields;
393 int row_number; /* what row number did we get via my_postgresql_data_seek? */
394 int field_number; /* what field number did we get via my_postgresql_field_seek? */
399 char *db_address; /* host address */
400 char *db_socket; /* socket for local access */
401 int db_port; /* port of host address */
402 int have_insert_id; /* do have insert_id() */
404 POOLMEM *errmsg; /* nicely edited error message */
405 POOLMEM *cmd; /* SQL command string */
406 POOLMEM *cached_path;
407 int cached_path_len; /* length of cached path */
408 uint32_t cached_path_id;
409 bool allow_transactions; /* transactions allowed */
410 bool transaction; /* transaction started */
411 int changes; /* changes made to db */
412 POOLMEM *fname; /* Filename only */
413 POOLMEM *path; /* Path only */
414 POOLMEM *esc_name; /* Escaped file/path name */
415 int fnl; /* file name length */
416 int pnl; /* path name length */
419 void my_postgresql_free_result(B_DB *mdb);
420 POSTGRESQL_ROW my_postgresql_fetch_row (B_DB *mdb);
421 int my_postgresql_query (B_DB *mdb, const char *query);
422 void my_postgresql_data_seek (B_DB *mdb, int row);
423 int my_postgresql_currval (B_DB *mdb, char *table_name);
424 void my_postgresql_field_seek (B_DB *mdb, int row);
425 POSTGRESQL_FIELD * my_postgresql_fetch_field(B_DB *mdb);
428 /* "Generic" names for easier conversion */
429 #define sql_store_result(x) ((x)->result)
430 #define sql_free_result(x) my_postgresql_free_result(x)
431 #define sql_fetch_row(x) my_postgresql_fetch_row(x)
432 #define sql_query(x, y) my_postgresql_query((x), (y))
433 #define sql_close(x) PQfinish((x)->db)
434 #define sql_strerror(x) PQresultErrorMessage((x)->result)
435 #define sql_num_rows(x) ((unsigned) PQntuples((x)->result))
436 #define sql_data_seek(x, i) my_postgresql_data_seek((x), (i))
437 #define sql_affected_rows(x) ((unsigned) atoi(PQcmdTuples((x)->result)))
438 #define sql_insert_id(x,y) my_postgresql_currval((x), (y))
439 #define sql_field_seek(x, y) my_postgresql_field_seek((x), (y))
440 #define sql_fetch_field(x) my_postgresql_fetch_field(x)
441 #define sql_num_fields(x) ((x)->num_fields)
442 #define SQL_ROW POSTGRESQL_ROW
443 #define SQL_FIELD POSTGRESQL_FIELD
445 #else /* USE BACULA DB routines */
447 #define HAVE_BACULA_DB 1
449 /* Change this each time there is some incompatible
450 * file format change!!!!
452 #define BDB_VERSION 13 /* file version number */
455 int bdb_version; /* Version number */
456 uint32_t JobId; /* next Job Id */
457 uint32_t PoolId; /* next Pool Id */
458 uint32_t MediaId; /* next Media Id */
459 uint32_t JobMediaId; /* next JobMedia Id */
460 uint32_t ClientId; /* next Client Id */
461 uint32_t FileSetId; /* nest FileSet Id */
462 time_t time; /* time file written */
466 /* This is the REAL definition for using the
470 BQUEUE bq; /* queue control */
471 /* pthread_mutex_t mutex; */ /* single thread lock */
472 brwlock_t lock; /* transaction lock */
473 int ref_count; /* number of times opened */
474 struct s_control control; /* control file structure */
475 int cfd; /* control file device */
476 FILE *jobfd; /* Jobs records file descriptor */
477 FILE *poolfd; /* Pool records fd */
478 FILE *mediafd; /* Media records fd */
479 FILE *jobmediafd; /* JobMedia records fd */
480 FILE *clientfd; /* Client records fd */
481 FILE *filesetfd; /* FileSet records fd */
482 char *db_name; /* name of database */
483 POOLMEM *errmsg; /* nicely edited error message */
484 POOLMEM *cmd; /* Command string */
485 POOLMEM *cached_path;
486 int cached_path_len; /* length of cached path */
487 uint32_t cached_path_id;
490 #endif /* HAVE_SQLITE3 */
491 #endif /* HAVE_MYSQL */
492 #endif /* HAVE_SQLITE */
493 #endif /* HAVE_POSTGRESQL */
496 /* Use for better error location printing */
497 #define UPDATE_DB(jcr, db, cmd) UpdateDB(__FILE__, __LINE__, jcr, db, cmd)
498 #define INSERT_DB(jcr, db, cmd) InsertDB(__FILE__, __LINE__, jcr, db, cmd)
499 #define QUERY_DB(jcr, db, cmd) QueryDB(__FILE__, __LINE__, jcr, db, cmd)
500 #define DELETE_DB(jcr, db, cmd) DeleteDB(__FILE__, __LINE__, jcr, db, cmd)
503 #else /* not __SQL_C */
505 /* This is a "dummy" definition for use outside of sql.c
508 int dummy; /* for SunOS compiler */
513 extern uint32_t bacula_db_version;
515 /* ***FIXME*** FileId_t should *really* be uint64_t
516 * but at the current time, this breaks MySQL.
518 typedef uint32_t FileId_t;
519 typedef uint32_t DBId_t; /* general DB id type */
520 typedef uint32_t JobId_t;
525 /* Job information passed to create job record and update
526 * job record at end of job. Note, although this record
527 * contains all the fields found in the Job database record,
528 * it also contains fields found in the JobMedia record.
533 char Job[MAX_NAME_LENGTH]; /* Job unique name */
534 char Name[MAX_NAME_LENGTH]; /* Job base name */
535 int JobType; /* actually char(1) */
536 int JobLevel; /* actually char(1) */
537 int JobStatus; /* actually char(1) */
538 DBId_t ClientId; /* Id of client */
539 DBId_t PoolId; /* Id of pool */
540 DBId_t FileSetId; /* Id of FileSet */
541 DBId_t PriorJobId; /* Id of migrated (prior) job */
542 time_t SchedTime; /* Time job scheduled */
543 time_t StartTime; /* Job start time */
544 time_t EndTime; /* Job termination time of orig job */
545 time_t RealEndTime; /* Job termination time of this job */
546 utime_t JobTDate; /* Backup time/date in seconds */
547 uint32_t VolSessionId;
548 uint32_t VolSessionTime;
551 uint32_t JobMissingFiles;
556 /* Note, FirstIndex, LastIndex, Start/End File and Block
557 * are only used in the JobMedia record.
559 uint32_t FirstIndex; /* First index this Volume */
560 uint32_t LastIndex; /* Last index this Volume */
566 char cSchedTime[MAX_TIME_LENGTH];
567 char cStartTime[MAX_TIME_LENGTH];
568 char cEndTime[MAX_TIME_LENGTH];
569 char cRealEndTime[MAX_TIME_LENGTH];
570 /* Extra stuff not in DB */
571 int limit; /* limit records to display */
575 /* Job Media information used to create the media records
576 * for each Volume used for the job.
578 /* JobMedia record */
579 struct JOBMEDIA_DBR {
580 DBId_t JobMediaId; /* record id */
581 JobId_t JobId; /* JobId */
582 DBId_t MediaId; /* MediaId */
583 uint32_t FirstIndex; /* First index this Volume */
584 uint32_t LastIndex; /* Last index this Volume */
585 uint32_t StartFile; /* File for start of data */
586 uint32_t EndFile; /* End file on Volume */
587 uint32_t StartBlock; /* start block on tape */
588 uint32_t EndBlock; /* last block */
589 uint32_t Copy; /* identical copy */
593 /* Volume Parameter structure */
595 char VolumeName[MAX_NAME_LENGTH]; /* Volume name */
596 char MediaType[MAX_NAME_LENGTH]; /* Media Type */
597 char Storage[MAX_NAME_LENGTH]; /* Storage name */
598 uint32_t VolIndex; /* Volume seqence no. */
599 uint32_t FirstIndex; /* First index this Volume */
600 uint32_t LastIndex; /* Last index this Volume */
601 uint32_t StartFile; /* File for start of data */
602 uint32_t EndFile; /* End file on Volume */
603 uint32_t StartBlock; /* start block on tape */
604 uint32_t EndBlock; /* last block */
605 int32_t Slot; /* Slot */
606 // uint32_t Copy; /* identical copy */
607 // uint32_t Stripe; /* RAIT strip number */
611 /* Attributes record -- NOT same as in database because
612 * in general, this "record" creates multiple database
613 * records (e.g. pathname, filename, fileattributes).
616 char *fname; /* full path & filename */
617 char *link; /* link if any */
618 char *attr; /* attributes statp */
631 /* File record -- same format as database */
640 char Digest[BASE64_SIZE(CRYPTO_DIGEST_MAX_SIZE)];
641 int DigestType; /* NO_SIG/MD5_SIG/SHA1_SIG */
644 /* Pool record -- same format as database */
647 char Name[MAX_NAME_LENGTH]; /* Pool name */
648 uint32_t NumVols; /* total number of volumes */
649 uint32_t MaxVols; /* max allowed volumes */
650 int32_t LabelType; /* Bacula/ANSI/IBM */
651 int32_t UseOnce; /* set to use once only */
652 int32_t UseCatalog; /* set to use catalog */
653 int32_t AcceptAnyVolume; /* set to accept any volume sequence */
654 int32_t AutoPrune; /* set to prune automatically */
655 int32_t Recycle; /* default Vol recycle flag */
656 utime_t VolRetention; /* retention period in seconds */
657 utime_t VolUseDuration; /* time in secs volume can be used */
658 uint32_t MaxVolJobs; /* Max Jobs on Volume */
659 uint32_t MaxVolFiles; /* Max files on Volume */
660 uint64_t MaxVolBytes; /* Max bytes on Volume */
661 char PoolType[MAX_NAME_LENGTH];
662 char LabelFormat[MAX_NAME_LENGTH];
663 /* Extra stuff not in DB */
670 char Name[MAX_NAME_LENGTH]; /* Device name */
671 DBId_t MediaTypeId; /* MediaType */
672 DBId_t StorageId; /* Storage id if autochanger */
673 uint32_t DevMounts; /* Number of times mounted */
674 uint32_t DevErrors; /* Number of read/write errors */
675 uint64_t DevReadBytes; /* Number of bytes read */
676 uint64_t DevWriteBytes; /* Number of bytew written */
677 uint64_t DevReadTime; /* time spent reading volume */
678 uint64_t DevWriteTime; /* time spent writing volume */
679 uint64_t DevReadTimeSincCleaning; /* read time since cleaning */
680 uint64_t DevWriteTimeSincCleaning; /* write time since cleaning */
681 time_t CleaningDate; /* time last cleaned */
682 utime_t CleaningPeriod; /* time between cleanings */
688 char Name[MAX_NAME_LENGTH]; /* Device name */
689 int AutoChanger; /* Set if autochanger */
691 /* Not in database */
692 bool created; /* set if created by db_create ... */
695 class MEDIATYPE_DBR {
698 char MediaType[MAX_NAME_LENGTH]; /* MediaType string */
699 int ReadOnly; /* Set if read-only */
703 /* Media record -- same as the database */
705 DBId_t MediaId; /* Unique volume id */
706 char VolumeName[MAX_NAME_LENGTH]; /* Volume name */
707 char MediaType[MAX_NAME_LENGTH]; /* Media type */
708 DBId_t PoolId; /* Pool id */
709 time_t FirstWritten; /* Time Volume first written this usage */
710 time_t LastWritten; /* Time Volume last written */
711 time_t LabelDate; /* Date/Time Volume labeled */
712 time_t InitialWrite; /* Date/Time Volume first written */
713 int32_t LabelType; /* Label (Bacula/ANSI/IBM) */
714 uint32_t VolJobs; /* number of jobs on this medium */
715 uint32_t VolFiles; /* Number of files */
716 uint32_t VolBlocks; /* Number of blocks */
717 uint32_t VolMounts; /* Number of times mounted */
718 uint32_t VolErrors; /* Number of read/write errors */
719 uint32_t VolWrites; /* Number of writes */
720 uint32_t VolReads; /* Number of reads */
721 uint64_t VolBytes; /* Number of bytes written */
722 uint32_t VolParts; /* Number of parts written */
723 uint64_t MaxVolBytes; /* Max bytes to write to Volume */
724 uint64_t VolCapacityBytes; /* capacity estimate */
725 uint64_t VolReadTime; /* time spent reading volume */
726 uint64_t VolWriteTime; /* time spent writing volume */
727 utime_t VolRetention; /* Volume retention in seconds */
728 utime_t VolUseDuration; /* time in secs volume can be used */
729 uint32_t MaxVolJobs; /* Max Jobs on Volume */
730 uint32_t MaxVolFiles; /* Max files on Volume */
731 int32_t Recycle; /* recycle yes/no */
732 int32_t Slot; /* slot in changer */
733 int32_t Enabled; /* 0=disabled, 1=enabled, 2=archived */
734 int32_t InChanger; /* Volume currently in changer */
735 DBId_t StorageId; /* Storage record Id */
736 uint32_t EndFile; /* Last file on volume */
737 uint32_t EndBlock; /* Last block on volume */
738 uint32_t RecycleCount; /* Number of times recycled */
739 char VolStatus[20]; /* Volume status */
740 DBId_t DeviceId; /* Device where Vol last written */
741 DBId_t LocationId; /* Where Volume is -- user defined */
742 DBId_t ScratchPoolId; /* Where to move if scratch */
743 DBId_t RecyclePoolId; /* Where to move when recycled */
744 /* Extra stuff not in DB */
745 faddr_t rec_addr; /* found record address */
746 /* Since the database returns times as strings, this is how we pass
749 char cFirstWritten[MAX_TIME_LENGTH]; /* FirstWritten returned from DB */
750 char cLastWritten[MAX_TIME_LENGTH]; /* LastWritten returned from DB */
751 char cLabelDate[MAX_TIME_LENGTH]; /* LabelData returned from DB */
752 char cInitialWrite[MAX_TIME_LENGTH]; /* InitialWrite returned from DB */
753 bool set_first_written;
757 /* Client record -- same as the database */
759 DBId_t ClientId; /* Unique Client id */
761 utime_t FileRetention;
762 utime_t JobRetention;
763 char Name[MAX_NAME_LENGTH]; /* Client name */
764 char Uname[256]; /* Uname for client */
767 /* Counter record as in database */
769 char Counter[MAX_NAME_LENGTH];
772 int32_t CurrentValue;
773 char WrapCounter[MAX_NAME_LENGTH];
777 /* FileSet record -- same as the database */
779 DBId_t FileSetId; /* Unique FileSet id */
780 char FileSet[MAX_NAME_LENGTH]; /* FileSet name */
781 char MD5[50]; /* MD5 signature of include/exclude */
782 time_t CreateTime; /* date created */
784 * This is where we return CreateTime
786 char cCreateTime[MAX_TIME_LENGTH]; /* CreateTime as returned from DB */
787 /* Not in DB but returned by db_create_fileset() */
788 bool created; /* set when record newly created */
791 /* Call back context for getting a 32/64 bit value from the database */
792 struct db_int64_ctx {
793 int64_t value; /* value returned */
794 int count; /* number of values seen */
800 #include "sql_cmds.h"
803 * Some functions exported by sql.c for use within the
806 void list_result(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type);
807 void list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx);
808 int get_sql_record_max(JCR *jcr, B_DB *mdb);
809 bool check_tables_version(JCR *jcr, B_DB *mdb);
810 void _db_unlock(const char *file, int line, B_DB *mdb);
811 void _db_lock(const char *file, int line, B_DB *mdb);
812 const char *db_get_type(void);
814 void print_dashes(B_DB *mdb);
815 void print_result(B_DB *mdb);
816 int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
817 int InsertDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
818 int DeleteDB(const char *file, int line, JCR *jcr, B_DB *db, char *delete_cmd);
819 int UpdateDB(const char *file, int line, JCR *jcr, B_DB *db, char *update_cmd);
820 void split_path_and_file(JCR *jcr, B_DB *mdb, const char *fname);
821 #endif /* __SQL_H_ */