]> git.sur5r.net Git - bacula/bacula/blob - bacula/src/cats/sqlite.c
Eliminate more strerror() and replace with bstrerror().
[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       berrno be;
162       Mmsg1(&mdb->errmsg, _("Unable to initialize DB lock. ERR=%s\n"),
163             be.bstrerror(errstat));
164       V(mutex);
165       return 0;
166    }
167
168    /* open the database */
169    len = strlen(working_directory) + strlen(mdb->db_name) + 5;
170    db_name = (char *)malloc(len);
171    strcpy(db_name, working_directory);
172    strcat(db_name, "/");
173    strcat(db_name, mdb->db_name);
174    strcat(db_name, ".db");
175    if (stat(db_name, &statbuf) != 0) {
176       Mmsg1(&mdb->errmsg, _("Database %s does not exist, please create it.\n"),
177          db_name);
178       free(db_name);
179       V(mutex);
180       return 0;
181    }
182
183    for (mdb->db=NULL; !mdb->db && retry++ < 10; ) {
184 #ifdef HAVE_SQLITE3
185       int stat = sqlite3_open(db_name, &mdb->db);
186       if (stat != SQLITE_OK) {
187          mdb->sqlite_errmsg = (char *)sqlite3_errmsg(mdb->db); 
188          sqlite3_close(mdb->db);
189          mdb->db = NULL;
190       } else {
191          mdb->sqlite_errmsg = NULL;
192       }
193 #else
194       mdb->db = sqlite_open(
195            db_name,                      /* database name */
196            644,                          /* mode */
197            &mdb->sqlite_errmsg);         /* error message */
198 #endif
199
200       Dmsg0(300, "sqlite_open\n");
201       if (!mdb->db) {
202          bmicrosleep(1, 0);
203       }
204    }
205    if (mdb->db == NULL) {
206       Mmsg2(&mdb->errmsg, _("Unable to open Database=%s. ERR=%s\n"),
207          db_name, mdb->sqlite_errmsg ? mdb->sqlite_errmsg : _("unknown"));
208       free(db_name);
209       V(mutex);
210       return 0;
211    }       
212    mdb->connected = true;
213    free(db_name);
214
215    /* set busy handler to wait when we use mult_db_connections = 1 */
216 #ifdef HAVE_SQLITE3
217    sqlite3_busy_handler(mdb->db, my_busy_handler, NULL);
218 #else
219    sqlite_busy_handler(mdb->db, my_busy_handler, NULL);
220 #endif
221
222 #if  defined(HAVE_SQLITE3) && defined(SQLITE3_INIT_QUERY)
223    db_sql_query(mdb, SQLITE3_INIT_QUERY, NULL, NULL);
224 #endif
225
226    if (!check_tables_version(jcr, mdb)) {
227       V(mutex);
228       return 0;
229    }
230
231
232    V(mutex);
233    return 1;
234 }
235
236 void
237 db_close_database(JCR *jcr, B_DB *mdb)
238 {
239    if (!mdb) {
240       return;
241    }
242    db_end_transaction(jcr, mdb);
243    P(mutex);
244    sql_free_result(mdb);
245    mdb->ref_count--;
246    if (mdb->ref_count == 0) {
247       qdchain(&mdb->bq);
248       if (mdb->connected && mdb->db) {
249          sqlite_close(mdb->db);
250       }
251       rwl_destroy(&mdb->lock);
252       free_pool_memory(mdb->errmsg);
253       free_pool_memory(mdb->cmd);
254       free_pool_memory(mdb->cached_path);
255       free_pool_memory(mdb->fname);
256       free_pool_memory(mdb->path);
257       free_pool_memory(mdb->esc_name);
258       free_pool_memory(mdb->esc_path);
259       if (mdb->db_name) {
260          free(mdb->db_name);
261       }
262       free(mdb);
263    }
264    V(mutex);
265 }
266
267 void db_thread_cleanup()
268 {
269 #ifdef HAVE_SQLITE3
270    sqlite3_thread_cleanup();
271 #endif
272 }
273
274 /*
275  * Return the next unique index (auto-increment) for
276  * the given table.  Return 0 on error.
277  */
278 int db_next_index(JCR *jcr, B_DB *mdb, char *table, char *index)
279 {
280    strcpy(index, "NULL");
281    return 1;
282 }
283
284
285 /*
286  * Escape strings so that SQLite is happy
287  *
288  *   NOTE! len is the length of the old string. Your new
289  *         string must be long enough (max 2*old+1) to hold
290  *         the escaped output.
291  */
292 void
293 db_escape_string(JCR *jcr, B_DB *db, char *snew, char *old, int len)
294 {
295    char *n, *o;
296
297    n = snew;
298    o = old;
299    while (len--) {
300       switch (*o) {
301       case '\'':
302          *n++ = '\'';
303          *n++ = '\'';
304          o++;
305          break;
306       case 0:
307          *n++ = '\\';
308          *n++ = 0;
309          o++;
310          break;
311       default:
312          *n++ = *o++;
313          break;
314       }
315    }
316    *n = 0;
317 }
318
319 struct rh_data {
320    DB_RESULT_HANDLER *result_handler;
321    void *ctx;
322 };
323
324 /*
325  * Convert SQLite's callback into Bacula DB callback
326  */
327 static int sqlite_result(void *arh_data, int num_fields, char **rows, char **col_names)
328 {
329    struct rh_data *rh_data = (struct rh_data *)arh_data;
330
331    if (rh_data->result_handler) {
332       (*(rh_data->result_handler))(rh_data->ctx, num_fields, rows);
333    }
334    return 0;
335 }
336
337 /*
338  * Submit a general SQL command (cmd), and for each row returned,
339  *  the sqlite_handler is called with the ctx.
340  */
341 int db_sql_query(B_DB *mdb, const char *query, DB_RESULT_HANDLER *result_handler, void *ctx)
342 {
343    struct rh_data rh_data;
344    int stat;
345
346    db_lock(mdb);
347    if (mdb->sqlite_errmsg) {
348 #ifdef HAVE_SQLITE3
349       sqlite3_free(mdb->sqlite_errmsg);
350 #else
351       actuallyfree(mdb->sqlite_errmsg);
352 #endif
353       mdb->sqlite_errmsg = NULL;
354    }
355    rh_data.result_handler = result_handler;
356    rh_data.ctx = ctx;
357    stat = sqlite_exec(mdb->db, query, sqlite_result, (void *)&rh_data, &mdb->sqlite_errmsg);
358    if (stat != 0) {
359       Mmsg(mdb->errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror(mdb));
360       db_unlock(mdb);
361       return 0;
362    }
363    db_unlock(mdb);
364    return 1;
365 }
366
367 /*
368  * Submit a sqlite query and retrieve all the data
369  */
370 int my_sqlite_query(B_DB *mdb, const char *cmd)
371 {
372    int stat;
373
374    my_sqlite_free_table(mdb);
375    if (mdb->sqlite_errmsg) {
376 #ifdef HAVE_SQLITE3
377       sqlite3_free(mdb->sqlite_errmsg);
378 #else
379       actuallyfree(mdb->sqlite_errmsg);
380 #endif
381       mdb->sqlite_errmsg = NULL;
382    }
383    stat = sqlite_get_table(mdb->db, (char *)cmd, &mdb->result, &mdb->nrow, &mdb->ncolumn,
384             &mdb->sqlite_errmsg);
385    mdb->row = 0;                      /* row fetched */
386    return stat;
387 }
388
389 /* Fetch one row at a time */
390 SQL_ROW my_sqlite_fetch_row(B_DB *mdb)
391 {
392    if (mdb->row >= mdb->nrow) {
393       return NULL;
394    }
395    mdb->row++;
396    return &mdb->result[mdb->ncolumn * mdb->row];
397 }
398
399 void my_sqlite_free_table(B_DB *mdb)
400 {
401    int i;
402
403    if (mdb->fields_defined) {
404       for (i=0; i < sql_num_fields(mdb); i++) {
405          free(mdb->fields[i]);
406       }
407       free(mdb->fields);
408       mdb->fields_defined = false;
409    }
410    if (mdb->result) {
411       sqlite_free_table(mdb->result);
412       mdb->result = NULL;
413    }
414    mdb->nrow = mdb->ncolumn = 0;
415 }
416
417 void my_sqlite_field_seek(B_DB *mdb, int field)
418 {
419    int i, j;
420    if (mdb->result == NULL) {
421       return;
422    }
423    /* On first call, set up the fields */
424    if (!mdb->fields_defined && sql_num_fields(mdb) > 0) {
425       mdb->fields = (SQL_FIELD **)malloc(sizeof(SQL_FIELD) * mdb->ncolumn);
426       for (i=0; i < sql_num_fields(mdb); i++) {
427          mdb->fields[i] = (SQL_FIELD *)malloc(sizeof(SQL_FIELD));
428          mdb->fields[i]->name = mdb->result[i];
429          mdb->fields[i]->length = cstrlen(mdb->fields[i]->name);
430          mdb->fields[i]->max_length = mdb->fields[i]->length;
431          for (j=1; j <= mdb->nrow; j++) {
432             int len;
433             if (mdb->result[i + mdb->ncolumn *j]) {
434                len = (uint32_t)cstrlen(mdb->result[i + mdb->ncolumn * j]);
435             } else {
436                len = 0;
437             }
438             if (len > mdb->fields[i]->max_length) {
439                mdb->fields[i]->max_length = len;
440             }
441          }
442          mdb->fields[i]->type = 0;
443          mdb->fields[i]->flags = 1;        /* not null */
444       }
445       mdb->fields_defined = TRUE;
446    }
447    if (field > sql_num_fields(mdb)) {
448       field = sql_num_fields(mdb);
449     }
450     mdb->field = field;
451
452 }
453
454 SQL_FIELD *my_sqlite_fetch_field(B_DB *mdb)
455 {
456    return mdb->fields[mdb->field++];
457 }
458
459 #ifdef HAVE_BATCH_FILE_INSERT
460 const char *my_sqlite_batch_lock_query = "BEGIN";
461 const char *my_sqlite_batch_unlock_query = "COMMIT";
462
463 const char *my_sqlite_batch_fill_path_query = 
464    "INSERT INTO Path (Path)" 
465    " SELECT DISTINCT Path FROM batch"
466    " EXCEPT SELECT Path FROM Path";
467
468 const char *my_sqlite_batch_fill_filename_query = 
469    "INSERT INTO Filename (Name)"
470    " SELECT DISTINCT Name FROM batch "
471    " EXCEPT SELECT Name FROM Filename";
472 #endif /* HAVE_BATCH_FILE_INSERT */
473
474
475 #endif /* HAVE_SQLITE */