X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=bacula%2Fsrc%2Fcats%2Fmysql.c;h=a8cd052bbd89dcded1e2ee4d802da5a407e16770;hb=27c6094b93454811a6e966558ec187f8ad5a229c;hp=48843840b51adc7e434b27da7275644271e20667;hpb=28cb0ae0417693ee76077488412b822a1b3a266b;p=bacula%2Fbacula diff --git a/bacula/src/cats/mysql.c b/bacula/src/cats/mysql.c index 48843840b5..a8cd052bbd 100644 --- a/bacula/src/cats/mysql.c +++ b/bacula/src/cats/mysql.c @@ -56,23 +56,26 @@ 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, + int mult_db_connections) { B_DB *mdb; - if (!db_user) { + if (!db_user) { Jmsg(jcr, M_FATAL, 0, _("A user name for MySQL must be supplied.\n")); return NULL; } P(mutex); /* lock DB queue */ /* Look to see if DB already open */ - for (mdb=NULL; (mdb=(B_DB *)qnext(&db_list, &mdb->bq)); ) { - if (strcmp(mdb->db_name, db_name) == 0) { - Dmsg2(100, "DB REopen %d %s\n", mdb->ref_count, db_name); - mdb->ref_count++; - V(mutex); - return mdb; /* already open */ + if (!mult_db_connections) { + for (mdb=NULL; (mdb=(B_DB *)qnext(&db_list, &mdb->bq)); ) { + if (strcmp(mdb->db_name, db_name) == 0) { + Dmsg2(100, "DB REopen %d %s\n", mdb->ref_count, db_name); + mdb->ref_count++; + V(mutex); + return mdb; /* already open */ + } } } Dmsg0(100, "db_open first time\n"); @@ -124,7 +127,7 @@ db_open_database(JCR *jcr, B_DB *mdb) mdb->connected = FALSE; if ((errstat=rwl_init(&mdb->lock)) != 0) { - Mmsg1(&mdb->errmsg, _("Unable to initialize DB lock. ERR=%s\n"), + Mmsg1(&mdb->errmsg, _("Unable to initialize DB lock. ERR=%s\n"), strerror(errstat)); V(mutex); return 0; @@ -136,18 +139,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 */ @@ -157,16 +150,22 @@ 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"); - Dmsg3(50, "db_user=%s db_name=%s db_password=%s\n", mdb->db_user, mdb->db_name, - mdb->db_password==NULL?"(NULL)":mdb->db_password); - + Dmsg3(50, "db_user=%s db_name=%s db_password=%s\n", mdb->db_user, mdb->db_name, + mdb->db_password==NULL?"(NULL)":mdb->db_password); + if (mdb->db == NULL) { - Mmsg2(&mdb->errmsg, _("Unable to connect to MySQL server. \n\ -Database=%s User=%s\n\ -It is probably not running or your password is incorrect.\n"), + Mmsg2(&mdb->errmsg, _("Unable to connect to MySQL server. \n" +"Database=%s User=%s\n" +"It is probably not running or your password is incorrect.\n"), mdb->db_name, mdb->db_user); V(mutex); return 0; @@ -177,7 +176,7 @@ It is probably not running or your password is incorrect.\n"), return 0; } -#ifdef HAVE_TREAD_SAFE_MYSQL +#ifdef HAVE_THREAD_SAFE_MYSQL my_thread_init(); #endif @@ -205,7 +204,7 @@ db_close_database(JCR *jcr, B_DB *mdb) mysql_server_end(); #endif } - rwl_destroy(&mdb->lock); + rwl_destroy(&mdb->lock); free_pool_memory(mdb->errmsg); free_pool_memory(mdb->cmd); free_pool_memory(mdb->cached_path); @@ -235,7 +234,7 @@ db_close_database(JCR *jcr, B_DB *mdb) /* * Return the next unique index (auto-increment) for * the given table. Return NULL on error. - * + * * For MySQL, NULL causes the auto-increment value * to be updated. */ @@ -243,7 +242,7 @@ int db_next_index(JCR *jcr, B_DB *mdb, char *table, char *index) { strcpy(index, "NULL"); return 1; -} +} /* @@ -270,38 +269,38 @@ unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, while (len--) { switch (*o) { case 0: - *n++= '\\'; - *n++= '0'; + *n++= '\\'; + *n++= '0'; o++; break; case '\n': - *n++= '\\'; - *n++= 'n'; + *n++= '\\'; + *n++= 'n'; o++; break; case '\r': - *n++= '\\'; - *n++= 'r'; + *n++= '\\'; + *n++= 'r'; o++; break; case '\\': - *n++= '\\'; - *n++= '\\'; + *n++= '\\'; + *n++= '\\'; o++; break; case '\'': - *n++= '\\'; - *n++= '\''; + *n++= '\\'; + *n++= '\''; o++; break; case '"': - *n++= '\\'; - *n++= '"'; + *n++= '\\'; + *n++= '"'; o++; break; case '\032': - *n++= '\\'; - *n++= 'Z'; + *n++= '\\'; + *n++= 'Z'; o++; break; default: @@ -316,13 +315,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; }