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 { 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; break; } } else { storage_init = true; } } } slurm_mutex_unlock(&mysql_conn->lock); errno = rc; return rc; }
gboolean gc_db_init(gboolean disable_database_) { #ifdef USE_SQLITE disable_database = disable_database_; SUPPORT_OR_RETURN(FALSE); gboolean creation = FALSE; char *zErrMsg; char **result; int rc; int nrow; int ncolumn; GcomprisProperties *properties = gc_prop_get(); if (!g_file_test(properties->database, G_FILE_TEST_EXISTS)) creation = TRUE; rc = sqlite3_open(properties->database, &gcompris_db); if( rc ){ g_message("Can't open database %s : %s\n", properties->database, sqlite3_errmsg(gcompris_db)); sqlite3_close(gcompris_db); disable_database = TRUE; return FALSE; } g_message("Database %s opened", properties->database); if (creation){ _create_db(); } else { if ( ! _check_db_integrity() || _gc_boards_count() == 0 ) { // We failed to load the database, let's // backup it and re create it. sqlite3_close(gcompris_db); gchar *backup = g_strdup_printf("%s.broken", properties->database); g_rename(properties->database, backup); g_message("Database is broken, it is copyed in %s", backup); g_free(backup); rc = sqlite3_open(properties->database, &gcompris_db); if( rc ){ g_message("Can't open database %s : %s\n", properties->database, sqlite3_errmsg(gcompris_db)); sqlite3_close(gcompris_db); disable_database = TRUE; return FALSE; } _create_db(); if ( ! _check_db_integrity() ) { disable_database = TRUE; return FALSE; } } g_message("Database Integrity ok"); rc = sqlite3_get_table(gcompris_db, CHECK_VERSION, &result, &nrow, &ncolumn, &zErrMsg ); if( rc!=SQLITE_OK ){ g_error("SQL error: %s\n", zErrMsg); } if (strcmp(result[1],VERSION)!=0) g_message("Running GCompris is %s, but database version is %s", VERSION, result[1]); sqlite3_free_table(result); /* Schema upgrade */ rc = sqlite3_get_table(gcompris_db, PRAGMA_SCHEMA_VERSION, &result, &nrow, &ncolumn, &zErrMsg ); if( rc!=SQLITE_OK ){ g_error("SQL error: %s\n", zErrMsg); } int version = atoi(result[1]); sqlite3_free_table(result); if(version <= 16) { g_message("Upgrading from <16 schema version\n"); rc = sqlite3_exec(gcompris_db,CREATE_TABLE_LOGS, NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { g_error("SQL error: %s\n", zErrMsg); } } if ( _get_user_version() == 0) { g_message("Upgrading schema based on user version = 0\n"); rc = sqlite3_exec(gcompris_db,"DROP TABLE boards;", NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { g_error("SQL error: %s\n", zErrMsg); } rc = sqlite3_exec(gcompris_db,CREATE_TABLE_BOARDS, NULL, 0, &zErrMsg); if( rc!=SQLITE_OK ) { g_error("SQL error: %s\n", zErrMsg); } // We just dropped the boards table, force a reread properties->reread_menu = TRUE; _set_user_version(1); } } return TRUE; #else return FALSE; #endif }
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; }
extern int pgsql_get_db_connection(PGconn **pgsql_db, char *db_name, pgsql_db_info_t *db_info) { int rc = SLURM_SUCCESS; bool storage_init = false; char *connect_line = xstrdup_printf("dbname = '%s'" " host = '%s'" " port = '%u'" " user = '******'" " password = '******'", db_name, db_info->host, db_info->port, db_info->user, db_info->pass); while (!storage_init) { //debug2("pgsql connect: %s", connect_line); *pgsql_db = PQconnectdb(connect_line); if (PQstatus(*pgsql_db) != CONNECTION_OK) { if (!strcmp(PQerrorMessage(*pgsql_db), "no password supplied")) { PQfinish(*pgsql_db); fatal("This Postgres connection needs " "a password. It doesn't appear to " "like blank ones"); } info("Database %s not created. Creating", db_name); pgsql_close_db_connection(pgsql_db); _create_db(db_name, db_info); } else { char *language_line = "CREATE LANGUAGE plpgsql;"; PGresult *result = NULL; const char *ver; ver = PQparameterStatus(*pgsql_db, "server_version"); if (atof(ver) < 8.3) fatal("server version 8.3 or above required"); /* This needs to be done for the accounting_storage plugin, and most likely any pgsql plugin. */ result = PQexec(*pgsql_db, language_line); if ((PQresultStatus(result) != PGRES_COMMAND_OK) && strcmp("ERROR: language \"plpgsql\" " "already exists\n", PQerrorMessage(*pgsql_db))) { fatal("PQexec failed: %d %s\n%s", PQresultStatus(result), PQerrorMessage(*pgsql_db), language_line); } PQclear(result); storage_init = true; } } xfree(connect_line); return rc; }