clean up formatting to conform to coding guidelines and fix some typos (issue #6260)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@8407 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Russell Bryant
2006-01-21 21:29:06 +00:00
parent 475b2cc0cf
commit a163eaa03c
2 changed files with 301 additions and 313 deletions

View File

@@ -30,7 +30,7 @@ APPS=app_adsiprog.so app_alarmreceiver.so app_authenticate.so app_cdr.so \
# #
# Obsolete things... # Obsolete things...
# #
#APPS+=app_sql_postgres.so APPS+=app_sql_postgres.so
#APPS+=app_sql_odbc.so #APPS+=app_sql_odbc.so
# #
@@ -96,7 +96,7 @@ app_curl.so: app_curl.o
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} $(CURLLIBS) $(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} $(CURLLIBS)
app_sql_postgres.o: app_sql_postgres.c app_sql_postgres.o: app_sql_postgres.c
$(CC) -pipe -I/usr/local/pgsql/include $(CFLAGS) -c -o app_sql_postgres.o app_sql_postgres.c $(CC) -pipe -I$(CROSS_COMPILE_TARGET)/usr/local/pgsql/include -I$(CROSS_COMPILE_TARGET)/usr/include/postgresql $(CFLAGS) -c -o app_sql_postgres.o app_sql_postgres.c
app_sql_postgres.so: app_sql_postgres.o app_sql_postgres.so: app_sql_postgres.o
$(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} -L/usr/local/pgsql/lib -lpq $(CC) $(SOLINK) -o $@ ${CYGSOLINK} $< ${CYGSOLIB} -L/usr/local/pgsql/lib -lpq

View File

@@ -21,7 +21,7 @@
* \brief Connect to PostgreSQL * \brief Connect to PostgreSQL
* *
* \author Christos Ricudis <ricudis@itc.auth.gr> * \author Christos Ricudis <ricudis@itc.auth.gr>
* *
* \ingroup applications * \ingroup applications
*/ */
@@ -53,65 +53,65 @@ static char *app = "PGSQL";
static char *synopsis = "Do several SQLy things"; static char *synopsis = "Do several SQLy things";
static char *descrip = static char *descrip =
"PGSQL(): Do several SQLy things\n" "PGSQL(): Do several SQLy things\n"
"Syntax:\n" "Syntax:\n"
" PGSQL(Connect var option-string)\n" " PGSQL(Connect var option-string)\n"
" Connects to a database. Option string contains standard PostgreSQL\n" " Connects to a database. Option string contains standard PostgreSQL\n"
" parameters like host=, dbname=, user=. Connection identifer returned\n" " parameters like host=, dbname=, user=. Connection identifier returned\n"
" in ${var}\n" " in ${var}.\n"
" PGSQL(Query var ${connection_identifier} query-string)\n" " PGSQL(Query var ${connection_identifier} query-string)\n"
" Executes standard SQL query contained in query-string using established\n" " Executes standard SQL query contained in query-string using established\n"
" connection identified by ${connection_identifier}. Reseult of query is\n" " connection identified by ${connection_identifier}. Result of query is\n"
" is stored in ${var}.\n" " stored in ${var}.\n"
" PGSQL(Fetch statusvar ${result_identifier} var1 var2 ... varn)\n" " PGSQL(Fetch statusvar ${result_identifier} var1 var2 ... varn)\n"
" Fetches a single row from a result set contained in ${result_identifier}.\n" " Fetches a single row from a result set contained in ${result_identifier}.\n"
" Assigns returned fields to ${var1} ... ${varn}. ${statusvar} is set TRUE\n" " Assigns returned fields to ${var1} ... ${varn}. ${statusvar} is set TRUE\n"
" if additional rows exist in reseult set.\n" " if additional rows exist in result set.\n"
" PGSQL(Clear ${result_identifier})\n" " PGSQL(Clear ${result_identifier})\n"
" Frees memory and datastructures associated with result set.\n" " Frees memory and data structures associated with result set.\n"
" PGSQL(Disconnect ${connection_identifier})\n" " PGSQL(Disconnect ${connection_identifier})\n"
" Disconnects from named connection to PostgreSQL.\n" ; " Disconnects from named connection to PostgreSQL.\n" ;
/* /*
Syntax of SQL commands : Syntax of SQL commands :
Connect var option-string Connect var option-string
Connects to a database using the option-string and stores the Connects to a database using the option-string and stores the
connection identifier in ${var} connection identifier in ${var}
Query var ${connection_identifier} query-string Query var ${connection_identifier} query-string
Submits query-string to database backend and stores the result Submits query-string to database backend and stores the result
identifier in ${var} identifier in ${var}
Fetch statusvar ${result_identifier} var1 var2 var3 ... varn Fetch statusvar ${result_identifier} var1 var2 var3 ... varn
Fetches a row from the query and stores end-of-table status in Fetches a row from the query and stores end-of-table status in
${statusvar} and columns in ${var1}..${varn} ${statusvar} and columns in ${var1} ... ${varn}
Clear ${result_identifier} Clear ${result_identifier}
Clears data structures associated with ${result_identifier} Clears data structures associated with ${result_identifier}
Disconnect ${connection_identifier} Disconnect ${connection_identifier}
Disconnects from named connection Disconnects from named connection
EXAMPLES OF USE : EXAMPLES OF USE :
exten => s,2,PGSQL(Connect connid host=localhost user=asterisk dbname=credit) exten => s,2,PGSQL(Connect connid host=localhost user=asterisk dbname=credit)
exten => s,3,PGSQL(Query resultid ${connid} SELECT username,credit FROM credit WHERE callerid=${CALLERIDNUM}) exten => s,3,PGSQL(Query resultid ${connid} SELECT username,credit FROM credit WHERE callerid=${CALLERIDNUM})
exten => s,4,PGSQL(Fetch fetchid ${resultid} datavar1 datavar2) exten => s,4,PGSQL(Fetch fetchid ${resultid} datavar1 datavar2)
exten => s,5,GotoIf(${fetchid}?6:8) exten => s,5,GotoIf(${fetchid}?6:8)
exten => s,6,Festival("User ${datavar1} currently has credit balance of ${datavar2} dollars.") exten => s,6,Festival("User ${datavar1} currently has credit balance of ${datavar2} dollars.")
exten => s,7,Goto(s,4) exten => s,7,Goto(s,4)
exten => s,8,PGSQL(Clear ${resultid}) exten => s,8,PGSQL(Clear ${resultid})
exten => s,9,PGSQL(Disconnect ${connid}) exten => s,9,PGSQL(Disconnect ${connid})
@@ -128,378 +128,373 @@ LOCAL_USER_DECL;
#define AST_PGSQL_ID_FETCHID 3 #define AST_PGSQL_ID_FETCHID 3
struct ast_PGSQL_id { struct ast_PGSQL_id {
int identifier_type; /* 0=dummy, 1=connid, 2=resultid */ int identifier_type; /* 0 = dummy, 1 = connid, 2 = resultid */
int identifier; int identifier;
void *data; void *data;
AST_LIST_ENTRY(ast_PGSQL_id) entries; AST_LIST_ENTRY(ast_PGSQL_id) entries;
} *ast_PGSQL_id; } *ast_PGSQL_id;
AST_LIST_HEAD(PGSQLidshead,ast_PGSQL_id) PGSQLidshead; AST_LIST_HEAD(PGSQLidshead, ast_PGSQL_id) PGSQLidshead;
static void *find_identifier(int identifier,int identifier_type) { static void *find_identifier(int identifier, int identifier_type)
{
struct PGSQLidshead *headp; struct PGSQLidshead *headp;
struct ast_PGSQL_id *i; struct ast_PGSQL_id *i;
void *res=NULL; void *res = NULL;
int found=0; int found = 0;
headp=&PGSQLidshead; headp = &PGSQLidshead;
if (AST_LIST_LOCK(headp)) { if (AST_LIST_LOCK(headp)) {
ast_log(LOG_WARNING,"Unable to lock identifiers list\n"); ast_log(LOG_WARNING, "Unable to lock identifiers list\n");
} else { } else {
AST_LIST_TRAVERSE(headp,i,entries) { AST_LIST_TRAVERSE(headp, i, entries) {
if ((i->identifier==identifier) && (i->identifier_type==identifier_type)) { if ((i->identifier == identifier) && (i->identifier_type == identifier_type)) {
found=1; found = 1;
res=i->data; res = i->data;
break; break;
} }
} }
if (!found) { if (!found) {
ast_log(LOG_WARNING,"Identifier %d, identifier_type %d not found in identifier list\n",identifier,identifier_type); ast_log(LOG_WARNING, "Identifier %d, identifier_type %d not found in identifier list\n", identifier, identifier_type);
} }
AST_LIST_UNLOCK(headp); AST_LIST_UNLOCK(headp);
} }
return(res); return res;
} }
static int add_identifier(int identifier_type,void *data) { static int add_identifier(int identifier_type, void *data)
struct ast_PGSQL_id *i,*j; {
struct ast_PGSQL_id *i, *j;
struct PGSQLidshead *headp; struct PGSQLidshead *headp;
int maxidentifier=0; int maxidentifier = 0;
headp=&PGSQLidshead; headp = &PGSQLidshead;
i=NULL; i = NULL;
j=NULL; j = NULL;
if (AST_LIST_LOCK(headp)) { if (AST_LIST_LOCK(headp)) {
ast_log(LOG_WARNING,"Unable to lock identifiers list\n"); ast_log(LOG_WARNING, "Unable to lock identifiers list\n");
return(-1); return -1;
} else { } else {
i=malloc(sizeof(struct ast_PGSQL_id)); i = malloc(sizeof(struct ast_PGSQL_id));
AST_LIST_TRAVERSE(headp,j,entries) { AST_LIST_TRAVERSE(headp, j, entries) {
if (j->identifier>maxidentifier) { if (j->identifier > maxidentifier) {
maxidentifier=j->identifier; maxidentifier = j->identifier;
} }
} }
i->identifier=maxidentifier+1; i->identifier = maxidentifier + 1;
i->identifier_type=identifier_type; i->identifier_type = identifier_type;
i->data=data; i->data = data;
AST_LIST_INSERT_HEAD(headp,i,entries); AST_LIST_INSERT_HEAD(headp, i, entries);
AST_LIST_UNLOCK(headp); AST_LIST_UNLOCK(headp);
} }
return(i->identifier);
return i->identifier;
} }
static int del_identifier(int identifier,int identifier_type) { static int del_identifier(int identifier, int identifier_type)
{
struct ast_PGSQL_id *i; struct ast_PGSQL_id *i;
struct PGSQLidshead *headp; struct PGSQLidshead *headp;
int found=0; int found = 0;
headp=&PGSQLidshead; headp = &PGSQLidshead;
if (AST_LIST_LOCK(headp)) { if (AST_LIST_LOCK(headp)) {
ast_log(LOG_WARNING,"Unable to lock identifiers list\n"); ast_log(LOG_WARNING, "Unable to lock identifiers list\n");
} else { } else {
AST_LIST_TRAVERSE(headp,i,entries) { AST_LIST_TRAVERSE(headp, i, entries) {
if ((i->identifier==identifier) && if ((i->identifier == identifier) && (i->identifier_type == identifier_type)) {
(i->identifier_type==identifier_type)) { AST_LIST_REMOVE(headp, i, entries);
AST_LIST_REMOVE(headp,i,entries);
free(i); free(i);
found=1; found = 1;
break; break;
} }
} }
AST_LIST_UNLOCK(headp); AST_LIST_UNLOCK(headp);
} }
if (found==0) { if (!found) {
ast_log(LOG_WARNING,"Could not find identifier %d, identifier_type %d in list to delete\n",identifier,identifier_type); ast_log(LOG_WARNING, "Could not find identifier %d, identifier_type %d in list to delete\n", identifier, identifier_type);
return(-1); return -1;
} else { } else {
return(0); return 0;
} }
} }
static int aPGSQL_connect(struct ast_channel *chan, void *data) { static int aPGSQL_connect(struct ast_channel *chan, void *data)
{
char *s1; char *s1;
char s[100] = ""; char s[100] = "";
char *optionstring; char *optionstring;
char *var; char *var;
int l; int l;
int res; int res;
PGconn *karoto; PGconn *PGSQLconn;
int id; int id;
char *stringp=NULL; char *stringp = NULL;
res = 0;
res=0; l = strlen(data) + 2;
l=strlen(data)+2; s1 = malloc(l);
s1=malloc(l); strncpy(s1, data, l - 1);
strncpy(s1, data, l -1); stringp = s1;
stringp=s1; strsep(&stringp, " "); /* eat the first token, we already know it :P */
strsep(&stringp," "); /* eat the first token, we already know it :P */ var = strsep(&stringp, " ");
var=strsep(&stringp," "); optionstring = strsep(&stringp, "\n");
optionstring=strsep(&stringp,"\n");
PGSQLconn = PQconnectdb(optionstring);
karoto = PQconnectdb(optionstring); if (PQstatus(PGSQLconn) == CONNECTION_BAD) {
if (PQstatus(karoto) == CONNECTION_BAD) { ast_log(LOG_WARNING, "Connection to database using '%s' failed. postgress reports : %s\n", optionstring, PQerrorMessage(PGSQLconn));
ast_log(LOG_WARNING,"Connection to database using '%s' failed. postgress reports : %s\n", optionstring, res = -1;
PQerrorMessage(karoto)); } else {
res=-1; ast_log(LOG_WARNING, "Adding identifier\n");
} else { id = add_identifier(AST_PGSQL_ID_CONNID, PGSQLconn);
ast_log(LOG_WARNING,"adding identifier\n");
id=add_identifier(AST_PGSQL_ID_CONNID,karoto);
snprintf(s, sizeof(s), "%d", id); snprintf(s, sizeof(s), "%d", id);
pbx_builtin_setvar_helper(chan,var,s); pbx_builtin_setvar_helper(chan, var, s);
} }
free(s1); free(s1);
return res; return res;
} }
static int aPGSQL_query(struct ast_channel *chan, void *data) { static int aPGSQL_query(struct ast_channel *chan, void *data)
{
char *s1, *s2, *s3, *s4;
char *s1,*s2,*s3,*s4;
char s[100] = ""; char s[100] = "";
char *querystring; char *querystring;
char *var; char *var;
int l; int l;
int res,nres; int res, nres;
PGconn *karoto; PGconn *PGSQLconn;
PGresult *PGSQLres; PGresult *PGSQLres;
int id,id1; int id, id1;
char *stringp=NULL; char *stringp = NULL;
res = 0;
res=0; l = strlen(data) + 2;
l=strlen(data)+2; s1 = malloc(l);
s1=malloc(l); s2 = malloc(l);
s2=malloc(l);
strncpy(s1, data, l - 1); strncpy(s1, data, l - 1);
stringp=s1; stringp = s1;
strsep(&stringp," "); /* eat the first token, we already know it :P */ strsep(&stringp, " "); /* eat the first token, we already know it :P */
s3=strsep(&stringp," "); s3 = strsep(&stringp, " ");
while (1) { /* ugly trick to make branches with break; */ while (1) { /* ugly trick to make branches with break; */
var=s3; var = s3;
s4=strsep(&stringp," "); s4 = strsep(&stringp, " ");
id=atoi(s4); id = atoi(s4);
querystring=strsep(&stringp,"\n"); querystring = strsep(&stringp, "\n");
if ((karoto=find_identifier(id,AST_PGSQL_ID_CONNID))==NULL) { if (!(PGSQLconn = find_identifier(id, AST_PGSQL_ID_CONNID))) {
ast_log(LOG_WARNING,"Invalid connection identifier %d passed in aPGSQL_query\n",id); ast_log(LOG_WARNING, "Invalid connection identifier %d passed in aPGSQL_query\n", id);
res=-1; res = -1;
break; break;
} }
PGSQLres=PQexec(karoto,querystring); if (!(PGSQLres = PQexec(PGSQLconn, querystring))) {
if (PGSQLres==NULL) { ast_log(LOG_WARNING, "aPGSQL_query: Connection Error (connection identifier = %d, error message : %s)\n", id, PQerrorMessage(PGSQLconn));
ast_log(LOG_WARNING,"aPGSQL_query: Connection Error (connection identifier = %d, error message : %s)\n",id,PQerrorMessage(karoto)); res = -1;
res=-1;
break; break;
} }
if (PQresultStatus(PGSQLres) == PGRES_BAD_RESPONSE || if (PQresultStatus(PGSQLres) == PGRES_BAD_RESPONSE ||
PQresultStatus(PGSQLres) == PGRES_NONFATAL_ERROR || PQresultStatus(PGSQLres) == PGRES_NONFATAL_ERROR ||
PQresultStatus(PGSQLres) == PGRES_FATAL_ERROR) { PQresultStatus(PGSQLres) == PGRES_FATAL_ERROR) {
ast_log(LOG_WARNING,"aPGSQL_query: Query Error (connection identifier : %d, error message : %s)\n",id,PQcmdStatus(PGSQLres)); ast_log(LOG_WARNING, "aPGSQL_query: Query Error (connection identifier : %d, error message : %s)\n", id, PQcmdStatus(PGSQLres));
res=-1; res = -1;
break; break;
} }
nres=PQnfields(PGSQLres); nres = PQnfields(PGSQLres);
id1=add_identifier(AST_PGSQL_ID_RESID,PGSQLres); id1 = add_identifier(AST_PGSQL_ID_RESID, PGSQLres);
snprintf(s, sizeof(s), "%d", id1); snprintf(s, sizeof(s), "%d", id1);
pbx_builtin_setvar_helper(chan,var,s); pbx_builtin_setvar_helper(chan, var, s);
break; break;
} }
free(s1); free(s1);
free(s2); free(s2);
return(res); return res;
} }
static int aPGSQL_fetch(struct ast_channel *chan, void *data)
static int aPGSQL_fetch(struct ast_channel *chan, void *data) { {
char *s1, *s2, *fetchid_var, *s4, *s5, *s6;
char *s1,*s2,*fetchid_var,*s4,*s5,*s6,*s7; const char *s7;
char s[100]; char s[100];
char *var; char *var;
int l; int l;
int res; int res;
PGresult *PGSQLres; PGresult *PGSQLres;
int id,id1,i,j,fnd; int id, id1, i, j, fnd;
int *lalares=NULL; int *identp = NULL;
int nres; int nres;
struct ast_var_t *variables; struct ast_var_t *variables;
struct varshead *headp; struct varshead *headp;
char *stringp=NULL; char *stringp = NULL;
headp=&chan->varshead; headp = &chan->varshead;
res=0; res = 0;
l=strlen(data)+2; l = strlen(data) + 2;
s7=NULL; s7 = NULL;
s1=malloc(l); s1 = malloc(l);
s2=malloc(l); s2 = malloc(l);
strncpy(s1, data, l - 1); strncpy(s1, data, l - 1);
stringp=s1; stringp = s1;
strsep(&stringp," "); /* eat the first token, we already know it :P */ strsep(&stringp, " "); /* eat the first token, we already know it :P */
fetchid_var=strsep(&stringp," "); fetchid_var = strsep(&stringp, " ");
while (1) { /* ugly trick to make branches with break; */ while (1) { /* ugly trick to make branches with break; */
var=fetchid_var; /* fetchid */ var = fetchid_var; /* fetchid */
fnd=0; fnd = 0;
AST_LIST_TRAVERSE(headp,variables,entries) { AST_LIST_TRAVERSE(headp, variables, entries) {
if (strncasecmp(ast_var_name(variables),fetchid_var,strlen(fetchid_var))==0) { if (!(strncasecmp(ast_var_name(variables), fetchid_var, strlen(fetchid_var)))) {
s7=ast_var_value(variables); s7 = ast_var_value(variables);
fnd=1; fnd = 1;
break; break;
} }
} }
if (fnd==0) { if (!fnd) {
s7="0"; s7 = "0";
pbx_builtin_setvar_helper(chan,fetchid_var,s7); pbx_builtin_setvar_helper(chan, fetchid_var, s7);
} }
s4=strsep(&stringp," "); s4 = strsep(&stringp, " ");
id=atoi(s4); /* resultid */ id = atoi(s4); /* resultid */
if ((PGSQLres=find_identifier(id,AST_PGSQL_ID_RESID))==NULL) { if (!(PGSQLres = find_identifier(id, AST_PGSQL_ID_RESID))) {
ast_log(LOG_WARNING,"Invalid result identifier %d passed in aPGSQL_fetch\n",id); ast_log(LOG_WARNING, "Invalid result identifier %d passed in aPGSQL_fetch\n", id);
res=-1; res = -1;
break; break;
} }
id=atoi(s7); /*fetchid */ id = atoi(s7); /*fetchid */
if ((lalares=find_identifier(id,AST_PGSQL_ID_FETCHID))==NULL) { if (!(identp = find_identifier(id, AST_PGSQL_ID_FETCHID))) {
i=0; /* fetching the very first row */ i = 0; /* fetching the very first row */
} else { } else {
i=*lalares; i = *identp;
free(lalares); free(identp);
del_identifier(id,AST_PGSQL_ID_FETCHID); /* will re-add it a bit later */ del_identifier(id, AST_PGSQL_ID_FETCHID); /* will re-add it a bit later */
} }
if (i<PQntuples(PGSQLres)) { if (i < PQntuples(PGSQLres)) {
nres=PQnfields(PGSQLres); nres = PQnfields(PGSQLres);
ast_log(LOG_WARNING,"ast_PGSQL_fetch : nres = %d i = %d ;\n",nres,i); ast_log(LOG_WARNING, "ast_PGSQL_fetch : nres = %d i = %d ;\n", nres, i);
for (j=0;j<nres;j++) { for (j = 0; j < nres; j++) {
s5=strsep(&stringp," "); if (!(s5 = strsep(&stringp, " "))) {
if (s5==NULL) { ast_log(LOG_WARNING, "ast_PGSQL_fetch : More tuples (%d) than variables (%d)\n", nres, j);
ast_log(LOG_WARNING,"ast_PGSQL_fetch : More tuples (%d) than variables (%d)\n",nres,j); break;
break; }
if (!(s6 = PQgetvalue(PGSQLres, i, j))) {
ast_log(LOG_WARNING, "PQgetvalue(res, %d, %d) returned NULL in ast_PGSQL_fetch\n", i, j);
break;
}
ast_log(LOG_WARNING, "===setting variable '%s' to '%s'\n", s5, s6);
pbx_builtin_setvar_helper(chan, s5, s6);
} }
s6=PQgetvalue(PGSQLres,i,j); identp = malloc(sizeof(int));
if (s6==NULL) { *identp = ++i; /* advance to the next row */
ast_log(LOG_WARNING,"PWgetvalue(res,%d,%d) returned NULL in ast_PGSQL_fetch\n",i,j); id1 = add_identifier(AST_PGSQL_ID_FETCHID, identp);
break;
}
ast_log(LOG_WARNING,"===setting variable '%s' to '%s'\n",s5,s6);
pbx_builtin_setvar_helper(chan,s5,s6);
}
lalares=malloc(sizeof(int));
*lalares = ++i; /* advance to the next row */
id1 = add_identifier(AST_PGSQL_ID_FETCHID,lalares);
} else { } else {
ast_log(LOG_WARNING,"ast_PGSQL_fetch : EOF\n"); ast_log(LOG_WARNING, "ast_PGSQL_fetch : EOF\n");
id1 = 0; /* no more rows */ id1 = 0; /* no more rows */
} }
snprintf(s, sizeof(s), "%d", id1); snprintf(s, sizeof(s), "%d", id1);
ast_log(LOG_WARNING,"Setting var '%s' to value '%s'\n",fetchid_var,s); ast_log(LOG_WARNING, "Setting var '%s' to value '%s'\n", fetchid_var, s);
pbx_builtin_setvar_helper(chan,fetchid_var,s); pbx_builtin_setvar_helper(chan, fetchid_var, s);
break; break;
} }
free(s1); free(s1);
free(s2); free(s2);
return(res);
return res;
} }
static int aPGSQL_reset(struct ast_channel *chan, void *data) { static int aPGSQL_reset(struct ast_channel *chan, void *data)
{
char *s1,*s3; char *s1, *s3;
int l; int l;
PGconn *karoto; PGconn *PGSQLconn;
int id; int id;
char *stringp=NULL; char *stringp = NULL;
l=strlen(data)+2;
s1=malloc(l);
strncpy(s1, data, l - 1);
stringp=s1;
strsep(&stringp," "); /* eat the first token, we already know it :P */
s3=strsep(&stringp," ");
id=atoi(s3);
if ((karoto=find_identifier(id,AST_PGSQL_ID_CONNID))==NULL) {
ast_log(LOG_WARNING,"Invalid connection identifier %d passed in aPGSQL_reset\n",id);
} else {
PQreset(karoto);
}
free(s1);
return(0);
}
static int aPGSQL_clear(struct ast_channel *chan, void *data) { l = strlen(data) + 2;
s1 = malloc(l);
char *s1,*s3;
int l;
PGresult *karoto;
int id;
char *stringp=NULL;
l=strlen(data)+2;
s1=malloc(l);
strncpy(s1, data, l - 1); strncpy(s1, data, l - 1);
stringp=s1; stringp = s1;
strsep(&stringp," "); /* eat the first token, we already know it :P */ strsep(&stringp, " "); /* eat the first token, we already know it :P */
s3=strsep(&stringp," "); s3 = strsep(&stringp, " ");
id=atoi(s3); id = atoi(s3);
if ((karoto=find_identifier(id,AST_PGSQL_ID_RESID))==NULL) { if (!(PGSQLconn = find_identifier(id, AST_PGSQL_ID_CONNID))) {
ast_log(LOG_WARNING,"Invalid result identifier %d passed in aPGSQL_clear\n",id); ast_log(LOG_WARNING, "Invalid connection identifier %d passed in aPGSQL_reset\n", id);
} else { } else {
PQclear(karoto); PQreset(PGSQLconn);
del_identifier(id,AST_PGSQL_ID_RESID);
} }
free(s1);
return(0);
free(s1);
return 0;
} }
static int aPGSQL_clear(struct ast_channel *chan, void *data)
{
char *s1, *s3;
static int aPGSQL_disconnect(struct ast_channel *chan, void *data) {
char *s1,*s3;
int l; int l;
PGconn *karoto; PGresult *PGSQLres;
int id; int id;
char *stringp=NULL; char *stringp = NULL;
l = strlen(data) + 2;
l=strlen(data)+2; s1 = malloc(l);
s1=malloc(l);
strncpy(s1, data, l - 1); strncpy(s1, data, l - 1);
stringp=s1; stringp = s1;
strsep(&stringp," "); /* eat the first token, we already know it :P */ strsep(&stringp, " "); /* eat the first token, we already know it :P */
s3=strsep(&stringp," "); s3 = strsep(&stringp, " ");
id=atoi(s3); id = atoi(s3);
if ((karoto=find_identifier(id,AST_PGSQL_ID_CONNID))==NULL) { if (!(PGSQLres = find_identifier(id, AST_PGSQL_ID_RESID))) {
ast_log(LOG_WARNING,"Invalid connection identifier %d passed in aPGSQL_disconnect\n",id); ast_log(LOG_WARNING, "Invalid result identifier %d passed in aPGSQL_clear\n", id);
} else { } else {
PQfinish(karoto); PQclear(PGSQLres);
del_identifier(id,AST_PGSQL_ID_CONNID); del_identifier(id, AST_PGSQL_ID_RESID);
} }
free(s1); free(s1);
return(0);
return 0;
} }
static int aPGSQL_debug(struct ast_channel *chan, void *data) { static int aPGSQL_disconnect(struct ast_channel *chan, void *data)
ast_log(LOG_WARNING,"Debug : %s\n",(char *)data); {
return(0); char *s1, *s3;
int l;
PGconn *PGSQLconn;
int id;
char *stringp = NULL;
l = strlen(data) + 2;
s1 = malloc(l);
strncpy(s1, data, l - 1);
stringp = s1;
strsep(&stringp, " "); /* eat the first token, we already know it :P */
s3 = strsep(&stringp, " ");
id = atoi(s3);
if (!(PGSQLconn = find_identifier(id, AST_PGSQL_ID_CONNID))) {
ast_log(LOG_WARNING, "Invalid connection identifier %d passed in aPGSQL_disconnect\n", id);
} else {
PQfinish(PGSQLconn);
del_identifier(id, AST_PGSQL_ID_CONNID);
}
free(s1);
return 0;
}
static int aPGSQL_debug(struct ast_channel *chan, void *data)
{
ast_log(LOG_WARNING, "Debug : %s\n", (char *)data);
return 0;
} }
static int PGSQL_exec(struct ast_channel *chan, void *data) static int PGSQL_exec(struct ast_channel *chan, void *data)
@@ -511,52 +506,45 @@ static int PGSQL_exec(struct ast_channel *chan, void *data)
ast_log(LOG_WARNING, "APP_PGSQL requires an argument (see manual)\n"); ast_log(LOG_WARNING, "APP_PGSQL requires an argument (see manual)\n");
return -1; return -1;
} }
LOCAL_USER_ADD(u); LOCAL_USER_ADD(u);
result=0; result = 0;
if (strncasecmp("connect",data,strlen("connect"))==0) { if (!(strncasecmp("connect", data, strlen("connect")))) {
result=(aPGSQL_connect(chan,data)); result = (aPGSQL_connect(chan, data));
} else if (strncasecmp("query",data,strlen("query"))==0) { } else if (!(strncasecmp("query", data, strlen("query")))) {
result=(aPGSQL_query(chan,data)); result = (aPGSQL_query(chan, data));
} else if (strncasecmp("fetch",data,strlen("fetch"))==0) { } else if (!(strncasecmp("fetch", data, strlen("fetch")))) {
result=(aPGSQL_fetch(chan,data)); result = (aPGSQL_fetch(chan, data));
} else if (strncasecmp("reset",data,strlen("reset"))==0) { } else if (!(strncasecmp("reset", data, strlen("reset")))) {
result=(aPGSQL_reset(chan,data)); result = (aPGSQL_reset(chan, data));
} else if (strncasecmp("clear",data,strlen("clear"))==0) { } else if (!(strncasecmp("clear", data, strlen("clear")))) {
result=(aPGSQL_clear(chan,data)); result = (aPGSQL_clear(chan, data));
} else if (strncasecmp("debug",data,strlen("debug"))==0) { } else if (!(strncasecmp("debug", data, strlen("debug")))) {
result=(aPGSQL_debug(chan,data)); result = (aPGSQL_debug(chan, data));
} else if (strncasecmp("disconnect",data,strlen("disconnect"))==0) { } else if (!(strncasecmp("disconnect", data, strlen("disconnect")))) {
result=(aPGSQL_disconnect(chan,data)); result = (aPGSQL_disconnect(chan, data));
} else { } else {
ast_log(LOG_WARNING, "Unknown APP_PGSQL argument : %s\n",(char *)data); ast_log(LOG_WARNING, "Unknown APP_PGSQL argument : %s\n", (char *)data);
result=-1; result = -1;
} }
LOCAL_USER_REMOVE(u); LOCAL_USER_REMOVE(u);
return result; return result;
} }
int unload_module(void) int unload_module(void)
{ {
int res; int res = ast_unregister_application(app);
res = ast_unregister_application(app);
STANDARD_HANGUP_LOCALUSERS; STANDARD_HANGUP_LOCALUSERS;
return res; return res;
} }
int load_module(void) int load_module(void)
{ {
struct PGSQLidshead *headp; struct PGSQLidshead *headp = &PGSQLidshead;
headp=&PGSQLidshead;
AST_LIST_HEAD_INIT(headp); AST_LIST_HEAD_INIT(headp);
return ast_register_application(app, PGSQL_exec, synopsis, descrip); return ast_register_application(app, PGSQL_exec, synopsis, descrip);
} }