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