diff --git a/res/res_config_pgsql.c b/res/res_config_pgsql.c index 62a3565e02..a8026a7ff2 100644 --- a/res/res_config_pgsql.c +++ b/res/res_config_pgsql.c @@ -55,6 +55,7 @@ static int version; #define USE_BACKSLASH_AS_STRING (version >= 90100 ? 1 : 0) #define MAX_DB_OPTION_SIZE 64 +#define MAX_URL_OPTION_SIZE 256 struct columns { char *name; @@ -80,6 +81,7 @@ static char dbpass[MAX_DB_OPTION_SIZE] = ""; static char dbname[MAX_DB_OPTION_SIZE] = ""; static char dbappname[MAX_DB_OPTION_SIZE] = ""; static char dbsock[MAX_DB_OPTION_SIZE] = ""; +static char dburl[MAX_URL_OPTION_SIZE] = ""; static int dbport = 5432; static time_t connect_time = 0; @@ -1458,61 +1460,68 @@ static int parse_config(int is_reload) pgsqlConn = NULL; } - if (!(s = ast_variable_retrieve(config, "general", "dbuser"))) { - ast_log(LOG_WARNING, - "PostgreSQL RealTime: No database user found, using 'asterisk' as default.\n"); - strcpy(dbuser, "asterisk"); - } else { - ast_copy_string(dbuser, s, sizeof(dbuser)); - } + if ((s = ast_variable_retrieve(config, "general", "dburl"))) { + ast_log(LOG_DEBUG, + "PostgreSQL RealTime: using dburl, skipping others parameters.\n"); + ast_copy_string(dburl, s, sizeof(dburl)); + } else { - if (!(s = ast_variable_retrieve(config, "general", "dbpass"))) { - ast_log(LOG_WARNING, - "PostgreSQL RealTime: No database password found, using 'asterisk' as default.\n"); - strcpy(dbpass, "asterisk"); - } else { - ast_copy_string(dbpass, s, sizeof(dbpass)); - } + if (!(s = ast_variable_retrieve(config, "general", "dbuser"))) { + ast_log(LOG_WARNING, + "PostgreSQL RealTime: No database user found, using 'asterisk' as default.\n"); + strcpy(dbuser, "asterisk"); + } else { + ast_copy_string(dbuser, s, sizeof(dbuser)); + } - if (!(s = ast_variable_retrieve(config, "general", "dbhost"))) { - ast_log(LOG_WARNING, - "PostgreSQL RealTime: No database host found, using localhost via socket.\n"); - dbhost[0] = '\0'; - } else { - ast_copy_string(dbhost, s, sizeof(dbhost)); - } + if (!(s = ast_variable_retrieve(config, "general", "dbpass"))) { + ast_log(LOG_WARNING, + "PostgreSQL RealTime: No database password found, using 'asterisk' as default.\n"); + strcpy(dbpass, "asterisk"); + } else { + ast_copy_string(dbpass, s, sizeof(dbpass)); + } - if (!(s = ast_variable_retrieve(config, "general", "dbname"))) { - ast_log(LOG_WARNING, - "PostgreSQL RealTime: No database name found, using 'asterisk' as default.\n"); - strcpy(dbname, "asterisk"); - } else { - ast_copy_string(dbname, s, sizeof(dbname)); - } + if (!(s = ast_variable_retrieve(config, "general", "dbhost"))) { + ast_log(LOG_WARNING, + "PostgreSQL RealTime: No database host found, using localhost via socket.\n"); + dbhost[0] = '\0'; + } else { + ast_copy_string(dbhost, s, sizeof(dbhost)); + } - if (!(s = ast_variable_retrieve(config, "general", "dbport"))) { - ast_log(LOG_WARNING, - "PostgreSQL RealTime: No database port found, using 5432 as default.\n"); - dbport = 5432; - } else { - dbport = atoi(s); - } + if (!(s = ast_variable_retrieve(config, "general", "dbname"))) { + ast_log(LOG_WARNING, + "PostgreSQL RealTime: No database name found, using 'asterisk' as default.\n"); + strcpy(dbname, "asterisk"); + } else { + ast_copy_string(dbname, s, sizeof(dbname)); + } - if (!(s = ast_variable_retrieve(config, "general", "dbappname"))) { - dbappname[0] = '\0'; - } else { - ast_copy_string(dbappname, s, sizeof(dbappname)); - } + if (!(s = ast_variable_retrieve(config, "general", "dbport"))) { + ast_log(LOG_WARNING, + "PostgreSQL RealTime: No database port found, using 5432 as default.\n"); + dbport = 5432; + } else { + dbport = atoi(s); + } - if (!ast_strlen_zero(dbhost)) { - /* No socket needed */ - } else if (!(s = ast_variable_retrieve(config, "general", "dbsock"))) { - ast_log(LOG_WARNING, - "PostgreSQL RealTime: No database socket found, using '/tmp/.s.PGSQL.%d' as default.\n", dbport); - strcpy(dbsock, "/tmp"); - } else { - ast_copy_string(dbsock, s, sizeof(dbsock)); - } + if (!(s = ast_variable_retrieve(config, "general", "dbappname"))) { + dbappname[0] = '\0'; + } else { + ast_copy_string(dbappname, s, sizeof(dbappname)); + } + + if (!ast_strlen_zero(dbhost)) { + /* No socket needed */ + } else if (!(s = ast_variable_retrieve(config, "general", "dbsock"))) { + ast_log(LOG_WARNING, + "PostgreSQL RealTime: No database socket found, using '/tmp/.s.PGSQL.%d' as default.\n", dbport); + strcpy(dbsock, "/tmp"); + } else { + ast_copy_string(dbsock, s, sizeof(dbsock)); + } + } if (!(s = ast_variable_retrieve(config, "general", "requirements"))) { ast_log(LOG_WARNING, @@ -1570,8 +1579,24 @@ static int pgsql_reconnect(const char *database) pgsqlConn = NULL; } - /* DB password can legitimately be 0-length */ - if ((!ast_strlen_zero(dbhost) || !ast_strlen_zero(dbsock)) && !ast_strlen_zero(dbuser) && !ast_strlen_zero(my_database)) { + if (!ast_strlen_zero(dburl)) { + pgsqlConn = PQconnectdb(dburl); + ast_debug(1, "pgsqlConn=%p\n", pgsqlConn); + if (pgsqlConn && PQstatus(pgsqlConn) == CONNECTION_OK) { + ast_debug(1, "PostgreSQL RealTime: Successfully connected to database.\n"); + connect_time = time(NULL); + version = PQserverVersion(pgsqlConn); + return 1; + } else { + ast_log(LOG_ERROR, + "PostgreSQL RealTime: Failed to connect database with dburl: [%s]: %s\n", + dburl, PQresultErrorMessage(NULL)); + return 0; + } + } + + /* DB password can legitimately be 0-length */ + if ((!ast_strlen_zero(dbhost) || !ast_strlen_zero(dbsock)) && !ast_strlen_zero(dbuser) && !ast_strlen_zero(my_database)) { struct ast_str *conn_info = ast_str_create(128); if (!conn_info) {