void mpl_tab_drv_close(MPL *mpl) { TABDCA *dca = mpl->dca; int ret; switch (dca->id) { case TAB_CSV: ret = csv_close_file(dca, dca->link); break; case TAB_XBASE: ret = dbf_close_file(dca, dca->link); break; case TAB_ODBC: ret = db_iodbc_close(dca, dca->link); break; case TAB_MYSQL: ret = db_mysql_close(dca, dca->link); break; default: xassert(dca != dca); } dca->id = 0; dca->link = NULL; if (ret) error(mpl, "error on closing table %s", mpl->stmt->u.tab->name); return; }
void db_mysql_async_exec_task(void *param) { str *p; db1_con_t* dbc; p = (str*)param; dbc = db_mysql_init(&p[0]); if(dbc==NULL) { LM_ERR("failed to open connection for [%.*s]\n", p[0].len, p[0].s); return; } if(db_mysql_submit_query(dbc, &p[1])<0) { LM_ERR("failed to execute query on async worker\n"); } db_mysql_close(dbc); }
int db_mysql_query(char *sql) { int result, lcv; int pingresult; if (!denora->do_sql) { return 0; } alog(LOG_SQLDEBUG, "sql debug: %s", db_mysql_hidepass(sql)); pingresult = mysql_ping(mysql); if (!pingresult) { result = mysql_query(mysql, sql); } else { result = pingresult; } if (result) { switch (mysql_errno(mysql)) { case CR_SERVER_GONE_ERROR: case CR_SERVER_LOST: case CR_CONN_HOST_ERROR: case CR_IPSOCK_ERROR: case CR_CONNECTION_ERROR: case CR_UNKNOWN_ERROR: for (lcv = 0; lcv < SqlRetries; lcv++) { alog(LOG_NORMAL, "%s, trying to reconnect...", mysql_error(mysql)); if (db_mysql_open()) { alog(LOG_NORMAL, "MySQL connection reestablished"); result = mysql_query(mysql, sql); return (result); } sleep(SqlRetryGap); } /* If we get here, we could not connect. */ log_perror("Unable to reconnect to database: %s\n", mysql_error(mysql)); db_mysql_error(SQL_ERROR, "connect"); alog(LOG_ERROR, "Disabling MYSQL due to problem with server"); denora->do_sql = 0; SQLDisableDueServerLost = 1; /* Never reached. */ break; case CR_COMMANDS_OUT_OF_SYNC: db_mysql_error(SQL_ERROR, "Commands out of sync"); break; case ER_PARSE_ERROR: db_mysql_error(SQL_ERROR, "parser error"); break; case ER_WRONG_VALUE_COUNT_ON_ROW: db_mysql_error(SQL_ERROR, "query error"); break; case ER_BAD_FIELD_ERROR: db_mysql_error(SQL_ERROR, "Unknown field"); break; case ER_NO_SUCH_TABLE: db_mysql_error(SQL_ERROR, "Table Doesn't exist"); break; case ER_DUP_FIELDNAME: break; case ER_DUP_ENTRY: alog(LOG_ERROR, "MYSQL said %s", mysql_error(mysql)); alog(LOG_ERROR, "MYSQL query %s", sql); break; case ER_BAD_NULL_ERROR: db_mysql_error(SQL_ERROR, "Column can not be NULL!! - check statement"); break; case ER_USER_LIMIT_REACHED: db_mysql_error(SQL_ERROR, "To Many Connections, closing denora mysql connection"); denora->do_sql = 0; db_mysql_close(); SQLDisableDueServerLost = 1; break; case ER_GET_ERRNO: db_mysql_error(SQL_ERROR, "mysql returned errno code: disabling MYSQL"); denora->do_sql = 0; db_mysql_close(); SQLDisableDueServerLost = 1; break; default: alog(LOG_ERROR, "MYSQL reported Error Code %d", mysql_errno(mysql)); alog(LOG_ERROR, "MYSQL said %s", mysql_error(mysql)); alog(LOG_ERROR, "Report this to Denora Developers"); alog(LOG_ERROR, "Disabling MYSQL due to this error"); denora->do_sql = 0; db_mysql_close(); SQLDisableDueServerLost = 1; return 0; } } return 1; }