Module: sip-router Branch: janakj/postgres Commit: c65b0d937609e7752b1e63daac7ea0cc0dd0ec0a URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c65b0d93...
Author: Jan Janak jan@iptel.org Committer: Jan Janak jan@iptel.org Date: Wed May 7 17:36:36 2008 +0000
- fixed wrong parameter value passed to PQexecPrepared - few minor bugs fixed
---
modules/db_postgres/pg_cmd.c | 27 +++++++++++++++++---------- modules/db_postgres/pg_cmd.h | 1 + modules/db_postgres/pg_mod.c | 10 +++++----- 3 files changed, 23 insertions(+), 15 deletions(-)
diff --git a/modules/db_postgres/pg_cmd.c b/modules/db_postgres/pg_cmd.c index b0615f4..f09014c 100644 --- a/modules/db_postgres/pg_cmd.c +++ b/modules/db_postgres/pg_cmd.c @@ -78,7 +78,9 @@ static void pg_cmd_free(db_cmd_t* cmd, struct pg_cmd* payload)
/** Generate a unique name for a server-side PostgreSQL command. * This function generates a unique name for each command that will be used to - * identify the prepared statement on the server. + * identify the prepared statement on the server. The name has only has to be + * unique within a connection to the server so we just keep a global counter + * and the name will be that number converted to text. * * @param cmd A command whose name is to be generated * @return A string allocated using pkg_malloc containing the name or NULL on @@ -128,7 +130,8 @@ static int create_pg_params(db_cmd_t* cmd) pcmd->params.len = (int*)pkg_malloc(sizeof(int) * num); pcmd->params.fmt = (int*)pkg_malloc(sizeof(int) * num); - if (!pcmd->params.val || !pcmd->params.len || !pcmd->params.fmt) { + if (!pcmd->params.val || + !pcmd->params.len || !pcmd->params.fmt) { ERR("postgres: No memory left\n"); goto error; } @@ -136,6 +139,7 @@ static int create_pg_params(db_cmd_t* cmd) memset(pcmd->params.val, '\0', sizeof(const char*) * num); memset(pcmd->params.len, '\0', sizeof(int) * num); memset(pcmd->params.fmt, '\0', sizeof(int) * num); + pcmd->params.n = num; return 0;
error: @@ -240,24 +244,28 @@ int pg_cmd(db_cmd_t* cmd) break; case DB_SQL: - pcmd->sql_cmd.s = (char*)pkg_malloc(cmd->table.len); + pcmd->sql_cmd.s = (char*)pkg_malloc(cmd->table.len + 1); if (pcmd->sql_cmd.s == NULL) { ERR("postgres: Out of private memory\n"); goto error; } memcpy(pcmd->sql_cmd.s,cmd->table.s, cmd->table.len); + pcmd->sql_cmd.s[cmd->table.len] = '\0'; pcmd->sql_cmd.len = cmd->table.len; break; }
DB_SET_PAYLOAD(cmd, pcmd);
+ /* Create parameter arrays for PostgreSQL API functions */ + if (create_pg_params(cmd) < 0) goto error; + /* Generate a unique name for the command on the server */ if (gen_cmd_name(cmd) != 0) goto error;
/* Upload the command to the server */ if (upload_cmd(cmd) != 0) goto error; - + /* Obtain the description of the uploaded command, this includes * information about result and parameter fields */ if (get_types(cmd) != 0) goto error; @@ -272,8 +280,6 @@ int pg_cmd(db_cmd_t* cmd)
if (check_types(cmd)) goto error;
- /* Create parameter arrays for PostgreSQL API functions */ - if (create_pg_params(cmd) < 0) goto error; return 0;
error: @@ -343,22 +349,23 @@ static int upload_cmd(db_cmd_t* cmd) /* FIXME: The function should take the connection as one of parameters */ pcon = DB_GET_PAYLOAD(cmd->ctx->con[db_payload_idx]);
- DBG("postgres: Uploading query '%s'='%s'\n", pcmd->name, + DBG("postgres: Uploading comand '%s': '%s'\n", pcmd->name, pcmd->sql_cmd.s);
res = PQprepare(pcon->con, pcmd->name, pcmd->sql_cmd.s, 0, NULL); st = PQresultStatus(res); - PQclear(res);
if (st != PGRES_COMMAND_OK && st != PGRES_NONFATAL_ERROR && st != PGRES_TUPLES_OK) { ERR("postgres: Error while uploading command to server: %d, %s", st, PQresultErrorMessage(res)); ERR("postgres: Command: '%s'\n", pcmd->sql_cmd.s); + PQclear(res); return -1; }
+ PQclear(res); return 0; }
@@ -392,9 +399,9 @@ int pg_cmd_exec(db_res_t* res, db_cmd_t* cmd) /* Execute the statement */ tmp = PQexecPrepared(pcon->con, pcmd->name, - cmd->match_count + cmd->vals_count, + pcmd->params.n, pcmd->params.val, pcmd->params.len, - NULL, 1); + pcmd->params.fmt, 1); if (!tmp) { ERR("postgres: PQexecPrepared returned no result\n"); continue; diff --git a/modules/db_postgres/pg_cmd.h b/modules/db_postgres/pg_cmd.h index 47be941..41914e9 100644 --- a/modules/db_postgres/pg_cmd.h +++ b/modules/db_postgres/pg_cmd.h @@ -51,6 +51,7 @@ #include <libpq-fe.h>
struct pg_params { + int n; const char** val; int* len; int* fmt; diff --git a/modules/db_postgres/pg_mod.c b/modules/db_postgres/pg_mod.c index 1ed3c09..027e4af 100644 --- a/modules/db_postgres/pg_mod.c +++ b/modules/db_postgres/pg_mod.c @@ -359,15 +359,15 @@ int pg_test(void) goto error; }
- put->vals[0].v.lstr.s = "abc"; + put->vals[0].v.lstr.s = "abc should not be there"; put->vals[0].v.lstr.len = 3; - put->vals[1].v.lstr.s = "abc"; + put->vals[1].v.lstr.s = "abc should not be there"; put->vals[1].v.lstr.len = 3; - put->vals[2].v.lstr.s = "abc"; + put->vals[2].v.lstr.s = "abc should not be there"; put->vals[2].v.lstr.len = 3; - put->vals[3].v.lstr.s = "abc"; + put->vals[3].v.lstr.s = "abc should not be there"; put->vals[3].v.lstr.len = 3; - put->vals[4].v.lstr.s = "a"; + put->vals[4].v.lstr.s = "a should not be there"; put->vals[4].v.lstr.len = 1; if (db_exec(NULL, put)) { ERR("Error while executing database command\n");