update from docs
[m6w6/ext-pq] / src / php_pqres.c
index 03ad83a8348aacabec8e17211ec513ef0787c254..0197732f510d2f63dfd12d8977ca86cf7a646afc 100644 (file)
@@ -17,6 +17,7 @@
 #include <php.h>
 
 #include <ext/spl/spl_iterators.h>
+#include <ext/json/php_json.h>
 #include <libpq-events.h>
 
 #include "php_pq.h"
@@ -167,6 +168,18 @@ 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
+#      ifdef PHP_PQ_OID_JSONB
+       case PHP_PQ_OID_JSONB:
+#      endif
+       case PHP_PQ_OID_JSON:
+               if (!(res->auto_convert & PHP_PQRES_CONV_JSON)) {
+                       goto noconversion;
+               }
+               php_json_decode_ex(zv, val, len, 0, 512 /* PHP_JSON_DEFAULT_DEPTH */ TSRMLS_CC);
+               break;
+#endif
+
        default:
                if (!(res->auto_convert & PHP_PQRES_CONV_ARRAY)) {
                        goto noconversion;
@@ -593,20 +606,28 @@ static STATUS column_nn(php_pqres_object_t *obj, zval *zcol, php_pqres_col_t *co
        long index = -1;
        char *name = NULL;
 
-       switch (Z_TYPE_P(zcol)) {
-       case IS_LONG:
-               index = Z_LVAL_P(zcol);
-               break;
+       if (!zcol) {
+               index = 0;
+       } else {
+               switch (Z_TYPE_P(zcol)) {
+               case IS_NULL:
+                       index = 0;
+                       break;
 
-       default:
-               convert_to_string(zcol);
-               /* no break */
+               case IS_LONG:
+                       index = Z_LVAL_P(zcol);
+                       break;
 
-       case IS_STRING:
-               if (!is_numeric_string(Z_STRVAL_P(zcol), Z_STRLEN_P(zcol), &index, NULL, 0)) {
-                       name = Z_STRVAL_P(zcol);
+               default:
+                       convert_to_string(zcol);
+                       /* no break */
+
+               case IS_STRING:
+                       if (!is_numeric_string(Z_STRVAL_P(zcol), Z_STRLEN_P(zcol), &index, NULL, 0)) {
+                               name = Z_STRVAL_P(zcol);
+                       }
+                       break;
                }
-               break;
        }
 
        if (name) {
@@ -634,8 +655,14 @@ ZEND_BEGIN_ARG_INFO_EX(ai_pqres_bind, 0, 0, 2)
 ZEND_END_ARG_INFO();
 static PHP_METHOD(pqres, bind) {
        zval *zcol, *zref;
+       zend_error_handling zeh;
+       STATUS rv;
+
+       zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh TSRMLS_CC);
+       rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/z", &zcol, &zref);
+       zend_restore_error_handling(&zeh TSRMLS_CC);
 
-       if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/z", &zcol, &zref)) {
+       if (SUCCESS == rv) {
                php_pqres_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
 
                if (!obj->intern) {
@@ -767,17 +794,17 @@ static zval **column_at(zval *row, int col TSRMLS_DC)
        return data;
 }
 
-ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col, 0, 0, 2)
-       ZEND_ARG_INFO(0, col)
+ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_col, 0, 0, 1)
        ZEND_ARG_INFO(1, ref)
+       ZEND_ARG_INFO(0, col)
 ZEND_END_ARG_INFO();
 static PHP_METHOD(pqres, fetchCol) {
        zend_error_handling zeh;
-       zval *zcol, *zref;
+       zval *zcol = NULL, *zref;
        STATUS rv;
 
        zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh TSRMLS_CC);
-       rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/z", &zcol, &zref);
+       rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|z/!", &zref, &zcol);
        zend_restore_error_handling(&zeh TSRMLS_CC);
 
        if (SUCCESS == rv) {
@@ -790,9 +817,7 @@ static PHP_METHOD(pqres, fetchCol) {
 
                        zend_replace_error_handling(EH_THROW, exce(EX_RUNTIME), &zeh TSRMLS_CC);
                        php_pqres_iteration(getThis(), obj, obj->intern->iter ? obj->intern->iter->fetch_type : 0, &row TSRMLS_CC);
-                       if (!row) {
-                               RETVAL_FALSE;
-                       } else {
+                       if (row) {
                                php_pqres_col_t col;
 
                                if (SUCCESS != column_nn(obj, zcol, &col TSRMLS_CC)) {
@@ -814,16 +839,16 @@ static PHP_METHOD(pqres, fetchCol) {
        }
 }
 
-ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_all_cols, 0, 0, 1)
+ZEND_BEGIN_ARG_INFO_EX(ai_pqres_fetch_all_cols, 0, 0, 0)
        ZEND_ARG_INFO(0, col)
 ZEND_END_ARG_INFO();
 static PHP_METHOD(pqres, fetchAllCols) {
        zend_error_handling zeh;
-       zval *zcol;
+       zval *zcol = NULL;
        STATUS rv;
 
        zend_replace_error_handling(EH_THROW, exce(EX_INVALID_ARGUMENT), &zeh TSRMLS_CC);
-       rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zcol);
+       rv = zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|z!", &zcol);
        zend_restore_error_handling(&zeh TSRMLS_CC);
 
        if (SUCCESS == rv) {
@@ -835,7 +860,6 @@ static PHP_METHOD(pqres, fetchAllCols) {
                        php_pqres_col_t col;
 
                        zend_replace_error_handling(EH_THROW, exce(EX_RUNTIME), &zeh TSRMLS_CC);
-
                        if (SUCCESS == column_nn(obj, zcol, &col TSRMLS_CC)) {
                                int r, rows = PQntuples(obj->intern->res);
 
@@ -844,7 +868,6 @@ static PHP_METHOD(pqres, fetchAllCols) {
                                        add_next_index_zval(return_value, php_pqres_get_col(obj->intern, r, col.num TSRMLS_CC));
                                }
                        }
-
                        zend_restore_error_handling(&zeh TSRMLS_CC);
                }
        }
@@ -1113,7 +1136,7 @@ PHP_MINIT_FUNCTION(pqres)
        php_pqres_object_handlers.get_properties = php_pq_object_properties;
        php_pqres_object_handlers.count_elements = php_pqres_count_elements;
 
-       zend_hash_init(&php_pqres_object_prophandlers, 6, NULL, NULL, 1);
+       zend_hash_init(&php_pqres_object_prophandlers, 8, NULL, NULL, 1);
 
        zend_declare_property_null(php_pqres_class_entry, ZEND_STRL("status"), ZEND_ACC_PUBLIC TSRMLS_CC);
        ph.read = php_pqres_object_read_status;
@@ -1145,7 +1168,7 @@ PHP_MINIT_FUNCTION(pqres)
        zend_hash_add(&php_pqres_object_prophandlers, "fetchType", sizeof("fetchType"), (void *) &ph, sizeof(ph), NULL);
        ph.write = NULL;
 
-       zend_declare_property_long(php_pqres_class_entry, ZEND_STRL("autoConvert"), PHP_PQRES_FETCH_ARRAY, ZEND_ACC_PUBLIC TSRMLS_CC);
+       zend_declare_property_long(php_pqres_class_entry, ZEND_STRL("autoConvert"), PHP_PQRES_CONV_ALL, ZEND_ACC_PUBLIC TSRMLS_CC);
        ph.read = php_pqres_object_read_auto_conv;
        ph.write = php_pqres_object_write_auto_conv;
        zend_hash_add(&php_pqres_object_prophandlers, "autoConvert", sizeof("autoConvert"), (void *) &ph, sizeof(ph), NULL);
@@ -1172,6 +1195,7 @@ 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);
+       zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("CONV_JSON"), PHP_PQRES_CONV_JSON TSRMLS_CC);
        zend_declare_class_constant_long(php_pqres_class_entry, ZEND_STRL("CONV_ALL"), PHP_PQRES_CONV_ALL TSRMLS_CC);
 
        return SUCCESS;