]> granicus.if.org Git - php/commitdiff
Added getAttribute() handler.
authorIlia Alshanetsky <iliaa@php.net>
Thu, 20 May 2004 20:04:11 +0000 (20:04 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Thu, 20 May 2004 20:04:11 +0000 (20:04 +0000)
Fixed leak inside exec().

ext/pdo_pgsql/pgsql_driver.c

index 1e27f8163fd2c48bd943f93c69c8c8bf390869aa..5b9d46fa5648a887418ba2c981b1c4e9d13e4f6c 100644 (file)
@@ -22,6 +22,8 @@
 #include "config.h"
 #endif
 
+#include "pg_config.h" /* needed for PG_VERSION */
+
 #include "php.h"
 #include "php_ini.h"
 #include "ext/standard/info.h"
@@ -119,9 +121,11 @@ static long pgsql_handle_doer(pdo_dbh_t *dbh, const char *sql, long sql_len TSRM
                ExecStatusType qs = PQresultStatus(res);
                if (qs != PGRES_COMMAND_OK && qs != PGRES_TUPLES_OK) {
                        pdo_pgsql_error(dbh, qs);
+                       PQclear(res);
                        return 0;
                }
                H->pgoid = PQoidValue(res);
+               PQclear(res);
        }
 
        return 1;
@@ -150,6 +154,93 @@ static long pdo_pgsql_last_insert_id(pdo_dbh_t *dbh TSRMLS_DC)
        return (long) H->pgoid;
 }
 
+static int pdo_pgsql_get_attribute(pdo_dbh_t *dbh, long attr, zval *return_value TSRMLS_DC)
+{
+       pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data;
+
+       switch (attr) {
+               case PDO_ATTR_CLIENT_VERSION:
+                       ZVAL_STRING(return_value, PG_VERSION, 1);
+                       break;
+
+               case PDO_ATTR_SERVER_VERSION:
+#ifdef HAVE_PQPROTOCOLVERSION
+                       if (PQprotocolVersion(H->server) >= 3) { /* PostgreSQL 7.4 or later */
+                               ZVAL_STRING(return_value, (char*)PQparameterStatus(H->server, "server_version"), 1);
+                       } else /* emulate above via a query */
+#endif
+                       {
+                               PGresult *res = PQexec(H->server, "SELECT VERSION()");
+                               if (res && PQresultStatus(res) == PGRES_TUPLES_OK) {
+                                       ZVAL_STRING(return_value, (char *)PQgetvalue(res, 0, 0), 1);
+                               }
+
+                               if (res) {
+                                       PQclear(res);
+                               }
+                       }
+                       break;
+
+               case PDO_ATTR_CONNECTION_STATUS:
+                       switch (PQstatus(H->server)) {
+                               case CONNECTION_STARTED:
+                                       ZVAL_STRINGL(return_value, "Waiting for connection to be made.", sizeof("Waiting for connection to be made.")-1, 1);
+                                       break;
+
+                               case CONNECTION_MADE:
+                               case CONNECTION_OK:
+                                       ZVAL_STRINGL(return_value, "Connection OK; waiting to send.", sizeof("Connection OK; waiting to send.")-1, 1);
+                                       break;
+
+                               case CONNECTION_AWAITING_RESPONSE:
+                                       ZVAL_STRINGL(return_value, "Waiting for a response from the server.", sizeof("Waiting for a response from the server.")-1, 1);
+                                       break;
+
+                               case CONNECTION_AUTH_OK:
+                                       ZVAL_STRINGL(return_value, "Received authentication; waiting for backend start-up to finish.", sizeof("Received authentication; waiting for backend start-up to finish.")-1, 1);
+                                       break;
+#ifdef CONNECTION_SSL_STARTUP
+                               case CONNECTION_SSL_STARTUP:
+                                       ZVAL_STRINGL(return_value, "Negotiating SSL encryption.", sizeof("Negotiating SSL encryption.")-1, 1);
+                                       break;
+#endif
+                               case CONNECTION_SETENV:
+                                       ZVAL_STRINGL(return_value, "Negotiating environment-driven parameter settings.", sizeof("Negotiating environment-driven parameter settings.")-1, 1);
+                                       break;
+
+                               case CONNECTION_BAD:
+                               default:
+                                       ZVAL_STRINGL(return_value, "Bad connection.", sizeof("Bad connection.")-1, 1);
+                                       break;
+                       }
+                       break;
+
+               case PDO_ATTR_SERVER_INFO: {
+                       int spid = PQbackendPID(H->server);
+                       char *tmp;
+#ifdef HAVE_PQPROTOCOLVERSION
+                       spprintf(&tmp, 0, 
+                               "PID: %d; Client Encoding: %s; Is Superuser: %s; Session Authorization: %s; Date Style: %s", 
+                               (char*)PQparameterStatus(H->server, "client_encoding"),
+                               (char*)PQparameterStatus(H->server, "is_superuser"),
+                               (char*)PQparameterStatus(H->server, "session_authorization"),
+                               (char*)PQparameterStatus(H->server, "DateStyle"),
+                               spid);
+#else 
+                       spprintf(&tmp, 0, "PID: %d", spid);
+#endif
+                       ZVAL_STRING(return_value, tmp, 0);
+               }
+                       break;
+
+               default:
+                       return 0;       
+       }
+
+       return 1;
+}
+
+
 static struct pdo_dbh_methods pgsql_methods = {
        pgsql_handle_closer,
        pgsql_handle_preparer,
@@ -160,7 +251,8 @@ static struct pdo_dbh_methods pgsql_methods = {
        NULL,
        NULL,
        pdo_pgsql_last_insert_id,
-       pdo_pgsql_fetch_error_func
+       pdo_pgsql_fetch_error_func,
+       pdo_pgsql_get_attribute
 };
 
 static int pdo_pgsql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_DC) /* {{{ */