]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/cats/mysql.c
Correct compile error
[bacula/bacula] / bacula / src / cats / mysql.c
index df58a9a0806802448513037f431df54670081107..6242fc3753d4b42987aecea1bb2fd4dec1918321 100644 (file)
@@ -7,8 +7,8 @@
    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.
+   License as published by the Free Software Foundation and included
+   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
@@ -159,7 +159,8 @@ db_open_database(JCR *jcr, B_DB *mdb)
 #ifdef xHAVE_EMBEDDED_MYSQL
 // mysql_server_init(0, NULL, NULL);
 #endif
-   mysql_init(&(mdb->mysql));
+   mysql_init(&mdb->mysql);
+
    Dmsg0(50, "mysql_init done\n");
    /* If connection fails, try at 5 sec intervals for 30 seconds. */
    for (int retry=0; retry < 6; retry++) {
@@ -200,9 +201,6 @@ db_open_database(JCR *jcr, B_DB *mdb)
       return 0;
    }
 
-#ifdef HAVE_THREAD_SAFE_MYSQL
-   my_thread_init();
-#endif
    Dmsg3(100, "opendb ref=%d connected=%d db=%p\n", mdb->ref_count,
          mdb->connected, mdb->db);
 
@@ -220,16 +218,14 @@ db_close_database(JCR *jcr, B_DB *mdb)
    P(mutex);
    sql_free_result(mdb);
    mdb->ref_count--;
-#if defined(HAVE_THREAD_SAFE_MYSQL)
-   my_thread_end();
-#endif
    Dmsg3(100, "closedb ref=%d connected=%d db=%p\n", mdb->ref_count,
          mdb->connected, mdb->db);
    if (mdb->ref_count == 0) {
       qdchain(&mdb->bq);
-      if (mdb->connected && mdb->db) {
+      if (mdb->connected) {
          Dmsg1(100, "close db=%p\n", mdb->db);
-         mysql_close(&(mdb->mysql));
+         mysql_close(&mdb->mysql);
+
 #ifdef xHAVE_EMBEDDED_MYSQL
 //       mysql_server_end();
 #endif
@@ -262,6 +258,21 @@ db_close_database(JCR *jcr, B_DB *mdb)
    V(mutex);
 }
 
+/*
+ * This call is needed because the message channel thread
+ *  opens a database on behalf of a jcr that was created in
+ *  a different thread. MySQL then allocates thread specific
+ *  data, which is NOT freed when the original jcr thread
+ *  closes the database.  Thus the msgchan must call here
+ *  to cleanup any thread specific data that it created.
+ */
+void db_thread_cleanup()
+{ 
+#ifndef HAVE_WIN32
+   my_thread_end();
+#endif
+}
+
 /*
  * Return the next unique index (auto-increment) for
  * the given table.  Return NULL on error.
@@ -288,7 +299,7 @@ db_escape_string(char *snew, char *old, int len)
 {
    mysql_escape_string(snew, old, len);
 
-#ifdef DO_IT_MYSELF
+#ifdef xDO_IT_MYSELF
 
 /* Should use mysql_real_escape_string ! */
 unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length);
@@ -384,10 +395,12 @@ int db_sql_query(B_DB *mdb, const char *query, DB_RESULT_HANDLER *result_handler
 
 void my_mysql_free_result(B_DB *mdb)
 {
+   db_lock(mdb);
    if (mdb->result) {
       mysql_free_result(mdb->result);
       mdb->result = NULL;
    }
+   db_unlock(mdb);
 }
 
 char *my_mysql_batch_lock_path_query = "LOCK TABLES Path write,     "