@@ -79,20 +79,46 @@ static struct config_keyset pgsql_kset = {
#define schema_ce(x) ((x)->ces[DB_CE_NUM + 5])
#define connstr_ce(x) ((x)->ces[DB_CE_NUM + 6])
-#define PGSQL_HAVE_NAMESPACE_TEMPLATE \
- "SELECT nspname FROM pg_namespace n WHERE n.nspname='%s'"
+#define PGSQL_HAVE_NAMESPACE_TEMPLATE \
+ "SELECT nspname " \
+ "FROM pg_namespace n " \
+ "WHERE n.nspname = '%s'"
+
+#define PGSQL_GETCOLUMN_TEMPLATE \
+ "SELECT a.attname " \
+ "FROM pg_class c, pg_attribute a " \
+ "WHERE c.relname = '%s' " \
+ "AND a.attnum > 0 " \
+ "AND a.attrelid = c.oid " \
+ "ORDER BY a.attnum"
+
+#define PGSQL_GETCOLUMN_TEMPLATE_SCHEMA \
+ "SELECT a.attname " \
+ "FROM pg_attribute a, pg_class c " \
+ "LEFT JOIN pg_namespace n ON c.relnamespace = n.oid " \
+ "WHERE c.relname = '%s' " \
+ "AND n.nspname = '%s' " \
+ "AND a.attnum > 0 " \
+ "AND a.attrelid = c.oid " \
+ "AND a.attisdropped = FALSE " \
+ "ORDER BY a.attnum"
/* Determine if server support schemas */
static int pgsql_namespace(struct ulogd_pluginstance *upi)
{
struct pgsql_instance *pi = (struct pgsql_instance *) upi->private;
- char pgbuf[strlen(PGSQL_HAVE_NAMESPACE_TEMPLATE) +
- strlen(schema_ce(upi->config_kset).u.string) + 1];
PGresult *pgres;
+ char *pgbuf;
+ int rv = -1;
if (!pi->dbh)
return -1;
+ pgbuf = malloc(sizeof(PGSQL_HAVE_NAMESPACE_TEMPLATE) +
+ strlen(schema_ce(upi->config_kset).u.string));
+ if (!pgbuf)
+ return -1;
+
sprintf(pgbuf, PGSQL_HAVE_NAMESPACE_TEMPLATE,
schema_ce(upi->config_kset).u.string);
ulogd_log(ULOGD_DEBUG, "%s\n", pgbuf);
@@ -100,7 +126,7 @@ static int pgsql_namespace(struct ulogd_pluginstance *upi)
pgres = PQexec(pi->dbh, pgbuf);
if (!pgres) {
ulogd_log(ULOGD_DEBUG, "\n result false");
- return -1;
+ goto err_free_buf;
}
if (PQresultStatus(pgres) == PGRES_TUPLES_OK) {
@@ -108,51 +134,50 @@ static int pgsql_namespace(struct ulogd_pluginstance *upi)
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 {
+ rv = 0;
+ } else
ulogd_log(ULOGD_ERROR, "schema %s not found: %s\n",
- schema_ce(upi->config_kset).u.string, PQerrorMessage(pi->dbh));
- PQclear(pgres);
- return -1;
- }
+ schema_ce(upi->config_kset).u.string,
+ PQerrorMessage(pi->dbh));
} else {
pi->db_inst.schema = NULL;
+ rv = 0;
}
PQclear(pgres);
- return 0;
-}
-
-#define PGSQL_GETCOLUMN_TEMPLATE \
- "SELECT a.attname FROM pg_class c, pg_attribute a WHERE c.relname ='%s' AND a.attnum>0 AND a.attrelid=c.oid ORDER BY a.attnum"
+err_free_buf:
+ free(pgbuf);
-#define PGSQL_GETCOLUMN_TEMPLATE_SCHEMA \
- "SELECT a.attname FROM pg_attribute a, pg_class c LEFT JOIN pg_namespace n ON c.relnamespace=n.oid WHERE c.relname ='%s' AND n.nspname='%s' AND a.attnum>0 AND a.attrelid=c.oid AND a.attisdropped=FALSE ORDER BY a.attnum"
+ return rv;
+}
/* find out which columns the table has */
static int get_columns_pgsql(struct ulogd_pluginstance *upi)
{
struct pgsql_instance *pi = (struct pgsql_instance *) upi->private;
- char pgbuf[strlen(PGSQL_GETCOLUMN_TEMPLATE_SCHEMA)
- + strlen(table_ce(upi->config_kset).u.string)
- + strlen(pi->db_inst.schema) + 2];
PGresult *pgres;
- int rv;
+ char *pgbuf;
+ int rv = -1;
if (!pi->dbh) {
ulogd_log(ULOGD_ERROR, "no database handle\n");
return -1;
}
- if (pi->db_inst.schema) {
- snprintf(pgbuf, sizeof(pgbuf)-1,
- PGSQL_GETCOLUMN_TEMPLATE_SCHEMA,
- table_ce(upi->config_kset).u.string,
- pi->db_inst.schema);
- } else {
- snprintf(pgbuf, sizeof(pgbuf)-1, PGSQL_GETCOLUMN_TEMPLATE,
- table_ce(upi->config_kset).u.string);
- }
+ pgbuf = malloc(sizeof(PGSQL_GETCOLUMN_TEMPLATE_SCHEMA) +
+ strlen(table_ce(upi->config_kset).u.string) +
+ strlen(pi->db_inst.schema));
+ if (!pgbuf)
+ return -1;
+
+ if (pi->db_inst.schema)
+ sprintf(pgbuf, PGSQL_GETCOLUMN_TEMPLATE_SCHEMA,
+ table_ce(upi->config_kset).u.string,
+ pi->db_inst.schema);
+ else
+ sprintf(pgbuf, PGSQL_GETCOLUMN_TEMPLATE,
+ table_ce(upi->config_kset).u.string);
ulogd_log(ULOGD_DEBUG, "%s\n", pgbuf);
@@ -160,14 +185,13 @@ static int get_columns_pgsql(struct ulogd_pluginstance *upi)
if (!pgres) {
ulogd_log(ULOGD_DEBUG, "result false (%s)",
PQerrorMessage(pi->dbh));
- return -1;
+ goto err_free_buf;
}
if (PQresultStatus(pgres) != PGRES_TUPLES_OK) {
ulogd_log(ULOGD_DEBUG, "pres_command_not_ok (%s)",
PQerrorMessage(pi->dbh));
- PQclear(pgres);
- return -1;
+ goto err_clear_res;
}
rv = ulogd_db_alloc_input_keys(upi, PQntuples(pgres), pgres);
@@ -176,7 +200,12 @@ static int get_columns_pgsql(struct ulogd_pluginstance *upi)
if (!rv && upi->input.keys[0].name[0] == '.')
upi->input.keys[0].flags |= ULOGD_KEYF_INACTIVE;
+err_clear_res:
PQclear(pgres);
+
+err_free_buf:
+ free(pgbuf);
+
return rv;
}
VLA's are deprecated. Group all the SQL macros at the top of the file and format them. Signed-off-by: Jeremy Sowden <jeremy@azazel.net> --- output/pgsql/ulogd_output_PGSQL.c | 95 ++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 33 deletions(-)