prefix internal API; ensure raphf is built first in-tree
[m6w6/ext-pq] / src / php_pqres.c
index eaaac6927dc96418e4708fac4413c2e7a2a791aa..1ad5f1dd681aa7e636bc276b5a8a61c8dee04b67 100644 (file)
 #include <php.h>
 
 #include <ext/spl/spl_iterators.h>
-#include <ext/json/php_json.h>
+#if PHP_PQ_HAVE_PHP_JSON_H
+#include <php_json.h> /* we've added the include directory to INCLUDES */
+#endif
+
 #include <libpq-events.h>
 
 #include "php_pq.h"
@@ -79,7 +82,9 @@ static STATUS php_pqres_iterator_valid(zend_object_iterator *i TSRMLS_DC)
 
        switch (PQresultStatus(obj->intern->res)) {
        case PGRES_TUPLES_OK:
+#ifdef HAVE_PGRES_SINGLE_TUPLE
        case PGRES_SINGLE_TUPLE:
+#endif
                if (PQntuples(obj->intern->res) <= iter->index) {
                        return FAILURE;
                }
@@ -98,10 +103,13 @@ zval *php_pqres_typed_zval(php_pqres_t *res, char *val, size_t len, Oid typ TSRM
        MAKE_STD_ZVAL(zv);
 
        if (SUCCESS == zend_hash_index_find(&res->converters, typ, (void *) &zconv)) {
-               zval *tmp = NULL;
+               zval *ztype, *tmp = NULL;
 
+               MAKE_STD_ZVAL(ztype);
+               ZVAL_LONG(ztype, typ);
                ZVAL_STRINGL(zv, val, len, 1);
-               zend_call_method_with_1_params(zconv, NULL, NULL, "convertfromstring", &tmp, zv);
+               zend_call_method_with_2_params(zconv, NULL, NULL, "convertfromstring", &tmp, zv, ztype);
+               zval_ptr_dtor(&ztype);
 
                if (tmp) {
                        zval_ptr_dtor(&zv);
@@ -118,10 +126,9 @@ zval *php_pqres_typed_zval(php_pqres_t *res, char *val, size_t len, Oid typ TSRM
                }
                ZVAL_BOOL(zv, *val == 't');
                break;
-#if SIZEOF_LONG >= 8
+
        case PHP_PQ_OID_INT8:
        case PHP_PQ_OID_TID:
-#endif
        case PHP_PQ_OID_INT4:
        case PHP_PQ_OID_INT2:
        case PHP_PQ_OID_XID:
@@ -129,7 +136,21 @@ zval *php_pqres_typed_zval(php_pqres_t *res, char *val, size_t len, Oid typ TSRM
                if (!(res->auto_convert & PHP_PQRES_CONV_INT)) {
                        goto noconversion;
                }
-               ZVAL_LONG(zv, zend_atol(val, len));
+               {
+                       long lval;
+                       double dval;
+
+                       switch (is_numeric_string(val, len, &lval, &dval, 0)) {
+                               case IS_LONG:
+                                       ZVAL_LONG(zv, lval);
+                                       break;
+                               case IS_DOUBLE:
+                                       ZVAL_DOUBLE(zv, dval);
+                                       break;
+                               default:
+                                       goto noconversion;
+                       }
+               }
                break;
 
        case PHP_PQ_OID_FLOAT4:
@@ -168,7 +189,7 @@ zval *php_pqres_typed_zval(php_pqres_t *res, char *val, size_t len, Oid typ TSRM
                php_pqdt_from_string(val, len, "Y-m-d H:i:s.uO", zv TSRMLS_CC);
                break;
 
-#ifdef PHP_PQ_OID_JSON
+#if PHP_PQ_HAVE_PHP_JSON_H && defined(PHP_PQ_OID_JSON)
 #      ifdef PHP_PQ_OID_JSONB
        case PHP_PQ_OID_JSONB:
 #      endif
@@ -679,7 +700,7 @@ static PHP_METHOD(pqres, bind) {
                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to bind column %s@%d", col.name, col.num);
                                        RETVAL_FALSE;
                                } else {
-                                       zend_hash_sort(&obj->intern->bound, zend_qsort, compare_index, 0 TSRMLS_CC);
+                                       zend_hash_sort(&obj->intern->bound, zend_qsort, php_pq_compare_index, 0 TSRMLS_CC);
                                        RETVAL_TRUE;
                                }
                        }
@@ -1069,7 +1090,14 @@ static PHP_METHOD(pqres, fetchAll) {
 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_count, 0, 0, 0)
 ZEND_END_ARG_INFO();
 static PHP_METHOD(pqres, count) {
-       if (SUCCESS == zend_parse_parameters_none()) {
+       zend_error_handling zeh;
+       STATUS rv;
+
+       zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh TSRMLS_CC);
+       rv = zend_parse_parameters_none();
+       zend_restore_error_handling(&zeh TSRMLS_CC);
+
+       if (SUCCESS == rv) {
                long count;
 
                if (SUCCESS != php_pqres_count_elements(getThis(), &count TSRMLS_CC)) {
@@ -1083,7 +1111,14 @@ static PHP_METHOD(pqres, count) {
 ZEND_BEGIN_ARG_INFO_EX(ai_pqres_desc, 0, 0, 0)
 ZEND_END_ARG_INFO();
 static PHP_METHOD(pqres, desc) {
-       if (SUCCESS == zend_parse_parameters_none()) {
+       zend_error_handling zeh;
+       STATUS rv;
+
+       zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh TSRMLS_CC);
+       rv = zend_parse_parameters_none();
+       zend_restore_error_handling(&zeh TSRMLS_CC);
+
+       if (SUCCESS == rv) {
                php_pqres_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
 
                if (!obj->intern) {
@@ -1186,8 +1221,12 @@ PHP_MINIT_FUNCTION(pqres)
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("BAD_RESPONSE"), PGRES_BAD_RESPONSE TSRMLS_CC);
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("NONFATAL_ERROR"), PGRES_NONFATAL_ERROR TSRMLS_CC);
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("FATAL_ERROR"), PGRES_FATAL_ERROR TSRMLS_CC);
+#ifdef HAVE_PGRES_COPY_BOTH
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("COPY_BOTH"), PGRES_COPY_BOTH TSRMLS_CC);
+#endif
+#ifdef HAVE_PGRES_SINGLE_TUPLE
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("SINGLE_TUPLE"), PGRES_SINGLE_TUPLE TSRMLS_CC);
+#endif
 
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("FETCH_ARRAY"), PHP_PQRES_FETCH_ARRAY TSRMLS_CC);
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("FETCH_ASSOC"), PHP_PQRES_FETCH_ASSOC TSRMLS_CC);
@@ -1199,7 +1238,9 @@ PHP_MINIT_FUNCTION(pqres)
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("CONV_SCALAR"), PHP_PQRES_CONV_SCALAR TSRMLS_CC);
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("CONV_ARRAY"), PHP_PQRES_CONV_ARRAY TSRMLS_CC);
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("CONV_DATETIME"), PHP_PQRES_CONV_DATETIME TSRMLS_CC);
+#if PHP_PQ_HAVE_PHP_JSON_H
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("CONV_JSON"), PHP_PQRES_CONV_JSON TSRMLS_CC);
+#endif
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("CONV_ALL"), PHP_PQRES_CONV_ALL TSRMLS_CC);
 
        return SUCCESS;