From f191fc8d431c52de17ff1ab7d5d807a14b51e945 Mon Sep 17 00:00:00 2001 From: Bob Hockney Date: Wed, 19 Dec 2012 12:38:57 -0700 Subject: Handle postgresql schemas correctly Add 'schema' variable to look into corresponding schema. --- output/pgsql/ulogd_output_PGSQL.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) (limited to 'output/pgsql') diff --git a/output/pgsql/ulogd_output_PGSQL.c b/output/pgsql/ulogd_output_PGSQL.c index cd793ca..f246153 100644 --- a/output/pgsql/ulogd_output_PGSQL.c +++ b/output/pgsql/ulogd_output_PGSQL.c @@ -105,9 +105,16 @@ static int pgsql_namespace(struct ulogd_pluginstance *upi) } if (PQresultStatus(pi->pgres) == PGRES_TUPLES_OK) { - ulogd_log(ULOGD_DEBUG, "using schema %s\n", - schema_ce(upi->config_kset).u.string); - pi->db_inst.schema = schema_ce(upi->config_kset).u.string; + if (PQntuples(pi->pgres)) { + ulogd_log(ULOGD_DEBUG, "using schema %s\n", + schema_ce(upi->config_kset).u.string); + pi->db_inst.schema = schema_ce(upi->config_kset).u.string; + } else { + ulogd_log(ULOGD_ERROR, "schema %s not found: %s\n", + schema_ce(upi->config_kset).u.string, PQerrorMessage(pi->dbh)); + PQclear(pi->pgres); + return -1; + } } else { pi->db_inst.schema = NULL; } @@ -223,6 +230,8 @@ static int open_db_pgsql(struct ulogd_pluginstance *upi) char *user = user_ce(upi->config_kset).u.string; char *pass = pass_ce(upi->config_kset).u.string; char *db = db_ce(upi->config_kset).u.string; + char *schema = NULL; + char pgbuf[128]; /* 80 is more than what we need for the fixed parts below */ len = 80 + strlen(user) + strlen(db); @@ -270,11 +279,29 @@ static int open_db_pgsql(struct ulogd_pluginstance *upi) } if (pgsql_namespace(upi)) { - ulogd_log(ULOGD_ERROR, "unable to test for pgsql schemas\n"); + ulogd_log(ULOGD_ERROR, "problem testing for pgsql schemas\n"); close_db_pgsql(upi); return -1; } + pi=(struct pgsql_instance *)upi->private; + schema = pi->db_inst.schema; + + if (!(schema == NULL) && (strcmp(schema,"public"))) { + snprintf(pgbuf, 128, "SET search_path='%.63s', \"$user\", 'public'", schema); + pi->pgres = PQexec(pi->dbh, pgbuf); + if ((PQresultStatus(pi->pgres) == PGRES_COMMAND_OK)) { + PQclear(pi->pgres); + } else { + ulogd_log(ULOGD_ERROR, "could not set search path to (%s): %s\n", + schema, PQerrorMessage(pi->dbh)); + PQclear(pi->pgres); + close_db_pgsql(upi); + return -1; + } + + } + return 0; } -- cgit v1.2.3