summaryrefslogtreecommitdiff
path: root/ext/pgsql/pgsql.c
diff options
context:
space:
mode:
authorYasuo Ohgaki <yohgaki@php.net>2002-04-20 03:03:42 +0000
committerYasuo Ohgaki <yohgaki@php.net>2002-04-20 03:03:42 +0000
commit07125ea9f48b1510f78fd7bf82db15e52f9ed1ae (patch)
treed744ea018078295e1986f239be702a9b9e6aae6e /ext/pgsql/pgsql.c
parent04fb5ef2e370e694c1e050721bc9119209861041 (diff)
downloadphp-git-07125ea9f48b1510f78fd7bf82db15e52f9ed1ae.tar.gz
Fixed OID overflow. If value is larger than MAX_LONG,
pg_last_oid() returns string to keep correct value.
Diffstat (limited to 'ext/pgsql/pgsql.c')
-rw-r--r--ext/pgsql/pgsql.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c
index b42b28a969..201f04eed4 100644
--- a/ext/pgsql/pgsql.c
+++ b/ext/pgsql/pgsql.c
@@ -48,6 +48,10 @@
#define PGSQL_STATUS_LONG 1
#define PGSQL_STATUS_STRING 2
+#define PGSQL_MAX_LENGTH_OF_LONG 30
+#define PGSQL_MAX_LENGTH_OF_DOUBLE 60
+
+
#if HAVE_PQSETNONBLOCKING
#define PQ_SETNONBLOCKING(pg_link, flag) PQsetnonblocking(pg_link, flag)
#else
@@ -1476,6 +1480,8 @@ PHP_FUNCTION(pg_last_oid)
zval **result;
PGresult *pgsql_result;
pgsql_result_handle *pg_result;
+ uint oid;
+ char *oid_str;
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &result)==FAILURE) {
WRONG_PARAM_COUNT;
@@ -1484,18 +1490,23 @@ PHP_FUNCTION(pg_last_oid)
ZEND_FETCH_RESOURCE(pg_result, pgsql_result_handle *, result, -1, "PostgreSQL result", le_result);
pgsql_result = pg_result->result;
#ifdef HAVE_PQOIDVALUE
- Z_LVAL_P(return_value) = (int) PQoidValue(pgsql_result);
- if (Z_LVAL_P(return_value) == InvalidOid) {
+ oid = PQoidValue(pgsql_result);
+ if (oid == InvalidOid) {
RETURN_FALSE;
- } else {
- Z_TYPE_P(return_value) = IS_LONG;
+ } else if (oid > LONG_MAX) {
+ oid_str = (char *)emalloc(PGSQL_MAX_LENGTH_OF_LONG+1);
+ sprintf(oid_str, "%l", oid);
+ RETVAL_STRING(oid_str, 0);
+ }
+ else {
+ RETVAL_LONG((long)oid);
}
#else
Z_STRVAL_P(return_value) = (char *) PQoidStatus(pgsql_result);
+ Z_TYPE_P(return_value) = IS_STRING;
if (Z_STRVAL_P(return_value)) {
Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
Z_STRVAL_P(return_value) = estrndup(Z_STRVAL_P(return_value), Z_STRLEN_P(return_value));
- Z_TYPE_P(return_value) = IS_STRING;
} else {
Z_STRVAL_P(return_value) = empty_string;
}
@@ -3758,9 +3769,6 @@ PHP_FUNCTION(pg_convert)
}
/* }}} */
-#define PGSQL_MAX_LENGTH_OF_LONG 30
-#define PGSQL_MAX_LENGTH_OF_DOUBLE 60
-
/* {{{ php_pgsql_insert
*/
PHPAPI int php_pgsql_insert(PGconn *pg_link, const char *table, zval *var_array, zend_bool convert, zend_bool async TSRMLS_DC)