]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/cats/mysql.c
Fix conio.h problem on Solaris
[bacula/bacula] / bacula / src / cats / mysql.c
index f38aac6705a8452d8e460bafb91ad273f95dede2..d327927c442bb6c81202fca03a8058981297946b 100644 (file)
@@ -9,7 +9,7 @@
  */
 
 /*
-   Copyright (C) 2000-2003 Kern Sibbald and John Walker
+   Copyright (C) 2000-2004 Kern Sibbald and John Walker
 
    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License as
@@ -56,8 +56,8 @@ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  * never have errors, or it is really fatal.
  */
 B_DB *
-db_init_database(JCR *jcr, char *db_name, char *db_user, char *db_password, 
-                char *db_address, int db_port, char *db_socket) 
+db_init_database(JCR *jcr, const char *db_name, const char *db_user, const char *db_password, 
+                const char *db_address, int db_port, const char *db_socket) 
 {
    B_DB *mdb;
 
@@ -107,7 +107,9 @@ db_init_database(JCR *jcr, char *db_name, char *db_user, char *db_password,
 
 /*
  * Now actually open the database.  This can generate errors,
- * which are returned in the errmsg
+ *  which are returned in the errmsg
+ *
+ * DO NOT close the database or free(mdb) here !!!!
  */
 int
 db_open_database(JCR *jcr, B_DB *mdb)
@@ -134,18 +136,8 @@ db_open_database(JCR *jcr, B_DB *mdb)
 #endif
    mysql_init(&(mdb->mysql));
    Dmsg0(50, "mysql_init done\n");
-   mdb->db = mysql_real_connect(
-       &(mdb->mysql),                /* db */
-       mdb->db_address,              /* default = localhost */
-       mdb->db_user,                 /*  login name */
-       mdb->db_password,             /*  password */
-       mdb->db_name,                 /* database name */
-       mdb->db_port,                 /* default port */
-       mdb->db_socket,               /* default = socket */
-       CLIENT_FOUND_ROWS);           /* flags */
-
-   /* If no connect, try once more in case it is a timing problem */
-   if (mdb->db == NULL) {
+   /* If connection fails, try at 5 sec intervals for 30 seconds. */
+   for (int retry=0; retry < 6; retry++) {
       mdb->db = mysql_real_connect(
           &(mdb->mysql),                /* db */
           mdb->db_address,              /* default = localhost */
@@ -155,6 +147,12 @@ db_open_database(JCR *jcr, B_DB *mdb)
           mdb->db_port,                 /* default port */
           mdb->db_socket,               /* default = socket */
           CLIENT_FOUND_ROWS);           /* flags */
+
+      /* If no connect, try once more in case it is a timing problem */
+      if (mdb->db != NULL) {
+        break;
+      }
+      bmicrosleep(5,0);
    }
     
    Dmsg0(50, "mysql_real_connect done\n");
@@ -172,7 +170,6 @@ It is probably not running or your password is incorrect.\n"),
 
    if (!check_tables_version(jcr, mdb)) {
       V(mutex);
-      db_close_database(jcr, mdb);
       return 0;
    }
 
@@ -188,6 +185,9 @@ It is probably not running or your password is incorrect.\n"),
 void
 db_close_database(JCR *jcr, B_DB *mdb)
 {
+   if (!mdb) {
+      return;
+   }
    P(mutex);
    mdb->ref_count--;
 #ifdef HAVE_TREAD_SAFE_MYSQL
@@ -312,13 +312,13 @@ unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from,
  * Submit a general SQL command (cmd), and for each row returned,
  *  the sqlite_handler is called with the ctx.
  */
-int db_sql_query(B_DB *mdb, char *query, DB_RESULT_HANDLER *result_handler, void *ctx)
+int db_sql_query(B_DB *mdb, const char *query, DB_RESULT_HANDLER *result_handler, void *ctx)
 {
    SQL_ROW row;
   
    db_lock(mdb);
    if (sql_query(mdb, query) != 0) {
-      Mmsg(&mdb->errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror(mdb));
+      Mmsg(mdb->errmsg, _("Query failed: %s: ERR=%s\n"), query, sql_strerror(mdb));
       db_unlock(mdb);
       return 0;
    }