X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fcats%2Fsqlite.c;h=856a769699b286687682bd39a620031024c2004e;hb=a2bbe5fe90fa7b488146142f1c56af3e4da56867;hp=34f2c136e87f5974f945291ad7c94f014357a0bd;hpb=eadceb59d8db8e1edf13de2fcf5ebd40465fb477;p=bacula%2Fbacula diff --git a/bacula/src/cats/sqlite.c b/bacula/src/cats/sqlite.c index 34f2c136e8..856a769699 100644 --- a/bacula/src/cats/sqlite.c +++ b/bacula/src/cats/sqlite.c @@ -1,3 +1,30 @@ +/* + Bacula® - The Network Backup Solution + + 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. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation plus additions + that are listed in the file LICENSE. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + Bacula® is a registered trademark of John Walker. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ /* * Bacula Catalog Database routines specific to SQLite * @@ -5,20 +32,6 @@ * * Version $Id$ */ -/* - Copyright (C) 2002-2006 Kern Sibbald - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as amended with additional clauses defined in the - file LICENSE in the main source directory. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - the file LICENSE for additional details. - - */ @@ -47,6 +60,35 @@ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int QueryDB(const char *file, int line, JCR *jcr, B_DB *db, char *select_cmd); +/* + * Retrieve database type + */ +const char * +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. @@ -86,6 +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_path = get_pool_memory(PM_FNAME); mdb->allow_transactions = mult_db_connections; qinsert(&db_list, &mdb->bq); /* put db in list */ V(mutex); @@ -139,6 +182,8 @@ db_open_database(JCR *jcr, B_DB *mdb) int stat = sqlite3_open(db_name, &mdb->db); if (stat != SQLITE_OK) { mdb->sqlite_errmsg = (char *)sqlite3_errmsg(mdb->db); + sqlite3_close(mdb->db); + mdb->db = NULL; } else { mdb->sqlite_errmsg = NULL; } @@ -158,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; } @@ -178,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); @@ -191,6 +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_path); if (mdb->db_name) { free(mdb->db_name); } @@ -331,7 +385,11 @@ int my_sqlite_query(B_DB *mdb, const char *cmd) int stat; if (mdb->sqlite_errmsg) { +#ifdef HAVE_SQLITE3 + sqlite3_free(mdb->sqlite_errmsg); +#else actuallyfree(mdb->sqlite_errmsg); +#endif mdb->sqlite_errmsg = NULL; } stat = sqlite_get_table(mdb->db, (char *)cmd, &mdb->result, &mdb->nrow, &mdb->ncolumn, @@ -407,4 +465,16 @@ SQL_FIELD *my_sqlite_fetch_field(B_DB *mdb) return mdb->fields[mdb->field++]; } +char *my_sqlite_batch_lock_query = "BEGIN"; +char *my_sqlite_batch_unlock_query = "COMMIT"; +char *my_sqlite_batch_fill_path_query = "INSERT INTO Path (Path) " + " SELECT DISTINCT Path FROM batch " + " EXCEPT SELECT Path FROM Path "; + +char *my_sqlite_batch_fill_filename_query = "INSERT INTO Filename (Name) " + " SELECT DISTINCT Name FROM batch " + " EXCEPT SELECT Name FROM Filename "; + + + #endif /* HAVE_SQLITE */