From edfd7b97b6278161077be6f34b62a620d07f6695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20S=C3=BDkora?= Date: Tue, 2 Jul 2013 12:38:38 +0200 Subject: [PATCH 1/3] PostgreSQL's PDOStatement::getColumnMeta() fills in table's name. --- ext/pdo_pgsql/pgsql_statement.c | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/ext/pdo_pgsql/pgsql_statement.c b/ext/pdo_pgsql/pgsql_statement.c index d58eebf8f4395..bfd3050f6f8fd 100644 --- a/ext/pdo_pgsql/pgsql_statement.c +++ b/ext/pdo_pgsql/pgsql_statement.c @@ -568,12 +568,40 @@ static int pgsql_stmt_get_col(pdo_stmt_t *stmt, int colno, char **ptr, unsigned return 1; } +static char * pdo_pgsql_translate_oid_to_table(Oid oid, PGconn *conn) +{ + char *table_name = NULL; + PGresult *tmp_res; + char *querystr = NULL; + + spprintf(&querystr, 0, "select relname from pg_class where oid=%d", oid); + + if ((tmp_res = PQexec(conn, querystr)) == NULL || PQresultStatus(tmp_res) != PGRES_TUPLES_OK) { + if (tmp_res) { + PQclear(tmp_res); + } + efree(querystr); + return 0; + } + efree(querystr); + + if ((table_name = PQgetvalue(tmp_res, 0, 0)) == NULL) { + PQclear(tmp_res); + return 0; + } + + PQclear(tmp_res); + return table_name; +} + static int pgsql_stmt_get_column_meta(pdo_stmt_t *stmt, long colno, zval *return_value TSRMLS_DC) { pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data; PGresult *res; char *q=NULL; ExecStatusType status; + Oid table_oid; + char *table_name=NULL; if (!S->result) { return FAILURE; @@ -586,6 +614,15 @@ static int pgsql_stmt_get_column_meta(pdo_stmt_t *stmt, long colno, zval *return array_init(return_value); add_assoc_long(return_value, "pgsql:oid", S->cols[colno].pgsql_type); + table_oid = PQftable(S->result, colno); + add_assoc_long(return_value, "pgsql:table_oid", table_oid); + table_name = pdo_pgsql_translate_oid_to_table(table_oid, S->H->server); + if (table_name) { + add_assoc_string(return_value, "table", table_name, 1); + } + + + /* Fetch metadata from Postgres system catalogue */ spprintf(&q, 0, "SELECT TYPNAME FROM PG_TYPE WHERE OID=%d", S->cols[colno].pgsql_type); res = PQexec(S->H->server, q); From 04cfa4ad54ba0a11e90aec05d341323c7e4005be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20S=C3=BDkora?= Date: Mon, 8 Jul 2013 13:46:23 +0200 Subject: [PATCH 2/3] Use %ud instead of %d for oid. --- ext/pdo_pgsql/pgsql_statement.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pdo_pgsql/pgsql_statement.c b/ext/pdo_pgsql/pgsql_statement.c index bfd3050f6f8fd..c77639f8ebc10 100644 --- a/ext/pdo_pgsql/pgsql_statement.c +++ b/ext/pdo_pgsql/pgsql_statement.c @@ -574,7 +574,7 @@ static char * pdo_pgsql_translate_oid_to_table(Oid oid, PGconn *conn) PGresult *tmp_res; char *querystr = NULL; - spprintf(&querystr, 0, "select relname from pg_class where oid=%d", oid); + spprintf(&querystr, 0, "select relname from pg_class where oid=%ud", oid); if ((tmp_res = PQexec(conn, querystr)) == NULL || PQresultStatus(tmp_res) != PGRES_TUPLES_OK) { if (tmp_res) { From 196ddb244a55a4e5faa9afb41f57d9e4d716c55e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20S=C3=BDkora?= Date: Thu, 11 Jul 2013 09:43:18 +0200 Subject: [PATCH 3/3] Use %u instead of %ud for oid. --- ext/pdo_pgsql/pgsql_statement.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pdo_pgsql/pgsql_statement.c b/ext/pdo_pgsql/pgsql_statement.c index c77639f8ebc10..85ed1879c4bff 100644 --- a/ext/pdo_pgsql/pgsql_statement.c +++ b/ext/pdo_pgsql/pgsql_statement.c @@ -574,7 +574,7 @@ static char * pdo_pgsql_translate_oid_to_table(Oid oid, PGconn *conn) PGresult *tmp_res; char *querystr = NULL; - spprintf(&querystr, 0, "select relname from pg_class where oid=%ud", oid); + spprintf(&querystr, 0, "select relname from pg_class where oid=%u", oid); if ((tmp_res = PQexec(conn, querystr)) == NULL || PQresultStatus(tmp_res) != PGRES_TUPLES_OK) { if (tmp_res) {