Please take a look at the corrected patch.

It provides pg_result_error_field functionality for PostgreSQL 7.4.5+ and
compiles against all versions of Postgres and HEAD.



--- config.m4   Fri Jan  9 18:44:33 2004
+++ /usr/ports/databases/php5-pgsql/work/php-5.0.2/ext/pgsql/config.m4  Sat
Nov 20 20:00:43 2004
@@ -77,6 +77,7 @@
   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,
pg_encoding_to_char,AC_DEFINE(HAVE_PGSQL_WITH_MULTIBYTE_SUPPORT,1,[Whether
libpq is compiled with --enable-multibye]))
+  AC_CHECK_LIB(pq,
PQresultErrorField,AC_DEFINE(HAVE_PQRESULTERRORFIELD,1,[Postgresql 7.4.5 or
later]))
   LIBS=$old_LIBS
   LDFLAGS=$old_LDFLAGS
 





--- php_pgsql.h Thu Jan  8 17:32:40 2004
+++ /usr/ports/databases/php5-pgsql/work/php-5.0.2/ext/pgsql/php_pgsql.h
Sat Nov 20 20:11:09 2004
@@ -105,6 +105,9 @@
 PHP_FUNCTION(pg_get_pid);
 /* error message functions */
 PHP_FUNCTION(pg_result_error);
+#ifdef HAVE_PQRESULTERRORFIELD
+PHP_FUNCTION(pg_result_error_field);
+#endif
 PHP_FUNCTION(pg_last_error);
 PHP_FUNCTION(pg_last_notice);
 /* copy functions */






--- pgsql.c     Wed May 12 16:49:47 2004
+++ /usr/ports/databases/php5-pgsql/work/php-5.0.2/ext/pgsql/pgsql.c    Sat
Nov 20 20:10:25 2004
@@ -124,6 +124,9 @@
        PHP_FE(pg_get_pid,      NULL)
        /* error message functions */
        PHP_FE(pg_result_error, NULL)
+#if HAVE_PQRESULTERRORFIELD
+       PHP_FE(pg_result_error_field, NULL)
+#endif
        PHP_FE(pg_last_error,   NULL)
        PHP_FE(pg_last_notice,  NULL)
        /* copy functions */
@@ -438,6 +441,25 @@
        REGISTER_LONG_CONSTANT("PGSQL_SEEK_SET", SEEK_SET, CONST_CS |
CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("PGSQL_SEEK_CUR", SEEK_CUR, CONST_CS |
CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("PGSQL_SEEK_END", SEEK_END, CONST_CS |
CONST_PERSISTENT);
+       /* For pg_result_error_field() */
+#ifdef HAVE_PQRESULTERRORFIELD
+       REGISTER_LONG_CONSTANT("PGSQL_DIAG_SEVERITY", PG_DIAG_SEVERITY,
CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_DIAG_SQLSTATE", PG_DIAG_SQLSTATE,
CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_DIAG_MESSAGE_PRIMARY",
PG_DIAG_MESSAGE_PRIMARY, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_DIAG_MESSAGE_DETAIL",
PG_DIAG_MESSAGE_DETAIL, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_DIAG_MESSAGE_HINT",
PG_DIAG_MESSAGE_HINT, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_DIAG_STATEMENT_POSITION",
PG_DIAG_STATEMENT_POSITION, CONST_CS | CONST_PERSISTENT);
+#ifdef PG_DIAG_INTERNAL_POSITION
+       REGISTER_LONG_CONSTANT("PGSQL_DIAG_INTERNAL_POSITION",
PG_DIAG_INTERNAL_POSITION, CONST_CS | CONST_PERSISTENT);
+#endif
+#ifdef PG_DIAG_INTERNAL_QUERY
+       REGISTER_LONG_CONSTANT("PGSQL_DIAG_INTERNAL_QUERY",
PG_DIAG_INTERNAL_QUERY, CONST_CS | CONST_PERSISTENT);
+#endif 
+       REGISTER_LONG_CONSTANT("PGSQL_DIAG_CONTEXT", PG_DIAG_CONTEXT,
CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_DIAG_SOURCE_FILE",
PG_DIAG_SOURCE_FILE, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_DIAG_SOURCE_LINE",
PG_DIAG_SOURCE_LINE, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PGSQL_DIAG_SOURCE_FUNCTION",
PG_DIAG_SOURCE_FUNCTION, CONST_CS | CONST_PERSISTENT);
+#endif
        /* For pg_result_status() return value type */
        REGISTER_LONG_CONSTANT("PGSQL_STATUS_LONG", PGSQL_STATUS_LONG,
CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("PGSQL_STATUS_STRING", PGSQL_STATUS_STRING,
CONST_CS | CONST_PERSISTENT);
@@ -2987,6 +3009,70 @@
                RETURN_FALSE;
        }
        RETVAL_STRINGL(to, to_len, 0);
+}
+/* }}} */
+#endif
+
+
+#ifdef HAVE_PQRESULTERRORFIELD
+/* {{{ proto string pg_result_error_field(resource result, long code)
+   Get diagnosis message associated with the result */
+PHP_FUNCTION(pg_result_error_field)
+{
+       zval *result;
+       long code;
+       PGresult *pgsql_result;
+       pgsql_result_handle *pg_result;
+       char *err = NULL;
+
+       if (ZEND_NUM_ARGS() != 2) {
+               WRONG_PARAM_COUNT;
+       }
+
+       if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET,
ZEND_NUM_ARGS() TSRMLS_CC, "rl",
+                                                                &result,
&code) == FAILURE) {            
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid
parameters specified");
+               RETURN_FALSE;
+       }
+       
+       if (code != PG_DIAG_SEVERITY &&
+               code != PG_DIAG_SQLSTATE &&
+               code != PG_DIAG_MESSAGE_PRIMARY &&
+               code != PG_DIAG_MESSAGE_DETAIL &&
+               code != PG_DIAG_MESSAGE_HINT &&
+               code != PG_DIAG_STATEMENT_POSITION &&
+#ifdef PG_DIAG_INTERNAL_POSITION
+               code != PG_DIAG_INTERNAL_POSITION &&
+#endif
+#ifdef PG_DIAG_INTERNAL_QUERY
+               code != PG_DIAG_INTERNAL_QUERY &&
+#endif
+               code != PG_DIAG_CONTEXT &&
+               code != PG_DIAG_SOURCE_FILE &&
+               code != PG_DIAG_SOURCE_LINE &&
+               code != PG_DIAG_SOURCE_FUNCTION
+       ) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid
diagnostic code");
+               RETURN_FALSE;
+       }
+
+
+       ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, &result, -1,
"PostgreSQL result", le_result);
+
+       pgsql_result = pg_result->result;
+       if (!pgsql_result) {
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid result
suppied");
+               RETURN_FALSE;
+       }
+
+
+       err = (char *)PQresultErrorField(pgsql_result, code);
+
+       if (!err) {
+               RETURN_FALSE;
+       }
+
+       RETURN_STRING(err,1);
 }
 /* }}} */
 #endif



-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to