wez Fri May 13 14:09:04 2005 EDT Modified files: /php-src/ext/pdo_pgsql config.m4 pgsql_driver.c pgsql_statement.c php_pdo_pgsql_int.h Log: patch by Christopher Kings-Lynne, slightly modified http://cvs.php.net/diff.php/php-src/ext/pdo_pgsql/config.m4?r1=1.7&r2=1.8&ty=u Index: php-src/ext/pdo_pgsql/config.m4 diff -u php-src/ext/pdo_pgsql/config.m4:1.7 php-src/ext/pdo_pgsql/config.m4:1.8 --- php-src/ext/pdo_pgsql/config.m4:1.7 Mon Feb 28 03:18:47 2005 +++ php-src/ext/pdo_pgsql/config.m4 Fri May 13 14:09:03 2005 @@ -1,5 +1,5 @@ dnl -dnl $Id: config.m4,v 1.7 2005/02/28 08:18:47 rasmus Exp $ +dnl $Id: config.m4,v 1.8 2005/05/13 18:09:03 wez Exp $ dnl if test "$PHP_PDO" != "no"; then @@ -90,6 +90,8 @@ AC_CHECK_LIB(pq, PQparameterStatus,AC_DEFINE(HAVE_PQPARAMETERSTATUS,1,[PostgreSQL 7.4 or later])) AC_CHECK_LIB(pq, PQprotocolVersion,AC_DEFINE(HAVE_PQPROTOCOLVERSION,1,[PostgreSQL 7.4 or later])) AC_CHECK_LIB(pq, PQtransactionStatus,AC_DEFINE(HAVE_PGTRANSACTIONSTATUS,1,[PostgreSQL 7.4 or later])) + AC_CHECK_LIB(pq, PQunescapeBytea,AC_DEFINE(HAVE_PQUNESCAPEBYTEA,1,[PostgreSQL 7.4 or later])) + AC_CHECK_LIB(pq, PQresultErrorField,AC_DEFINE(HAVE_PQRESULTERRORFIELD,1,[PostgreSQL 7.4 or later])) AC_CHECK_LIB(pq, pg_encoding_to_char,AC_DEFINE(HAVE_PGSQL_WITH_MULTIBYTE_SUPPORT,1,[Whether libpq is compiled with --enable-multibyte])) LIBS=$old_LIBS LDFLAGS=$old_LDFLAGS http://cvs.php.net/diff.php/php-src/ext/pdo_pgsql/pgsql_driver.c?r1=1.37&r2=1.38&ty=u Index: php-src/ext/pdo_pgsql/pgsql_driver.c diff -u php-src/ext/pdo_pgsql/pgsql_driver.c:1.37 php-src/ext/pdo_pgsql/pgsql_driver.c:1.38 --- php-src/ext/pdo_pgsql/pgsql_driver.c:1.37 Sat Feb 26 12:27:51 2005 +++ php-src/ext/pdo_pgsql/pgsql_driver.c Fri May 13 14:09:03 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pgsql_driver.c,v 1.37 2005/02/26 17:27:51 wez Exp $ */ +/* $Id: pgsql_driver.c,v 1.38 2005/05/13 18:09:03 wez Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -52,7 +52,7 @@ return tmp; } -int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *file, int line TSRMLS_DC) /* {{{ */ +int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *sqlstate, const char *file, int line TSRMLS_DC) /* {{{ */ { pdo_pgsql_db_handle *H = (pdo_pgsql_db_handle *)dbh->driver_data; pdo_error_type *pdo_err = stmt ? &stmt->error_code : &dbh->error_code; @@ -68,10 +68,11 @@ einfo->errmsg = NULL; } - switch (errcode) { - default: - strcpy(*pdo_err, "HY000"); - break; + if (sqlstate == NULL) { + strcpy(*pdo_err, "HY000"); + } + else { + strcpy(*pdo_err, sqlstate); } if (errmsg) { @@ -154,12 +155,18 @@ if (!(res = PQexec(H->server, sql))) { /* fatal error */ - pdo_pgsql_error(dbh, PGRES_FATAL_ERROR); + pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL); return 0; } else { ExecStatusType qs = PQresultStatus(res); if (qs != PGRES_COMMAND_OK && qs != PGRES_TUPLES_OK) { - pdo_pgsql_error(dbh, qs); +#if HAVE_PQRESULTERRORFIELD + char * sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE); + pdo_pgsql_error(dbh, qs, (const char *)sqlstate); + PQfreemem(sqlstate); +#else + pdo_pgsql_error(dbh, qs, NULL); +#endif PQclear(res); return 0; } @@ -384,7 +391,7 @@ } if (PQstatus(H->server) != CONNECTION_OK) { - pdo_pgsql_error(dbh, PGRES_FATAL_ERROR); + pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, PHP_PDO_PGSQL_CONNECTION_FAILURE_SQLSTATE); goto cleanup; } http://cvs.php.net/diff.php/php-src/ext/pdo_pgsql/pgsql_statement.c?r1=1.20&r2=1.21&ty=u Index: php-src/ext/pdo_pgsql/pgsql_statement.c diff -u php-src/ext/pdo_pgsql/pgsql_statement.c:1.20 php-src/ext/pdo_pgsql/pgsql_statement.c:1.21 --- php-src/ext/pdo_pgsql/pgsql_statement.c:1.20 Wed Mar 23 03:52:40 2005 +++ php-src/ext/pdo_pgsql/pgsql_statement.c Fri May 13 14:09:03 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: pgsql_statement.c,v 1.20 2005/03/23 08:52:40 chriskl Exp $ */ +/* $Id: pgsql_statement.c,v 1.21 2005/05/13 18:09:03 wez Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -97,7 +97,13 @@ status = PQresultStatus(S->result); if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK) { - pdo_pgsql_error_stmt(stmt, status); +#if HAVE_PQRESULTERRORFIELD + char * sqlstate = PQresultErrorField(S->result, PG_DIAG_SQLSTATE); + pdo_pgsql_error_stmt(stmt, status, (const char *)sqlstate); +#else + pdo_pgsql_error_stmt(stmt, status, NULL); +#endif + return 0; } @@ -145,7 +151,12 @@ status = PQresultStatus(S->result); if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK) { - pdo_pgsql_error_stmt(stmt, status); +#if HAVE_PQRESULTERRORFIELD + char * sqlstate = PQresultErrorField(S->result, PG_DIAG_SQLSTATE); + pdo_pgsql_error_stmt(stmt, status, (const char *)sqlstate); +#else + pdo_pgsql_error_stmt(stmt, status, NULL); +#endif return 0; } @@ -209,7 +220,7 @@ } /* PQunescapeBytea() from PostgreSQL 7.3 to provide bytea unescape feature to 7.2 users. - Renamed to php_pgsql_unescape_bytea() */ + Renamed to php_pdo_pgsql_unescape_bytea() */ /* * PQunescapeBytea - converts the null terminated string representation * of a bytea, strtext, into binary, filling a buffer. It returns a @@ -231,7 +242,7 @@ * 5 \' * 6 \\ */ -static unsigned char * php_pgsql_unescape_bytea(unsigned char *strtext, size_t *retbuflen) +static unsigned char *php_pdo_pgsql_unescape_bytea(unsigned char *strtext, size_t *retbuflen) { size_t buflen; unsigned char *buffer, @@ -346,11 +357,14 @@ break; case PDO_PARAM_LOB: - tmp_ptr = php_pgsql_unescape_bytea(*ptr, &tmp_len); - *ptr = estrndup(tmp_ptr, tmp_len); + *ptr = php_pdo_pgsql_unescape_bytea(*ptr, &tmp_len); *len = tmp_len; *caller_frees = 1; - free(tmp_ptr); + break; + case PDO_PARAM_NULL: + case PDO_PARAM_STR: + case PDO_PARAM_STMT: + case PDO_PARAM_INPUT_OUTPUT: break; } } http://cvs.php.net/diff.php/php-src/ext/pdo_pgsql/php_pdo_pgsql_int.h?r1=1.8&r2=1.9&ty=u Index: php-src/ext/pdo_pgsql/php_pdo_pgsql_int.h diff -u php-src/ext/pdo_pgsql/php_pdo_pgsql_int.h:1.8 php-src/ext/pdo_pgsql/php_pdo_pgsql_int.h:1.9 --- php-src/ext/pdo_pgsql/php_pdo_pgsql_int.h:1.8 Sat Feb 12 20:02:18 2005 +++ php-src/ext/pdo_pgsql/php_pdo_pgsql_int.h Fri May 13 14:09:03 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_pdo_pgsql_int.h,v 1.8 2005/02/13 01:02:18 edink Exp $ */ +/* $Id: php_pdo_pgsql_int.h,v 1.9 2005/05/13 18:09:03 wez Exp $ */ #ifndef PHP_PDO_PGSQL_INT_H #define PHP_PDO_PGSQL_INT_H @@ -25,6 +25,8 @@ #include <libpq-fe.h> +#define PHP_PDO_PGSQL_CONNECTION_FAILURE_SQLSTATE "08006" + typedef struct { const char *file; int line; @@ -65,9 +67,9 @@ extern pdo_driver_t pdo_pgsql_driver; -extern int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *file, int line TSRMLS_DC); -#define pdo_pgsql_error(d,e) _pdo_pgsql_error(d, NULL, e, __FILE__, __LINE__ TSRMLS_CC) -#define pdo_pgsql_error_stmt(s,e) _pdo_pgsql_error(s->dbh, s, e, __FILE__, __LINE__ TSRMLS_CC) +extern int _pdo_pgsql_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, int errcode, const char *sqlstate, const char *file, int line TSRMLS_DC); +#define pdo_pgsql_error(d,e,z) _pdo_pgsql_error(d, NULL, e, z, __FILE__, __LINE__ TSRMLS_CC) +#define pdo_pgsql_error_stmt(s,e,z) _pdo_pgsql_error(s->dbh, s, e, z, __FILE__, __LINE__ TSRMLS_CC) extern struct pdo_stmt_methods pgsql_stmt_methods;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php