X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fcats%2Fsqlite.c;h=856a769699b286687682bd39a620031024c2004e;hb=a2bbe5fe90fa7b488146142f1c56af3e4da56867;hp=32dd34853d213a874e76c9512494fcb3c403b7aa;hpb=2a077f08e469e03b56576196f351faba15761b9f;p=bacula%2Fbacula diff --git a/bacula/src/cats/sqlite.c b/bacula/src/cats/sqlite.c index 32dd34853d..856a769699 100644 --- a/bacula/src/cats/sqlite.c +++ b/bacula/src/cats/sqlite.c @@ -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); }