extern int mysql_db_query_check_after(mysql_conn_t *mysql_conn, char *query) { int rc = SLURM_SUCCESS; slurm_mutex_lock(&mysql_conn->lock); if ((rc = _mysql_query_internal( mysql_conn->db_conn, query)) != SLURM_ERROR) rc = _clear_results(mysql_conn->db_conn); slurm_mutex_unlock(&mysql_conn->lock); return rc; }
extern int mysql_db_query(mysql_conn_t *mysql_conn, char *query) { int rc = SLURM_SUCCESS; if (!mysql_conn || !mysql_conn->db_conn) fatal("You haven't inited this storage yet."); slurm_mutex_lock(&mysql_conn->lock); rc = _mysql_query_internal(mysql_conn->db_conn, query); slurm_mutex_unlock(&mysql_conn->lock); return rc; }
/* * Executes a single delete sql query. * Returns the number of deleted rows, <0 for failure. */ extern int mysql_db_delete_affected_rows(mysql_conn_t *mysql_conn, char *query) { int rc = SLURM_SUCCESS; if (!mysql_conn || !mysql_conn->db_conn) { fatal("You haven't inited this storage yet."); return 0; /* For CLANG false positive */ } slurm_mutex_lock(&mysql_conn->lock); if (!(rc = _mysql_query_internal(mysql_conn->db_conn, query))) rc = mysql_affected_rows(mysql_conn->db_conn); slurm_mutex_unlock(&mysql_conn->lock); return rc; }
extern int mysql_db_insert_ret_id(mysql_conn_t *mysql_conn, char *query) { int new_id = 0; slurm_mutex_lock(&mysql_conn->lock); if (_mysql_query_internal(mysql_conn->db_conn, query) != SLURM_ERROR) { new_id = mysql_insert_id(mysql_conn->db_conn); if (!new_id) { /* should have new id */ error("We should have gotten a new id: %s", mysql_error(mysql_conn->db_conn)); } } slurm_mutex_unlock(&mysql_conn->lock); return new_id; }
extern MYSQL_RES *mysql_db_query_ret(mysql_conn_t *mysql_conn, char *query, bool last) { MYSQL_RES *result = NULL; slurm_mutex_lock(&mysql_conn->lock); if (_mysql_query_internal(mysql_conn->db_conn, query) != SLURM_ERROR) { if (mysql_errno(mysql_conn->db_conn) == ER_NO_SUCH_TABLE) goto fini; else if (last) result = _get_last_result(mysql_conn->db_conn); else result = _get_first_result(mysql_conn->db_conn); if (!result && mysql_field_count(mysql_conn->db_conn)) { /* should have returned data */ error("We should have gotten a result: '%m' '%s'", mysql_error(mysql_conn->db_conn)); } } fini: slurm_mutex_unlock(&mysql_conn->lock); return result; }
extern int mysql_db_get_db_connection(mysql_conn_t *mysql_conn, char *db_name, mysql_db_info_t *db_info) { int rc = SLURM_SUCCESS; bool storage_init = false; char *db_host = db_info->host; xassert(mysql_conn); slurm_mutex_lock(&mysql_conn->lock); if (!(mysql_conn->db_conn = mysql_init(mysql_conn->db_conn))) { slurm_mutex_unlock(&mysql_conn->lock); fatal("mysql_init failed: %s", mysql_error(mysql_conn->db_conn)); } else { /* If this ever changes you will need to alter * src/common/slurmdbd_defs.c function _send_init_msg to * handle a different timeout when polling for the * response. */ unsigned int my_timeout = 30; #ifdef MYSQL_OPT_RECONNECT my_bool reconnect = 1; /* make sure reconnect is on */ mysql_options(mysql_conn->db_conn, MYSQL_OPT_RECONNECT, &reconnect); #endif mysql_options(mysql_conn->db_conn, MYSQL_OPT_CONNECT_TIMEOUT, (char *)&my_timeout); while (!storage_init) { if (!mysql_real_connect(mysql_conn->db_conn, db_host, db_info->user, db_info->pass, db_name, db_info->port, NULL, CLIENT_MULTI_STATEMENTS)) { int err = mysql_errno(mysql_conn->db_conn); if (err == ER_BAD_DB_ERROR) { debug("Database %s not created. " "Creating", db_name); rc = _create_db(db_name, db_info); } else { const char *err_str = mysql_error( mysql_conn->db_conn); error("mysql_real_connect failed: " "%d %s", err, err_str); if ((db_host == db_info->host) && db_info->backup) { db_host = db_info->backup; continue; } rc = ESLURM_DB_CONNECTION; mysql_close(mysql_conn->db_conn); mysql_conn->db_conn = NULL; break; } } else { storage_init = true; if (mysql_conn->rollback) mysql_autocommit( mysql_conn->db_conn, 0); rc = _mysql_query_internal( mysql_conn->db_conn, "SET session sql_mode='ANSI_QUOTES," "NO_ENGINE_SUBSTITUTION';"); } } } slurm_mutex_unlock(&mysql_conn->lock); errno = rc; return rc; }