2 Bacula® - The Network Backup Solution
4 Copyright (C) 2000-2009 Free Software Foundation Europe e.V.
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
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.
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
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.
29 * Bacula Catalog Database interface routines
31 * Almost generic set of SQL database interface routines
32 * (with a little more work)
33 * SQL engine specific routines are in mysql.c, postgresql.c,
36 * Kern Sibbald, March 2000
41 /* The following is necessary so that we do not include
42 * the dummy external definition of B_DB.
44 #define __SQL_C /* indicate that this is sql.c */
49 #if HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL || HAVE_DBI
51 uint32_t bacula_db_version = 0;
53 int db_type = -1; /* SQL engine type index */
55 /* Forward referenced subroutines */
56 void print_dashes(B_DB *mdb);
57 void print_result(B_DB *mdb);
59 B_DB *db_init(JCR *jcr, const char *db_driver, const char *db_name, const char *db_user,
60 const char *db_password, const char *db_address, int db_port,
61 const char *db_socket, int mult_db_connections)
66 Jmsg0(jcr, M_ABORT, 0, _("Driver type not specified in Catalog resource.\n"));
68 if (strlen(db_driver) < 5 || db_driver[3] != ':' || strncasecmp(db_driver, "dbi", 3) != 0) {
69 Jmsg0(jcr, M_ABORT, 0, _("Invalid driver type, must be \"dbi:<type>\"\n"));
71 p = (char *)(db_driver + 4);
72 if (strcasecmp(p, "mysql") == 0) {
73 db_type = SQL_TYPE_MYSQL;
74 } else if (strcasecmp(p, "postgresql") == 0) {
75 db_type = SQL_TYPE_POSTGRESQL;
76 } else if (strcasecmp(p, "sqlite") == 0) {
77 db_type = SQL_TYPE_SQLITE;
78 } else if (strcasecmp(p, "sqlite3") == 0) {
79 db_type = SQL_TYPE_SQLITE3;
81 Jmsg1(jcr, M_ABORT, 0, _("Unknown database type: %s\n"), p);
84 db_type = SQL_TYPE_MYSQL;
86 db_type = SQL_TYPE_POSTGRESQL;
88 db_type = SQL_TYPE_SQLITE;
90 db_type = SQL_TYPE_SQLITE3;
93 return db_init_database(jcr, db_name, db_user, db_password, db_address,
94 db_port, db_socket, mult_db_connections);
97 dbid_list::dbid_list()
99 memset(this, 0, sizeof(dbid_list));
101 DBId = (DBId_t *)malloc(max_ids * sizeof(DBId_t));
102 num_ids = num_seen = tot_ids = 0;
106 dbid_list::~dbid_list()
113 * Called here to retrieve an integer from the database
115 int db_int_handler(void *ctx, int num_fields, char **row)
117 uint32_t *val = (uint32_t *)ctx;
119 Dmsg1(800, "int_handler starts with row pointing at %x\n", row);
122 Dmsg1(800, "int_handler finds '%s'\n", row[0]);
123 *val = str_to_int64(row[0]);
125 Dmsg0(800, "int_handler finds zero\n");
128 Dmsg0(800, "int_handler finishes\n");
133 * Called here to retrieve a 32/64 bit integer from the database.
134 * The returned integer will be extended to 64 bit.
136 int db_int64_handler(void *ctx, int num_fields, char **row)
138 db_int64_ctx *lctx = (db_int64_ctx *)ctx;
141 lctx->value = str_to_int64(row[0]);
148 * Use to build a comma separated list of values from a query. "10,20,30"
150 int db_list_handler(void *ctx, int num_fields, char **row)
152 db_list_ctx *lctx = (db_list_ctx *)ctx;
153 if (num_fields == 1 && row[0]) {
155 pm_strcat(lctx->list, ",");
157 pm_strcat(lctx->list, row[0]);
163 /* NOTE!!! The following routines expect that the
164 * calling subroutine sets and clears the mutex
167 /* Check that the tables correspond to the version we want */
168 bool check_tables_version(JCR *jcr, B_DB *mdb)
170 const char *query = "SELECT VersionId FROM Version";
172 bacula_db_version = 0;
173 if (!db_sql_query(mdb, query, db_int_handler, (void *)&bacula_db_version)) {
174 Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
177 if (bacula_db_version != BDB_VERSION) {
178 Mmsg(mdb->errmsg, "Version error for database \"%s\". Wanted %d, got %d\n",
179 mdb->db_name, BDB_VERSION, bacula_db_version);
180 Jmsg(jcr, M_FATAL, 0, "%s", mdb->errmsg);
186 /* Utility routine for queries. The database MUST be locked before calling here. */
188 QueryDB(const char *file, int line, JCR *jcr, B_DB *mdb, char *cmd)
192 sql_free_result(mdb);
193 if ((status=sql_query(mdb, cmd)) != 0) {
194 m_msg(file, line, &mdb->errmsg, _("query %s failed:\n%s\n"), cmd, sql_strerror(mdb));
195 j_msg(file, line, jcr, M_FATAL, 0, "%s", mdb->errmsg);
197 j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd);
202 mdb->result = sql_store_result(mdb);
204 return mdb->result != NULL;
208 * Utility routine to do inserts
209 * Returns: 0 on failure
213 InsertDB(const char *file, int line, JCR *jcr, B_DB *mdb, char *cmd)
215 if (sql_query(mdb, cmd)) {
216 m_msg(file, line, &mdb->errmsg, _("insert %s failed:\n%s\n"), cmd, sql_strerror(mdb));
217 j_msg(file, line, jcr, M_FATAL, 0, "%s", mdb->errmsg);
219 j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd);
223 if (mdb->have_insert_id) {
224 mdb->num_rows = sql_affected_rows(mdb);
228 if (mdb->num_rows != 1) {
230 m_msg(file, line, &mdb->errmsg, _("Insertion problem: affected_rows=%s\n"),
231 edit_uint64(mdb->num_rows, ed1));
233 j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd);
241 /* Utility routine for updates.
242 * Returns: 0 on failure
246 UpdateDB(const char *file, int line, JCR *jcr, B_DB *mdb, char *cmd)
249 if (sql_query(mdb, cmd)) {
250 m_msg(file, line, &mdb->errmsg, _("update %s failed:\n%s\n"), cmd, sql_strerror(mdb));
251 j_msg(file, line, jcr, M_ERROR, 0, "%s", mdb->errmsg);
253 j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd);
257 mdb->num_rows = sql_affected_rows(mdb);
258 if (mdb->num_rows < 1) {
260 m_msg(file, line, &mdb->errmsg, _("Update failed: affected_rows=%s for %s\n"),
261 edit_uint64(mdb->num_rows, ed1), cmd);
263 // j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd);
271 /* Utility routine for deletes
273 * Returns: -1 on error
274 * n number of rows affected
277 DeleteDB(const char *file, int line, JCR *jcr, B_DB *mdb, char *cmd)
280 if (sql_query(mdb, cmd)) {
281 m_msg(file, line, &mdb->errmsg, _("delete %s failed:\n%s\n"), cmd, sql_strerror(mdb));
282 j_msg(file, line, jcr, M_ERROR, 0, "%s", mdb->errmsg);
284 j_msg(file, line, jcr, M_INFO, 0, "%s\n", cmd);
289 return sql_affected_rows(mdb);
294 * Get record max. Query is already in mdb->cmd
297 * Returns: -1 on failure
300 int get_sql_record_max(JCR *jcr, B_DB *mdb)
305 if (QUERY_DB(jcr, mdb, mdb->cmd)) {
306 if ((row = sql_fetch_row(mdb)) == NULL) {
307 Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb));
310 stat = str_to_int64(row[0]);
312 sql_free_result(mdb);
314 Mmsg1(&mdb->errmsg, _("error fetching row: %s\n"), sql_strerror(mdb));
321 * Return pre-edited error message
323 char *db_strerror(B_DB *mdb)
329 * Lock database, this can be called multiple times by the same
330 * thread without blocking, but must be unlocked the number of
331 * times it was locked.
333 void _db_lock(const char *file, int line, B_DB *mdb)
336 if ((errstat=rwl_writelock(&mdb->lock)) != 0) {
338 e_msg(file, line, M_FATAL, 0, "rwl_writelock failure. stat=%d: ERR=%s\n",
339 errstat, be.bstrerror(errstat));
344 * Unlock the database. This can be called multiple times by the
345 * same thread up to the number of times that thread called
348 void _db_unlock(const char *file, int line, B_DB *mdb)
351 if ((errstat=rwl_writeunlock(&mdb->lock)) != 0) {
353 e_msg(file, line, M_FATAL, 0, "rwl_writeunlock failure. stat=%d: ERR=%s\n",
354 errstat, be.bstrerror(errstat));
359 * Start a transaction. This groups inserts and makes things
360 * much more efficient. Usually started when inserting
363 void db_start_transaction(JCR *jcr, B_DB *mdb)
366 jcr->attr = get_pool_memory(PM_FNAME);
369 jcr->ar = (ATTR_DBR *)malloc(sizeof(ATTR_DBR));
373 if (!mdb->allow_transactions) {
377 /* Allow only 10,000 changes per transaction */
378 if (mdb->transaction && mdb->changes > 10000) {
379 db_end_transaction(jcr, mdb);
381 if (!mdb->transaction) {
382 my_sqlite_query(mdb, "BEGIN"); /* begin transaction */
383 Dmsg0(400, "Start SQLite transaction\n");
384 mdb->transaction = 1;
390 * This is turned off because transactions break
391 * if multiple simultaneous jobs are run.
393 #ifdef HAVE_POSTGRESQL
394 if (!mdb->allow_transactions) {
398 /* Allow only 25,000 changes per transaction */
399 if (mdb->transaction && mdb->changes > 25000) {
400 db_end_transaction(jcr, mdb);
402 if (!mdb->transaction) {
403 db_sql_query(mdb, "BEGIN", NULL, NULL); /* begin transaction */
404 Dmsg0(400, "Start PosgreSQL transaction\n");
405 mdb->transaction = 1;
411 if (db_type == SQL_TYPE_SQLITE) {
412 if (!mdb->allow_transactions) {
416 /* Allow only 10,000 changes per transaction */
417 if (mdb->transaction && mdb->changes > 10000) {
418 db_end_transaction(jcr, mdb);
420 if (!mdb->transaction) {
421 //my_sqlite_query(mdb, "BEGIN"); /* begin transaction */
422 db_sql_query(mdb, "BEGIN", NULL, NULL); /* begin transaction */
423 Dmsg0(400, "Start SQLite transaction\n");
424 mdb->transaction = 1;
427 } else if (db_type == SQL_TYPE_POSTGRESQL) {
428 if (!mdb->allow_transactions) {
432 /* Allow only 25,000 changes per transaction */
433 if (mdb->transaction && mdb->changes > 25000) {
434 db_end_transaction(jcr, mdb);
436 if (!mdb->transaction) {
437 db_sql_query(mdb, "BEGIN", NULL, NULL); /* begin transaction */
438 Dmsg0(400, "Start PosgreSQL transaction\n");
439 mdb->transaction = 1;
446 void db_end_transaction(JCR *jcr, B_DB *mdb)
449 * This can be called during thread cleanup and
450 * the db may already be closed. So simply return.
456 if (jcr && jcr->cached_attribute) {
457 Dmsg0(400, "Flush last cached attribute.\n");
458 if (!db_create_file_attributes_record(jcr, mdb, jcr->ar)) {
459 Jmsg1(jcr, M_FATAL, 0, _("Attribute create error. %s"), db_strerror(jcr->db));
461 jcr->cached_attribute = false;
465 if (!mdb->allow_transactions) {
469 if (mdb->transaction) {
470 my_sqlite_query(mdb, "COMMIT"); /* end transaction */
471 mdb->transaction = 0;
472 Dmsg1(400, "End SQLite transaction changes=%d\n", mdb->changes);
478 #ifdef HAVE_POSTGRESQL
479 if (!mdb->allow_transactions) {
483 if (mdb->transaction) {
484 db_sql_query(mdb, "COMMIT", NULL, NULL); /* end transaction */
485 mdb->transaction = 0;
486 Dmsg1(400, "End PostgreSQL transaction changes=%d\n", mdb->changes);
493 if (db_type == SQL_TYPE_SQLITE) {
494 if (!mdb->allow_transactions) {
498 if (mdb->transaction) {
499 //my_sqlite_query(mdb, "COMMIT"); /* end transaction */
500 db_sql_query(mdb, "COMMIT", NULL, NULL); /* end transaction */
501 mdb->transaction = 0;
502 Dmsg1(400, "End SQLite transaction changes=%d\n", mdb->changes);
506 } else if (db_type == SQL_TYPE_POSTGRESQL) {
507 if (!mdb->allow_transactions) {
511 if (mdb->transaction) {
512 db_sql_query(mdb, "COMMIT", NULL, NULL); /* end transaction */
513 mdb->transaction = 0;
514 Dmsg1(400, "End PostgreSQL transaction changes=%d\n", mdb->changes);
523 * Given a full filename, split it into its path
524 * and filename parts. They are returned in pool memory
525 * in the mdb structure.
527 void split_path_and_file(JCR *jcr, B_DB *mdb, const char *fname)
531 /* Find path without the filename.
532 * I.e. everything after the last / is a "filename".
533 * OK, maybe it is a directory name, but we treat it like
534 * a filename. If we don't find a / then the whole name
535 * must be a path name (e.g. c:).
537 for (p=f=fname; *p; p++) {
538 if (IsPathSeparator(*p)) {
539 f = p; /* set pos of last slash */
542 if (IsPathSeparator(*f)) { /* did we find a slash? */
543 f++; /* yes, point to filename */
544 } else { /* no, whole thing must be path name */
548 /* If filename doesn't exist (i.e. root directory), we
549 * simply create a blank name consisting of a single
550 * space. This makes handling zero length filenames
555 mdb->fname = check_pool_memory_size(mdb->fname, mdb->fnl+1);
556 memcpy(mdb->fname, f, mdb->fnl); /* copy filename */
557 mdb->fname[mdb->fnl] = 0;
563 mdb->pnl = f - fname;
565 mdb->path = check_pool_memory_size(mdb->path, mdb->pnl+1);
566 memcpy(mdb->path, fname, mdb->pnl);
567 mdb->path[mdb->pnl] = 0;
569 Mmsg1(&mdb->errmsg, _("Path length is zero. File=%s\n"), fname);
570 Jmsg(jcr, M_ERROR, 0, "%s", mdb->errmsg);
575 Dmsg2(500, "split path=%s file=%s\n", mdb->path, mdb->fname);
579 * Set maximum field length to something reasonable
581 static int max_length(int max_length)
583 int max_len = max_length;
587 } else if (max_len > 100) {
594 * List dashes as part of header for listing SQL results in a table
597 list_dashes(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx)
603 sql_field_seek(mdb, 0);
605 for (i = 0; i < sql_num_fields(mdb); i++) {
606 field = sql_fetch_field(mdb);
610 len = max_length(field->max_length + 2);
611 for (j = 0; j < len; j++) {
620 * If full_list is set, we list vertically, otherwise, we
621 * list on one line horizontally.
624 list_result(JCR *jcr, B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type)
628 int i, col_len, max_len = 0;
629 char buf[2000], ewc[30];
631 Dmsg0(800, "list_result starts\n");
632 if (mdb->result == NULL || sql_num_rows(mdb) == 0) {
633 send(ctx, _("No results to list.\n"));
637 Dmsg1(800, "list_result starts looking at %d fields\n", sql_num_fields(mdb));
638 /* determine column display widths */
639 sql_field_seek(mdb, 0);
640 for (i = 0; i < sql_num_fields(mdb); i++) {
641 Dmsg1(800, "list_result processing field %d\n", i);
642 field = sql_fetch_field(mdb);
646 col_len = cstrlen(field->name);
647 if (type == VERT_LIST) {
648 if (col_len > max_len) {
652 if (IS_NUM(field->type) && (int)field->max_length > 0) { /* fixup for commas */
653 field->max_length += (field->max_length - 1) / 3;
655 if (col_len < (int)field->max_length) {
656 col_len = field->max_length;
658 if (col_len < 4 && !IS_NOT_NULL(field->flags)) {
659 col_len = 4; /* 4 = length of the word "NULL" */
661 field->max_length = col_len; /* reset column info */
665 Dmsg0(800, "list_result finished first loop\n");
666 if (type == VERT_LIST) {
670 Dmsg1(800, "list_result starts second loop looking at %d fields\n", sql_num_fields(mdb));
671 list_dashes(mdb, send, ctx);
673 sql_field_seek(mdb, 0);
674 for (i = 0; i < sql_num_fields(mdb); i++) {
675 Dmsg1(800, "list_result looking at field %d\n", i);
676 field = sql_fetch_field(mdb);
680 max_len = max_length(field->max_length);
681 bsnprintf(buf, sizeof(buf), " %-*s |", max_len, field->name);
685 list_dashes(mdb, send, ctx);
687 Dmsg1(800, "list_result starts third loop looking at %d fields\n", sql_num_fields(mdb));
688 while ((row = sql_fetch_row(mdb)) != NULL) {
689 sql_field_seek(mdb, 0);
691 for (i = 0; i < sql_num_fields(mdb); i++) {
692 field = sql_fetch_field(mdb);
696 max_len = max_length(field->max_length);
697 if (row[i] == NULL) {
698 bsnprintf(buf, sizeof(buf), " %-*s |", max_len, "NULL");
699 } else if (IS_NUM(field->type) && !jcr->gui && is_an_integer(row[i])) {
700 bsnprintf(buf, sizeof(buf), " %*s |", max_len,
701 add_commas(row[i], ewc));
703 bsnprintf(buf, sizeof(buf), " %-*s |", max_len, row[i]);
709 list_dashes(mdb, send, ctx);
714 Dmsg1(800, "list_result starts vertical list at %d fields\n", sql_num_fields(mdb));
715 while ((row = sql_fetch_row(mdb)) != NULL) {
716 sql_field_seek(mdb, 0);
717 for (i = 0; i < sql_num_fields(mdb); i++) {
718 field = sql_fetch_field(mdb);
722 if (row[i] == NULL) {
723 bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL");
724 } else if (IS_NUM(field->type) && !jcr->gui && is_an_integer(row[i])) {
725 bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name,
726 add_commas(row[i], ewc));
728 bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, row[i]);
738 * Open a new connexion to mdb catalog. This function is used
739 * by batch and accurate mode.
741 bool db_open_batch_connexion(JCR *jcr, B_DB *mdb)
745 #ifdef HAVE_BATCH_FILE_INSERT
746 multi_db=true; /* we force a new connexion only if batch insert is enabled */
749 if (!jcr->db_batch) {
750 jcr->db_batch = db_init_database(jcr,
757 multi_db /* multi_db = true when using batch mode */);
758 if (!jcr->db_batch) {
759 Jmsg0(jcr, M_FATAL, 0, "Could not init batch connexion");
763 if (!db_open_database(jcr, jcr->db_batch)) {
764 Mmsg2(&jcr->db_batch->errmsg, _("Could not open database \"%s\": ERR=%s\n"),
765 jcr->db_batch->db_name, db_strerror(jcr->db_batch));
766 Jmsg1(jcr, M_FATAL, 0, "%s", jcr->db_batch->errmsg);
769 Dmsg3(100, "initdb ref=%d connected=%d db=%p\n", jcr->db_batch->ref_count,
770 jcr->db_batch->connected, jcr->db_batch->db);
777 * !!! WARNING !!! Use this function only when bacula is stopped.
778 * ie, after a fatal signal and before exiting the program
779 * Print information about a B_DB object.
781 void _dbg_print_db(JCR *jcr, FILE *fp)
789 fprintf(fp, "B_DB=%p db_name=%s db_user=%s connected=%i\n",
790 mdb, NPRTB(mdb->db_name), NPRTB(mdb->db_user), mdb->connected);
791 fprintf(fp, "\tcmd=\"%s\" changes=%i\n", NPRTB(mdb->cmd), mdb->changes);
792 if (mdb->lock.valid == RWLOCK_VALID) {
793 fprintf(fp, "\tRWLOCK=%p w_active=%i w_wait=%i\n", &mdb->lock, mdb->lock.w_active, mdb->lock.w_wait);
797 #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_SQLITE || HAVE_POSTGRESQL*/