]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/cats/sqlite.c
Add retry for SQLite opening db if it fails.
[bacula/bacula] / bacula / src / cats / sqlite.c
1 /*
2    Bacula® - The Network Backup Solution
3
4    Copyright (C) 2000-2007 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 John Walker.
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  * Bacula Catalog Database routines specific to SQLite
30  *
31  *    Kern Sibbald, January 2002
32  *
33  *    Version $Id$
34  */
35
36
37
38 /* The following is necessary so that we do not include
39  * the dummy external definition of DB.
40  */
41 #define __SQL_C                       /* indicate that this is sql.c */
42
43 #include "bacula.h"
44 #include "cats.h"
45
46 #if    HAVE_SQLITE || HAVE_SQLITE3
47
48 /* -----------------------------------------------------------------------
49  *
50  *    SQLite dependent defines and subroutines
51  *
52  * -----------------------------------------------------------------------
53  */
54
55 /* List of open databases */
56 static BQUEUE db_list = {&db_list, &db_list};
57
58 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
59
60 int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd);
61
62
63 /*
64  * Retrieve database type
65  */
66 const char *
67 db_get_type(void)
68 {
69    return "SQLite";
70 }
71
72 /*
73  * When using mult_db_connections = 1, 
74  * sqlite can be BUSY. We just need sleep a little in this case.
75  */
76
77 #ifdef HAVE_SQLITE3
78 static int my_busy_handler(void *arg, int calls)
79 {
80    bmicrosleep(0, 500);
81    return 1;
82 }
83 #else
84 static int my_busy_handler(void *arg, const char* p, int calls)
85 {
86    bmicrosleep(0, 500);
87    return 1;
88 }
89 #endif
90
91
92 /*
93  * Initialize database data structure. In principal this should
94  * never have errors, or it is really fatal.
95  */
96 B_DB *
97 db_init_database(JCR *jcr, const char *db_name, const char *db_user, const char *db_password,
98                  const char *db_address, int db_port, const char *db_socket,
99                  int mult_db_connections)
100 {
101    B_DB *mdb;
102
103    P(mutex);                          /* lock DB queue */
104    /* Look to see if DB already open */
105    if (!mult_db_connections) {
106       for (mdb=NULL; (mdb=(B_DB *)qnext(&db_list, &mdb->bq)); ) {
107          if (bstrcmp(mdb->db_name, db_name) &&
108              bstrcmp(mdb->db_address, db_address) &&
109              mdb->db_port == db_port) {
110             Dmsg2(300, "DB REopen %d %s\n", mdb->ref_count, db_name);
111             mdb->ref_count++;
112             V(mutex);
113             return mdb;                  /* already open */
114          }
115       }
116    }
117    Dmsg0(300, "db_open first time\n");
118    mdb = (B_DB *) malloc(sizeof(B_DB));
119    memset(mdb, 0, sizeof(B_DB));
120    mdb->db_name = bstrdup(db_name);
121    mdb->have_insert_id = TRUE;
122    mdb->errmsg = get_pool_memory(PM_EMSG); /* get error message buffer */
123    *mdb->errmsg = 0;
124    mdb->cmd = get_pool_memory(PM_EMSG);    /* get command buffer */
125    mdb->cached_path = get_pool_memory(PM_FNAME);
126    mdb->cached_path_id = 0;
127    mdb->ref_count = 1;
128    mdb->fname = get_pool_memory(PM_FNAME);
129    mdb->path = get_pool_memory(PM_FNAME);
130    mdb->esc_name = get_pool_memory(PM_FNAME);
131    mdb->esc_path = get_pool_memory(PM_FNAME);
132    mdb->allow_transactions = mult_db_connections;
133    qinsert(&db_list, &mdb->bq);            /* put db in list */
134    V(mutex);
135    return mdb;
136 }
137
138 /*
139  * Now actually open the database.  This can generate errors,
140  * which are returned in the errmsg
141  *
142  * DO NOT close the database or free(mdb) here !!!!
143  */
144 int
145 db_open_database(JCR *jcr, B_DB *mdb)
146 {
147    char *db_name;
148    int len;
149    struct stat statbuf;
150    int errstat;
151    int retry = 0;
152
153    P(mutex);
154    if (mdb->connected) {
155       V(mutex);
156       return 1;
157    }
158    mdb->connected = FALSE;
159
160    if ((errstat=rwl_init(&mdb->lock)) != 0) {
161       Mmsg1(&mdb->errmsg, _("Unable to initialize DB lock. ERR=%s\n"),
162             strerror(errstat));
163       V(mutex);
164       return 0;
165    }
166
167    /* open the database */
168    len = strlen(working_directory) + strlen(mdb->db_name) + 5;
169    db_name = (char *)malloc(len);
170    strcpy(db_name, working_directory);
171    strcat(db_name, "/");
172    strcat(db_name, mdb->db_name);
173    strcat(db_name, ".db");
174    if (stat(db_name, &statbuf) != 0) {
175       Mmsg1(&mdb->errmsg, _("Database %s does not exist, please create it.\n"),
176          db_name);
177       free(db_name);
178       V(mutex);
179       return 0;
180    }
181
182    for (mdb->db=NULL; !mdb->db && retry++ < 10; ) {
183 #ifdef HAVE_SQLITE3
184       int stat = sqlite3_open(db_name, &mdb->db);
185       if (stat != SQLITE_OK) {
186          mdb->sqlite_errmsg = (char *)sqlite3_errmsg(mdb->db); 
187          sqlite3_close(mdb->db);
188          mdb->db = NULL;
189       } else {
190          mdb->sqlite_errmsg = NULL;
191       }
192 #else
193       mdb->db = sqlite_open(
194            db_name,                      /* database name */
195            644,                          /* mode */
196            &mdb->sqlite_errmsg);         /* error message */
197 #endif
198
199       Dmsg0(300, "sqlite_open\n");
200       if (!mdb->db) {
201          bmicrosleep(1, 0);
202       }
203    }
204    if (mdb->db == NULL) {
205       Mmsg2(&mdb->errmsg, _("Unable to open Database=%s. ERR=%s\n"),
206          db_name, mdb->sqlite_errmsg ? mdb->sqlite_errmsg : _("unknown"));
207       free(db_name);
208       V(mutex);
209       return 0;
210    }       
211    mdb->connected = true;
212    free(db_name);
213
214 #if  defined(HAVE_SQLITE3) && defined(SQLITE3_INIT_QUERY)
215    db_sql_query(mdb, SQLITE3_INIT_QUERY, NULL, NULL);
216 #endif
217
218    if (!check_tables_version(jcr, mdb)) {
219       V(mutex);
220       return 0;
221    }
222
223    /* set busy handler to wait when we use mult_db_connections = 1 */
224 #ifdef HAVE_SQLITE3
225    sqlite3_busy_handler(mdb->db, my_busy_handler, NULL);
226 #else
227    sqlite_busy_handler(mdb->db, my_busy_handler, NULL);
228 #endif
229
230    V(mutex);
231    return 1;
232 }
233
234 void
235 db_close_database(JCR *jcr, B_DB *mdb)
236 {
237    if (!mdb) {
238       return;
239    }
240    db_end_transaction(jcr, mdb);
241    P(mutex);
242    sql_free_result(mdb);
243    mdb->ref_count--;
244    if (mdb->ref_count == 0) {
245       qdchain(&mdb->bq);
246       if (mdb->connected && mdb->db) {
247          sqlite_close(mdb->db);
248       }
249       rwl_destroy(&mdb->lock);
250       free_pool_memory(mdb->errmsg);
251       free_pool_memory(mdb->cmd);
252       free_pool_memory(mdb->cached_path);
253       free_pool_memory(mdb->fname);
254       free_pool_memory(mdb->path);
255       free_pool_memory(mdb->esc_name);
256       free_pool_memory(mdb->esc_path);
257       if (mdb->db_name) {
258          free(mdb->db_name);
259       }
260       free(mdb);
261    }
262    V(mutex);
263 }
264
265 void db_thread_cleanup()
266 {
267 #ifdef HAVE_SQLITE3
268    sqlite3_thread_cleanup();
269 #endif
270 }
271
272 /*
273  * Return the next unique index (auto-increment) for
274  * the given table.  Return 0 on error.
275  */
276 int db_next_index(JCR *jcr, B_DB *mdb, char *table, char *index)
277 {
278    strcpy(index, "NULL");
279    return 1;
280 }
281
282
283 /*
284  * Escape strings so that SQLite is happy
285  *
286  *   NOTE! len is the length of the old string. Your new
287  *         string must be long enough (max 2*old+1) to hold
288  *         the escaped output.
289  */
290 void
291 db_escape_string(JCR *jcr, B_DB *db, char *snew, char *old, int len)
292 {
293    char *n, *o;
294
295    n = snew;
296    o = old;
297    while (len--) {
298       switch (*o) {
299       case '\'':
300          *n++ = '\'';
301          *n++ = '\'';
302          o++;
303          break;
304       case 0:
305          *n++ = '\\';
306          *n++ = 0;
307          o++;
308          break;
309       default:
310          *n++ = *o++;
311          break;
312       }
313    }
314    *n = 0;
315 }
316
317 struct rh_data {
318    DB_RESULT_HANDLER *result_handler;
319    void *ctx;
320 };
321
322 /*
323  * Convert SQLite's callback into Bacula DB callback
324  */
325 static int sqlite_result(void *arh_data, int num_fields, char **rows, char **col_names)
326 {
327    struct rh_data *rh_data = (struct rh_data *)arh_data;
328
329    if (rh_data->result_handler) {
330       (*(rh_data->result_handler))(rh_data->ctx, num_fields, rows);
331    }
332    return 0;
333 }
334
335 /*
336  * Submit a general SQL command (cmd), and for each row returned,
337  *  the sqlite_handler is called with the ctx.
338  */
339 int db_sql_query(B_DB *mdb, const char *query, DB_RESULT_HANDLER *result_handler, void *ctx)
340 {
341    struct rh_data rh_data;
342    int stat;
343
344    db_lock(mdb);
345    if (mdb->sqlite_errmsg) {
346 #ifdef HAVE_SQLITE3
347       sqlite3_free(mdb->sqlite_errmsg);
348 #else
349       actuallyfree(mdb->sqlite_errmsg);
350 #endif
351       mdb->sqlite_errmsg = NULL;
352    }
353    rh_data.result_handler = result_handler;
354    rh_data.ctx = ctx;
355    stat = sqlite_exec(mdb->db, query, sqlite_result, (void *)&rh_data, &mdb->sqlite_errmsg);
356    if (stat != 0) {
357       Mmsg(mdb->errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror(mdb));
358       db_unlock(mdb);
359       return 0;
360    }
361    db_unlock(mdb);
362    return 1;
363 }
364
365 /*
366  * Submit a sqlite query and retrieve all the data
367  */
368 int my_sqlite_query(B_DB *mdb, const char *cmd)
369 {
370    int stat;
371
372    my_sqlite_free_table(mdb);
373    if (mdb->sqlite_errmsg) {
374 #ifdef HAVE_SQLITE3
375       sqlite3_free(mdb->sqlite_errmsg);
376 #else
377       actuallyfree(mdb->sqlite_errmsg);
378 #endif
379       mdb->sqlite_errmsg = NULL;
380    }
381    stat = sqlite_get_table(mdb->db, (char *)cmd, &mdb->result, &mdb->nrow, &mdb->ncolumn,
382             &mdb->sqlite_errmsg);
383    mdb->row = 0;                      /* row fetched */
384    return stat;
385 }
386
387 /* Fetch one row at a time */
388 SQL_ROW my_sqlite_fetch_row(B_DB *mdb)
389 {
390    if (mdb->row >= mdb->nrow) {
391       return NULL;
392    }
393    mdb->row++;
394    return &mdb->result[mdb->ncolumn * mdb->row];
395 }
396
397 void my_sqlite_free_table(B_DB *mdb)
398 {
399    int i;
400
401    if (mdb->fields_defined) {
402       for (i=0; i < sql_num_fields(mdb); i++) {
403          free(mdb->fields[i]);
404       }
405       free(mdb->fields);
406       mdb->fields_defined = false;
407    }
408    if (mdb->result) {
409       sqlite_free_table(mdb->result);
410       mdb->result = NULL;
411    }
412    mdb->nrow = mdb->ncolumn = 0;
413 }
414
415 void my_sqlite_field_seek(B_DB *mdb, int field)
416 {
417    int i, j;
418    if (mdb->result == NULL) {
419       return;
420    }
421    /* On first call, set up the fields */
422    if (!mdb->fields_defined && sql_num_fields(mdb) > 0) {
423       mdb->fields = (SQL_FIELD **)malloc(sizeof(SQL_FIELD) * mdb->ncolumn);
424       for (i=0; i < sql_num_fields(mdb); i++) {
425          mdb->fields[i] = (SQL_FIELD *)malloc(sizeof(SQL_FIELD));
426          mdb->fields[i]->name = mdb->result[i];
427          mdb->fields[i]->length = cstrlen(mdb->fields[i]->name);
428          mdb->fields[i]->max_length = mdb->fields[i]->length;
429          for (j=1; j <= mdb->nrow; j++) {
430             int len;
431             if (mdb->result[i + mdb->ncolumn *j]) {
432                len = (uint32_t)cstrlen(mdb->result[i + mdb->ncolumn * j]);
433             } else {
434                len = 0;
435             }
436             if (len > mdb->fields[i]->max_length) {
437                mdb->fields[i]->max_length = len;
438             }
439          }
440          mdb->fields[i]->type = 0;
441          mdb->fields[i]->flags = 1;        /* not null */
442       }
443       mdb->fields_defined = TRUE;
444    }
445    if (field > sql_num_fields(mdb)) {
446       field = sql_num_fields(mdb);
447     }
448     mdb->field = field;
449
450 }
451
452 SQL_FIELD *my_sqlite_fetch_field(B_DB *mdb)
453 {
454    return mdb->fields[mdb->field++];
455 }
456
457 #ifdef HAVE_BATCH_FILE_INSERT
458 char *my_sqlite_batch_lock_query = "BEGIN";
459 char *my_sqlite_batch_unlock_query = "COMMIT";
460 char *my_sqlite_batch_fill_path_query = "INSERT INTO Path (Path)          " 
461                                         " SELECT DISTINCT Path FROM batch "
462                                         " EXCEPT SELECT Path FROM Path    ";
463
464 char *my_sqlite_batch_fill_filename_query = "INSERT INTO Filename (Name)       " 
465                                             " SELECT DISTINCT Name FROM batch  "
466                                             " EXCEPT SELECT Name FROM Filename ";
467 #endif /* HAVE_BATCH_FILE_INSERT */
468
469
470 #endif /* HAVE_SQLITE */