X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fcats%2Fsqlite.c;h=856a769699b286687682bd39a620031024c2004e;hb=a2bbe5fe90fa7b488146142f1c56af3e4da56867;hp=6c9b7f498abecb47eb5cb41e289d5e03e4b4e5c3;hpb=46205bab364750557e69071ba7d60b754069a334;p=bacula%2Fbacula diff --git a/bacula/src/cats/sqlite.c b/bacula/src/cats/sqlite.c index 6c9b7f498a..856a769699 100644 --- a/bacula/src/cats/sqlite.c +++ b/bacula/src/cats/sqlite.c @@ -1,14 +1,7 @@ -/* - * Bacula Catalog Database routines specific to SQLite - * - * Kern Sibbald, January 2002 - * - * Version $Id$ - */ /* Bacula® - The Network Backup Solution - Copyright (C) 2000-2006 Free Software Foundation Europe e.V. + Copyright (C) 2000-2007 Free Software Foundation Europe e.V. The main author of Bacula is Kern Sibbald, with contributions from many others, a complete list can be found in the file AUTHORS. @@ -32,6 +25,13 @@ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, Switzerland, email:ftf@fsfeurope.org. */ +/* + * Bacula Catalog Database routines specific to SQLite + * + * Kern Sibbald, January 2002 + * + * Version $Id$ + */ @@ -69,6 +69,26 @@ db_get_type(void) return "SQLite"; } +/* + * When using mult_db_connections = 1, + * sqlite can be BUSY. We just need sleep a little in this case. + */ + +#ifdef HAVE_SQLITE3 +static int my_busy_handler(void *arg, int calls) +{ + bmicrosleep(0, 500); + return 1; +} +#else +static int my_busy_handler(void *arg, const char* p, int calls) +{ + bmicrosleep(0, 500); + return 1; +} +#endif + + /* * Initialize database data structure. In principal this should * never have errors, or it is really fatal. @@ -108,7 +128,7 @@ db_init_database(JCR *jcr, const char *db_name, const char *db_user, const char mdb->fname = get_pool_memory(PM_FNAME); mdb->path = get_pool_memory(PM_FNAME); mdb->esc_name = get_pool_memory(PM_FNAME); - mdb->esc_name2 = get_pool_memory(PM_FNAME); + mdb->esc_path = get_pool_memory(PM_FNAME); mdb->allow_transactions = mult_db_connections; qinsert(&db_list, &mdb->bq); /* put db in list */ V(mutex); @@ -183,14 +203,21 @@ db_open_database(JCR *jcr, B_DB *mdb) free(db_name); V(mutex); return 0; - } + } + mdb->connected = true; free(db_name); if (!check_tables_version(jcr, mdb)) { V(mutex); return 0; } - mdb->connected = true; + /* set busy handler to wait when we use mult_db_connections = 1 */ +#ifdef HAVE_SQLITE3 + sqlite3_busy_handler(mdb->db, my_busy_handler, NULL); +#else + sqlite_busy_handler(mdb->db, my_busy_handler, NULL); +#endif + V(mutex); return 1; } @@ -203,6 +230,7 @@ db_close_database(JCR *jcr, B_DB *mdb) } db_end_transaction(jcr, mdb); P(mutex); + sql_free_result(mdb); mdb->ref_count--; if (mdb->ref_count == 0) { qdchain(&mdb->bq); @@ -216,7 +244,7 @@ db_close_database(JCR *jcr, B_DB *mdb) free_pool_memory(mdb->fname); free_pool_memory(mdb->path); free_pool_memory(mdb->esc_name); - free_pool_memory(mdb->esc_name2); + free_pool_memory(mdb->esc_path); if (mdb->db_name) { free(mdb->db_name); }