@ -3,21 +3,21 @@
*
* Copyright ( C ) 1999 - 2005 , Digium , Inc .
*
* Manuel Guesdon < mguesdon @ oxymium . net > - Postgre sql RealTime Driver Author / Adaptor
* Manuel Guesdon < mguesdon @ oxymium . net > - Postgre SQL RealTime Driver Author / Adaptor
* Mark Spencer < markster @ digium . com > - Asterisk Author
* Matthew Boehm < mboehm @ cytelcom . com > - MySQL RealTime Driver Author
*
* res_config_pgsql . c < Postgre sql plugin for RealTime configuration engine >
* res_config_pgsql . c < Postgre SQL plugin for RealTime configuration engine >
*
* v1 .0 - ( 07 - 11 - 05 ) - Initial version based on res_config_mysql v2 .0
*/
/*! \file
*
* \ brief Postgre sql plugin for Asterisk RealTime Architecture
* \ brief Postgre SQL plugin for Asterisk RealTime Architecture
*
* \ author Mark Spencer < markster @ digium . com >
* \ author Manuel Guesdon < mguesdon @ oxymium . net > - Postgre sql RealTime Driver Author / Adaptor
* \ author Manuel Guesdon < mguesdon @ oxymium . net > - Postgre SQL RealTime Driver Author / Adaptor
*
* \ arg http : //www.postgresql.org
*/
@ -64,16 +64,10 @@ static time_t connect_time = 0;
static int parse_config ( int reload ) ;
static int pgsql_reconnect ( const char * database ) ;
static int realtime_pgsql_status ( int fd , int argc , char * * argv ) ;
static const char cli_realtime_pgsql_status_usage [ ] =
" Usage: realtime pgsql status \n "
" Shows connection information for the Postgresql RealTime driver \n " ;
static char * handle_cli_realtime_pgsql_status ( struct ast_cli_entry * e , int cmd , struct ast_cli_args * a ) ;
static struct ast_cli_entry cli_realtime [ ] = {
{ { " realtime " , " pgsql " , " status " , NULL } ,
realtime_pgsql_status , " Shows connection information for the Postgresql RealTime driver " ,
cli_realtime_pgsql_status_usage } ,
NEW_CLI ( handle_cli_realtime_pgsql_status , " Shows connection information for the PostgreSQL RealTime driver " ) ,
} ;
static struct ast_variable * realtime_pgsql ( const char * database , const char * table , va_list ap )
@ -88,7 +82,7 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab
struct ast_variable * var = NULL , * prev = NULL ;
if ( ! table ) {
ast_log ( LOG_WARNING , " Postgre sql RealTime: No table specified.\n " ) ;
ast_log ( LOG_WARNING , " Postgre SQL RealTime: No table specified.\n " ) ;
return NULL ;
}
@ -97,7 +91,7 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab
newval = va_arg ( ap , const char * ) ;
if ( ! newparam | | ! newval ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n " ) ;
" Postgre SQL RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n " ) ;
if ( pgsqlConn ) {
PQfinish ( pgsqlConn ) ;
pgsqlConn = NULL ;
@ -131,9 +125,9 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab
if ( ! ( result = PQexec ( pgsqlConn , sql ) ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query Failed because: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
" Postgre SQL RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query Failed because: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
return NULL ;
} else {
@ -142,16 +136,16 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab
& & result_status ! = PGRES_TUPLES_OK
& & result_status ! = PGRES_NONFATAL_ERROR ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query Failed because: %s (%s)\n " ,
" Postgre SQL RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query Failed because: %s (%s)\n " ,
PQresultErrorMessage ( result ) , PQresStatus ( result_status ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
return NULL ;
}
}
ast_debug ( 1 , " 1Postgresql RealTime: Result=%p Query: %s\n " , result , sql ) ;
ast_debug ( 1 , " PostgreSQL RealTime: Result=%p Query: %s\n " , result , sql ) ;
if ( ( num_rows = PQntuples ( result ) ) > 0 ) {
int i = 0 ;
@ -159,7 +153,7 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab
int numFields = PQnfields ( result ) ;
char * * fieldnames = NULL ;
ast_debug ( 1 , " Postgre sql RealTime: Found %d rows.\n " , num_rows ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Found %d rows.\n " , num_rows ) ;
if ( ! ( fieldnames = ast_calloc ( 1 , numFields * sizeof ( char * ) ) ) ) {
ast_mutex_unlock ( & pgsql_lock ) ;
@ -189,7 +183,7 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab
ast_free ( fieldnames ) ;
} else {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Could not find any rows in table %s.\n " , table ) ;
" Postgre SQL RealTime: Could not find any rows in table %s.\n " , table ) ;
}
ast_mutex_unlock ( & pgsql_lock ) ;
@ -213,7 +207,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
struct ast_category * cat = NULL ;
if ( ! table ) {
ast_log ( LOG_WARNING , " Postgre sql RealTime: No table specified.\n " ) ;
ast_log ( LOG_WARNING , " Postgre SQL RealTime: No table specified.\n " ) ;
return NULL ;
}
@ -225,7 +219,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
newval = va_arg ( ap , const char * ) ;
if ( ! newparam | | ! newval ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n " ) ;
" Postgre SQL RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n " ) ;
if ( pgsqlConn ) {
PQfinish ( pgsqlConn ) ;
pgsqlConn = NULL ;
@ -273,9 +267,9 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
if ( ! ( result = PQexec ( pgsqlConn , sql ) ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query Failed because: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
" Postgre SQL RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query Failed because: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
return NULL ;
} else {
@ -284,16 +278,16 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
& & result_status ! = PGRES_TUPLES_OK
& & result_status ! = PGRES_NONFATAL_ERROR ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query Failed because: %s (%s)\n " ,
" Postgre SQL RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query Failed because: %s (%s)\n " ,
PQresultErrorMessage ( result ) , PQresStatus ( result_status ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
return NULL ;
}
}
ast_debug ( 1 , " 2Postgresql RealTime: Result=%p Query: %s\n " , result , sql ) ;
ast_debug ( 1 , " PostgreSQL RealTime: Result=%p Query: %s\n " , result , sql ) ;
if ( ( num_rows = PQntuples ( result ) ) > 0 ) {
int numFields = PQnfields ( result ) ;
@ -301,7 +295,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
int rowIndex = 0 ;
char * * fieldnames = NULL ;
ast_debug ( 1 , " Postgre sql RealTime: Found %d rows.\n " , num_rows ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Found %d rows.\n " , num_rows ) ;
if ( ! ( fieldnames = ast_calloc ( 1 , numFields * sizeof ( char * ) ) ) ) {
ast_mutex_unlock ( & pgsql_lock ) ;
@ -333,7 +327,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
ast_free ( fieldnames ) ;
} else {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Could not find any rows in table %s.\n " , table ) ;
" Postgre SQL RealTime: Could not find any rows in table %s.\n " , table ) ;
}
ast_mutex_unlock ( & pgsql_lock ) ;
@ -351,7 +345,7 @@ static int update_pgsql(const char *database, const char *table, const char *key
const char * newparam , * newval ;
if ( ! table ) {
ast_log ( LOG_WARNING , " Postgre sql RealTime: No table specified.\n " ) ;
ast_log ( LOG_WARNING , " Postgre SQL RealTime: No table specified.\n " ) ;
return - 1 ;
}
@ -360,7 +354,7 @@ static int update_pgsql(const char *database, const char *table, const char *key
newval = va_arg ( ap , const char * ) ;
if ( ! newparam | | ! newval ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n " ) ;
" Postgre SQL RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n " ) ;
if ( pgsqlConn ) {
PQfinish ( pgsqlConn ) ;
pgsqlConn = NULL ;
@ -381,7 +375,7 @@ static int update_pgsql(const char *database, const char *table, const char *key
snprintf ( sql + strlen ( sql ) , sizeof ( sql ) - strlen ( sql ) , " WHERE %s = '%s' " , keyfield ,
lookup ) ;
ast_debug ( 1 , " Postgre sql RealTime: Update SQL: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Update SQL: %s\n " , sql ) ;
/* We now have our complete statement; Lets connect to the server and execute it. */
ast_mutex_lock ( & pgsql_lock ) ;
@ -392,9 +386,9 @@ static int update_pgsql(const char *database, const char *table, const char *key
if ( ! ( result = PQexec ( pgsqlConn , sql ) ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query Failed because: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
" Postgre SQL RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query Failed because: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
return - 1 ;
} else {
@ -403,9 +397,9 @@ static int update_pgsql(const char *database, const char *table, const char *key
& & result_status ! = PGRES_TUPLES_OK
& & result_status ! = PGRES_NONFATAL_ERROR ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query Failed because: %s (%s)\n " ,
" Postgre SQL RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query Failed because: %s (%s)\n " ,
PQresultErrorMessage ( result ) , PQresStatus ( result_status ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
return - 1 ;
@ -415,7 +409,7 @@ static int update_pgsql(const char *database, const char *table, const char *key
numrows = atoi ( PQcmdTuples ( result ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
ast_debug ( 1 , " Postgre sql RealTime: Updated %d rows on table: %s\n " , numrows , table ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Updated %d rows on table: %s\n " , numrows , table ) ;
/* From http://dev.pgsql.com/doc/pgsql/en/pgsql-affected-rows.html
* An integer greater than zero indicates the number of rows affected
@ -441,7 +435,7 @@ static int store_pgsql(const char *database, const char *table, va_list ap)
const char * newparam , * newval ;
if ( ! table ) {
ast_log ( LOG_WARNING , " Postgre sql RealTime: No table specified.\n " ) ;
ast_log ( LOG_WARNING , " Postgre SQL RealTime: No table specified.\n " ) ;
return - 1 ;
}
@ -450,7 +444,7 @@ static int store_pgsql(const char *database, const char *table, va_list ap)
newval = va_arg ( ap , const char * ) ;
if ( ! newparam | | ! newval ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Realtime storage requires at least 1 parameter and 1 value to store.\n " ) ;
" Postgre SQL RealTime: Realtime storage requires at least 1 parameter and 1 value to store.\n " ) ;
if ( pgsqlConn ) {
PQfinish ( pgsqlConn ) ;
pgsqlConn = NULL ;
@ -481,13 +475,13 @@ static int store_pgsql(const char *database, const char *table, va_list ap)
va_end ( ap ) ;
snprintf ( sql , sizeof ( sql ) , " INSERT INTO (%s) VALUES (%s) " , params , vals ) ;
ast_debug ( 1 , " Postgre sql RealTime: Insert SQL: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Insert SQL: %s\n " , sql ) ;
if ( ! ( result = PQexec ( pgsqlConn , sql ) ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query Failed because: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
" Postgre SQL RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query Failed because: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
return - 1 ;
} else {
@ -496,9 +490,9 @@ static int store_pgsql(const char *database, const char *table, va_list ap)
& & result_status ! = PGRES_TUPLES_OK
& & result_status ! = PGRES_NONFATAL_ERROR ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query Failed because: %s (%s)\n " ,
" Postgre SQL RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query Failed because: %s (%s)\n " ,
PQresultErrorMessage ( result ) , PQresStatus ( result_status ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
return - 1 ;
@ -508,7 +502,7 @@ static int store_pgsql(const char *database, const char *table, va_list ap)
insertid = PQoidValue ( result ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
ast_debug ( 1 , " Postgre sql RealTime: row inserted on table: %s, id: %u\n " , table , insertid ) ;
ast_debug ( 1 , " Postgre SQL RealTime: row inserted on table: %s, id: %u\n " , table , insertid ) ;
/* From http://dev.pgsql.com/doc/pgsql/en/pgsql-affected-rows.html
* An integer greater than zero indicates the number of rows affected
@ -532,7 +526,7 @@ static int destroy_pgsql(const char *database, const char *table, const char *ke
const char * newparam , * newval ;
if ( ! table ) {
ast_log ( LOG_WARNING , " Postgre sql RealTime: No table specified.\n " ) ;
ast_log ( LOG_WARNING , " Postgre SQL RealTime: No table specified.\n " ) ;
return - 1 ;
}
@ -542,7 +536,7 @@ static int destroy_pgsql(const char *database, const char *table, const char *ke
if ( ! newparam | | ! newval ) { */
if ( ast_strlen_zero ( keyfield ) | | ast_strlen_zero ( lookup ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Realtime destroy requires at least 1 parameter and 1 value to search on.\n " ) ;
" Postgre SQL RealTime: Realtime destroy requires at least 1 parameter and 1 value to search on.\n " ) ;
if ( pgsqlConn ) {
PQfinish ( pgsqlConn ) ;
pgsqlConn = NULL ;
@ -572,13 +566,13 @@ static int destroy_pgsql(const char *database, const char *table, const char *ke
}
va_end ( ap ) ;
ast_debug ( 1 , " Postgre sql RealTime: Delete SQL: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Delete SQL: %s\n " , sql ) ;
if ( ! ( result = PQexec ( pgsqlConn , sql ) ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query Failed because: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
" Postgre SQL RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query Failed because: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
return - 1 ;
} else {
@ -587,9 +581,9 @@ static int destroy_pgsql(const char *database, const char *table, const char *ke
& & result_status ! = PGRES_TUPLES_OK
& & result_status ! = PGRES_NONFATAL_ERROR ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query Failed because: %s (%s)\n " ,
" Postgre SQL RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query Failed because: %s (%s)\n " ,
PQresultErrorMessage ( result ) , PQresStatus ( result_status ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
return - 1 ;
@ -599,7 +593,7 @@ static int destroy_pgsql(const char *database, const char *table, const char *ke
numrows = atoi ( PQcmdTuples ( result ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
ast_debug ( 1 , " Postgre sql RealTime: Deleted %d rows on table: %s\n " , numrows , table ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Deleted %d rows on table: %s\n " , numrows , table ) ;
/* From http://dev.pgsql.com/doc/pgsql/en/pgsql-affected-rows.html
* An integer greater than zero indicates the number of rows affected
@ -631,7 +625,7 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
last [ 0 ] = ' \0 ' ;
if ( ! file | | ! strcmp ( file , RES_CONFIG_PGSQL_CONF ) ) {
ast_log ( LOG_WARNING , " Postgre sql RealTime: Cannot configure myself.\n " ) ;
ast_log ( LOG_WARNING , " Postgre SQL RealTime: Cannot configure myself.\n " ) ;
return NULL ;
}
@ -639,7 +633,7 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
ast_build_string ( & sql , & sqlleft , " WHERE filename='%s' and commented=0 " , file ) ;
ast_build_string ( & sql , & sqlleft , " ORDER BY cat_metric DESC, var_metric ASC, category, var_name " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Static SQL: %s\n " , sqlbuf ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Static SQL: %s\n " , sqlbuf ) ;
/* We now have our complete statement; Lets connect to the server and execute it. */
ast_mutex_lock ( & pgsql_lock ) ;
@ -650,9 +644,9 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
if ( ! ( result = PQexec ( pgsqlConn , sqlbuf ) ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query Failed because: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
" Postgre SQL RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query Failed because: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
return NULL ;
} else {
@ -661,9 +655,9 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
& & result_status ! = PGRES_TUPLES_OK
& & result_status ! = PGRES_NONFATAL_ERROR ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre sql RealTime: Query Failed because: %s (%s)\n " ,
" Postgre SQL RealTime: Failed to query database. Check debug for more info.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query: %s\n " , sql ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Query Failed because: %s (%s)\n " ,
PQresultErrorMessage ( result ) , PQresStatus ( result_status ) ) ;
ast_mutex_unlock ( & pgsql_lock ) ;
return NULL ;
@ -673,7 +667,7 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
if ( ( num_rows = PQntuples ( result ) ) > 0 ) {
int rowIndex = 0 ;
ast_debug ( 1 , " Postgre sql RealTime: Found %ld rows.\n " , num_rows ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Found %ld rows.\n " , num_rows ) ;
for ( rowIndex = 0 ; rowIndex < num_rows ; rowIndex + + ) {
char * field_category = PQgetvalue ( result , rowIndex , 0 ) ;
@ -702,7 +696,7 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
}
} else {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Could not find config '%s' in database.\n " , file ) ;
" Postgre SQL RealTime: Could not find config '%s' in database.\n " , file ) ;
}
PQclear ( result ) ;
@ -727,7 +721,7 @@ static int load_module(void)
return AST_MODULE_LOAD_DECLINE ;
ast_config_engine_register ( & pgsql_engine ) ;
ast_verb ( 1 , " Postgre sql RealTime driver loaded.\n " ) ;
ast_verb ( 1 , " Postgre SQL RealTime driver loaded.\n " ) ;
ast_cli_register_multiple ( cli_realtime , sizeof ( cli_realtime ) / sizeof ( struct ast_cli_entry ) ) ;
return 0 ;
@ -744,7 +738,7 @@ static int unload_module(void)
}
ast_cli_unregister_multiple ( cli_realtime , sizeof ( cli_realtime ) / sizeof ( struct ast_cli_entry ) ) ;
ast_config_engine_deregister ( & pgsql_engine ) ;
ast_verb ( 1 , " Postgre sql RealTime unloaded.\n " ) ;
ast_verb ( 1 , " Postgre SQL RealTime unloaded.\n " ) ;
/* Unlock so something else can destroy the lock. */
ast_mutex_unlock ( & pgsql_lock ) ;
@ -782,7 +776,7 @@ static int parse_config(int reload)
if ( ! ( s = ast_variable_retrieve ( config , " general " , " dbuser " ) ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: No database user found, using 'asterisk' as default.\n " ) ;
" Postgre SQL RealTime: No database user found, using 'asterisk' as default.\n " ) ;
strcpy ( dbuser , " asterisk " ) ;
} else {
ast_copy_string ( dbuser , s , sizeof ( dbuser ) ) ;
@ -790,7 +784,7 @@ static int parse_config(int reload)
if ( ! ( s = ast_variable_retrieve ( config , " general " , " dbpass " ) ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: No database password found, using 'asterisk' as default.\n " ) ;
" Postgre SQL RealTime: No database password found, using 'asterisk' as default.\n " ) ;
strcpy ( dbpass , " asterisk " ) ;
} else {
ast_copy_string ( dbpass , s , sizeof ( dbpass ) ) ;
@ -798,7 +792,7 @@ static int parse_config(int reload)
if ( ! ( s = ast_variable_retrieve ( config , " general " , " dbhost " ) ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: No database host found, using localhost via socket.\n " ) ;
" Postgre SQL RealTime: No database host found, using localhost via socket.\n " ) ;
dbhost [ 0 ] = ' \0 ' ;
} else {
ast_copy_string ( dbhost , s , sizeof ( dbhost ) ) ;
@ -806,7 +800,7 @@ static int parse_config(int reload)
if ( ! ( s = ast_variable_retrieve ( config , " general " , " dbname " ) ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: No database name found, using 'asterisk' as default.\n " ) ;
" Postgre SQL RealTime: No database name found, using 'asterisk' as default.\n " ) ;
strcpy ( dbname , " asterisk " ) ;
} else {
ast_copy_string ( dbname , s , sizeof ( dbname ) ) ;
@ -814,7 +808,7 @@ static int parse_config(int reload)
if ( ! ( s = ast_variable_retrieve ( config , " general " , " dbport " ) ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: No database port found, using 5432 as default.\n " ) ;
" Postgre SQL RealTime: No database port found, using 5432 as default.\n " ) ;
dbport = 5432 ;
} else {
dbport = atoi ( s ) ;
@ -822,7 +816,7 @@ static int parse_config(int reload)
if ( ! ast_strlen_zero ( dbhost ) & & ! ( s = ast_variable_retrieve ( config , " general " , " dbsock " ) ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: No database socket found, using '/tmp/pgsql.sock' as default.\n " ) ;
" Postgre SQL RealTime: No database socket found, using '/tmp/pgsql.sock' as default.\n " ) ;
strcpy ( dbsock , " /tmp/pgsql.sock " ) ;
} else {
ast_copy_string ( dbsock , s , sizeof ( dbsock ) ) ;
@ -831,23 +825,23 @@ static int parse_config(int reload)
if ( option_debug ) {
if ( ! ast_strlen_zero ( dbhost ) ) {
ast_debug ( 1 , " Postgre sql RealTime Host: %s\n " , dbhost ) ;
ast_debug ( 1 , " Postgre sql RealTime Port: %i\n " , dbport ) ;
ast_debug ( 1 , " Postgre SQL RealTime Host: %s\n " , dbhost ) ;
ast_debug ( 1 , " Postgre SQL RealTime Port: %i\n " , dbport ) ;
} else {
ast_debug ( 1 , " Postgre sql RealTime Socket: %s\n " , dbsock ) ;
ast_debug ( 1 , " Postgre SQL RealTime Socket: %s\n " , dbsock ) ;
}
ast_debug ( 1 , " Postgre sql RealTime User: %s\n " , dbuser ) ;
ast_debug ( 1 , " Postgre sql RealTime Password: %s\n " , dbpass ) ;
ast_debug ( 1 , " Postgre sql RealTime DBName: %s\n " , dbname ) ;
ast_debug ( 1 , " Postgre SQL RealTime User: %s\n " , dbuser ) ;
ast_debug ( 1 , " Postgre SQL RealTime Password: %s\n " , dbpass ) ;
ast_debug ( 1 , " Postgre SQL RealTime DBName: %s\n " , dbname ) ;
}
if ( ! pgsql_reconnect ( NULL ) ) {
ast_log ( LOG_WARNING ,
" Postgre sql RealTime: Couldn't establish connection. Check debug.\n " ) ;
ast_debug ( 1 , " Postgre sql RealTime: Cannot Connect: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
" Postgre SQL RealTime: Couldn't establish connection. Check debug.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Cannot Connect: %s\n " , PQerrorMessage ( pgsqlConn ) ) ;
}
ast_verb ( 2 , " Postgre sql RealTime reloaded.\n " ) ;
ast_verb ( 2 , " Postgre SQL RealTime reloaded.\n " ) ;
/* Done reloading. Release lock so others can now use driver. */
ast_mutex_unlock ( & pgsql_lock ) ;
@ -887,61 +881,72 @@ static int pgsql_reconnect(const char *database)
connInfo = NULL ;
ast_debug ( 1 , " pgsqlConn=%p \n " , pgsqlConn ) ;
if ( pgsqlConn & & PQstatus ( pgsqlConn ) = = CONNECTION_OK ) {
ast_debug ( 1 , " Postgre sql RealTime: Successfully connected to database.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Successfully connected to database.\n " ) ;
connect_time = time ( NULL ) ;
return 1 ;
} else {
ast_log ( LOG_ERROR ,
" Postgre sql RealTime: Failed to connect database server %s on %s. Check debug for more info.\n " ,
" Postgre SQL RealTime: Failed to connect database server %s on %s. Check debug for more info.\n " ,
dbname , dbhost ) ;
ast_debug ( 1 , " Postgre sql RealTime: Cannot Connect: %s\n " , PQresultErrorMessage ( NULL ) ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Cannot Connect: %s\n " , PQresultErrorMessage ( NULL ) ) ;
return 0 ;
}
} else {
ast_debug ( 1 , " Postgre sql RealTime: Everything is fine.\n " ) ;
ast_debug ( 1 , " Postgre SQL RealTime: Everything is fine.\n " ) ;
return 1 ;
}
}
static int realtime_pgsql_status ( int fd , int argc , char * * argv )
static char * handle_cli_realtime_pgsql_status ( struct ast_cli_entry * e , int cmd , struct ast_cli_args * a )
{
char status [ 256 ] , status2 [ 100 ] = " " ;
int ctime = time ( NULL ) - connect_time ;
switch ( cmd ) {
case CLI_INIT :
e - > command = " realtime pgsql status " ;
e - > usage =
" Usage: realtime pgsql status \n "
" Shows connection information for the PostgreSQL RealTime driver \n " ;
return NULL ;
case CLI_GENERATE :
return NULL ;
}
if ( a - > argc ! = 3 )
return CLI_SHOWUSAGE ;
if ( pgsqlConn & & PQstatus ( pgsqlConn ) = = CONNECTION_OK ) {
if ( ! ast_strlen_zero ( dbhost ) ) {
if ( ! ast_strlen_zero ( dbhost ) )
snprintf ( status , 255 , " Connected to %s@%s, port %d " , dbname , dbhost , dbport ) ;
} else if ( ! ast_strlen_zero ( dbsock ) ) {
else if ( ! ast_strlen_zero ( dbsock ) )
snprintf ( status , 255 , " Connected to %s on socket file %s " , dbname , dbsock ) ;
} else {
else
snprintf ( status , 255 , " Connected to %s@%s " , dbname , dbhost ) ;
}
if ( ! ast_strlen_zero ( dbuser ) ) {
if ( ! ast_strlen_zero ( dbuser ) )
snprintf ( status2 , 99 , " with username %s " , dbuser ) ;
}
if ( ctime > 31536000 ) {
ast_cli ( fd, " %s%s for %d years, %d days, %d hours, %d minutes, %d seconds. \n " ,
if ( ctime > 31536000 )
ast_cli ( a- > fd, " %s%s for %d years, %d days, %d hours, %d minutes, %d seconds. \n " ,
status , status2 , ctime / 31536000 , ( ctime % 31536000 ) / 86400 ,
( ctime % 86400 ) / 3600 , ( ctime % 3600 ) / 60 , ctime % 60 ) ;
} else if ( ctime > 86400 ) {
ast_cli ( fd, " %s%s for %d days, %d hours, %d minutes, %d seconds. \n " , status ,
else if ( ctime > 86400 )
ast_cli ( a- > fd, " %s%s for %d days, %d hours, %d minutes, %d seconds. \n " , status ,
status2 , ctime / 86400 , ( ctime % 86400 ) / 3600 , ( ctime % 3600 ) / 60 ,
ctime % 60 ) ;
} else if ( ctime > 3600 ) {
ast_cli ( fd, " %s%s for %d hours, %d minutes, %d seconds. \n " , status , status2 ,
else if ( ctime > 3600 )
ast_cli ( a- > fd, " %s%s for %d hours, %d minutes, %d seconds. \n " , status , status2 ,
ctime / 3600 , ( ctime % 3600 ) / 60 , ctime % 60 ) ;
} else if ( ctime > 60 ) {
ast_cli ( fd, " %s%s for %d minutes, %d seconds. \n " , status , status2 , ctime / 60 ,
else if ( ctime > 60 )
ast_cli ( a- > fd, " %s%s for %d minutes, %d seconds. \n " , status , status2 , ctime / 60 ,
ctime % 60 ) ;
} else {
ast_cli ( fd , " %s%s for %d seconds. \n " , status , status2 , ctime ) ;
}
else
ast_cli ( a - > fd , " %s%s for %d seconds. \n " , status , status2 , ctime ) ;
return RESULT _SUCCESS;
return CLI _SUCCESS;
} else {
return RESULT _FAILURE;
return CLI _FAILURE;
}
}