]> granicus.if.org Git - php/commitdiff
Use string|int union types in pgsql
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 11 Sep 2020 15:28:20 +0000 (17:28 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 11 Sep 2020 15:33:09 +0000 (17:33 +0200)
For "field name or field offset" parameters.

Also make $ctor_params an ?array parameter.

ext/pgsql/pgsql.c
ext/pgsql/pgsql.stub.php
ext/pgsql/pgsql_arginfo.h

index 30f97726568d7c2c75f57635217d389746b3930a..c5ee4ffebc66d2fad336a12949294600dbd9e464 100644 (file)
@@ -1723,20 +1723,24 @@ PHP_FUNCTION(pg_field_num)
 /* {{{ Returns values from a result identifier */
 PHP_FUNCTION(pg_fetch_result)
 {
-       zval *result, *field=NULL;
-       zend_long row;
+       zval *result;
+       zend_string *field_name;
+       zend_long row, field_offset;
        PGresult *pgsql_result;
        pgsql_result_handle *pg_result;
-       int field_offset, pgsql_row, argc = ZEND_NUM_ARGS();
+       int pgsql_row, argc = ZEND_NUM_ARGS();
 
        if (argc == 2) {
-               if (zend_parse_parameters(argc, "rz", &result, &field) == FAILURE) {
-                       RETURN_THROWS();
-               }
+               ZEND_PARSE_PARAMETERS_START(2, 2)
+                       Z_PARAM_RESOURCE(result)
+                       Z_PARAM_STR_OR_LONG(field_name, field_offset)
+               ZEND_PARSE_PARAMETERS_END();
        } else {
-               if (zend_parse_parameters(argc, "rlz", &result, &row, &field) == FAILURE) {
-                       RETURN_THROWS();
-               }
+               ZEND_PARSE_PARAMETERS_START(3, 3)
+                       Z_PARAM_RESOURCE(result)
+                       Z_PARAM_LONG(row)
+                       Z_PARAM_STR_OR_LONG(field_name, field_offset)
+               ZEND_PARSE_PARAMETERS_END();
        }
 
        if ((pg_result = (pgsql_result_handle *)zend_fetch_resource(Z_RES_P(result), "PostgreSQL result", le_result)) == NULL) {
@@ -1761,22 +1765,17 @@ PHP_FUNCTION(pg_fetch_result)
                }
                pgsql_row = (int)row;
        }
-       switch (Z_TYPE_P(field)) {
-               case IS_STRING:
-                       field_offset = PQfnumber(pgsql_result, Z_STRVAL_P(field));
-                       if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
-                               php_error_docref(NULL, E_WARNING, "Bad column offset specified");
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       convert_to_long_ex(field);
-                       if (Z_LVAL_P(field) < 0 || Z_LVAL_P(field) >= PQnfields(pgsql_result)) {
-                               php_error_docref(NULL, E_WARNING, "Bad column offset specified");
-                               RETURN_FALSE;
-                       }
-                       field_offset = (int)Z_LVAL_P(field);
-                       break;
+       if (field_name) {
+               field_offset = PQfnumber(pgsql_result, ZSTR_VAL(field_name));
+               if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
+                       php_error_docref(NULL, E_WARNING, "Bad column offset specified");
+                       RETURN_FALSE;
+               }
+       } else {
+               if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
+                       php_error_docref(NULL, E_WARNING, "Bad column offset specified");
+                       RETURN_FALSE;
+               }
        }
 
        if (PQgetisnull(pgsql_result, pgsql_row, field_offset)) {
@@ -1802,7 +1801,7 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_
        zend_class_entry *ce = NULL;
 
        if (into_object) {
-               if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l!Cz", &result, &row, &row_is_null, &ce, &ctor_params) == FAILURE) {
+               if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l!Ca!", &result, &row, &row_is_null, &ce, &ctor_params) == FAILURE) {
                        RETURN_THROWS();
                }
                if (!ce) {
@@ -1899,7 +1898,7 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_
                        fci.param_count = 0;
                        fci.named_params = NULL;
 
-                       if (ctor_params && Z_TYPE_P(ctor_params) != IS_NULL) {
+                       if (ctor_params) {
                                if (zend_fcall_info_args(&fci, ctor_params) == FAILURE) {
                                        /* Two problems why we throw exceptions here: PHP is typeless
                                         * and hence passing one argument that's not an array could be
@@ -2068,20 +2067,24 @@ PHP_FUNCTION(pg_result_seek)
 /* {{{ php_pgsql_data_info */
 static void php_pgsql_data_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type)
 {
-       zval *result, *field;
-       zend_long row;
+       zval *result;
+       zend_string *field_name;
+       zend_long row, field_offset;
        PGresult *pgsql_result;
        pgsql_result_handle *pg_result;
-       int field_offset, pgsql_row, argc = ZEND_NUM_ARGS();
+       int pgsql_row, argc = ZEND_NUM_ARGS();
 
        if (argc == 2) {
-               if (zend_parse_parameters(argc, "rz", &result, &field) == FAILURE) {
-                       RETURN_THROWS();
-               }
+               ZEND_PARSE_PARAMETERS_START(2, 2)
+                       Z_PARAM_RESOURCE(result)
+                       Z_PARAM_STR_OR_LONG(field_name, field_offset)
+               ZEND_PARSE_PARAMETERS_END();
        } else {
-               if (zend_parse_parameters(argc, "rlz", &result, &row, &field) == FAILURE) {
-                       RETURN_THROWS();
-               }
+               ZEND_PARSE_PARAMETERS_START(3, 3)
+                       Z_PARAM_RESOURCE(result)
+                       Z_PARAM_LONG(row)
+                       Z_PARAM_STR_OR_LONG(field_name, field_offset)
+               ZEND_PARSE_PARAMETERS_END();
        }
 
        if ((pg_result = (pgsql_result_handle *)zend_fetch_resource(Z_RES_P(result), "PostgreSQL result", le_result)) == NULL) {
@@ -2106,22 +2109,17 @@ static void php_pgsql_data_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type)
                pgsql_row = (int)row;
        }
 
-       switch (Z_TYPE_P(field)) {
-               case IS_STRING:
-                       field_offset = PQfnumber(pgsql_result, Z_STRVAL_P(field));
-                       if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
-                               php_error_docref(NULL, E_WARNING, "Bad column offset specified");
-                               RETURN_FALSE;
-                       }
-                       break;
-               default:
-                       convert_to_long_ex(field);
-                       if (Z_LVAL_P(field) < 0 || Z_LVAL_P(field) >= PQnfields(pgsql_result)) {
-                               php_error_docref(NULL, E_WARNING, "Bad column offset specified");
-                               RETURN_FALSE;
-                       }
-                       field_offset = (int)Z_LVAL_P(field);
-                       break;
+       if (field_name) {
+               field_offset = PQfnumber(pgsql_result, ZSTR_VAL(field_name));
+               if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
+                       php_error_docref(NULL, E_WARNING, "Bad column offset specified");
+                       RETURN_FALSE;
+               }
+       } else {
+               if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
+                       php_error_docref(NULL, E_WARNING, "Bad column offset specified");
+                       RETURN_FALSE;
+               }
        }
 
        switch (entry_type) {
index c524763ece7a7d4969366340cc91cf800535dd91..5537b8ff6f83b970fac46c44af3aad4b0c8e6589 100644 (file)
@@ -155,17 +155,15 @@ function pg_fieldnum($result, string $field_name): int {}
 /**
  * @param resource $result
  * @param string|int $row_number
- * @param string|int $field
  */
-function pg_fetch_result($result, $row_number, $field = UNKNOWN): string|false|null {}
+function pg_fetch_result($result, $row_number, string|int $field = UNKNOWN): string|false|null {}
 
 /**
  * @param resource $result
  * @param string|int $row_number
- * @param string|int $field
  * @alias pg_fetch_result
  */
-function pg_result($result, $row_number, $field = UNKNOWN): string|false|null {}
+function pg_result($result, $row_number, string|int $field = UNKNOWN): string|false|null {}
 
 /**
  * @param resource $result
@@ -182,11 +180,8 @@ function pg_fetch_assoc($result, ?int $row_number = null): array|false {}
  */
 function pg_fetch_array($result, ?int $row_number = null, int $result_type = PGSQL_BOTH): array|false {}
 
-/**
- * @param resource $result
- * @param array|null $ctor_params
- */
-function pg_fetch_object($result, ?int $row_number = null, string $class_name = "stdClass", $ctor_params = null): object|false {}
+/** @param resource $result */
+function pg_fetch_object($result, ?int $row_number = null, string $class_name = "stdClass", ?array $ctor_params = null): object|false {}
 
 /** @param resource $result */
 function pg_fetch_all($result, int $result_type = PGSQL_ASSOC): array|false {}
@@ -200,32 +195,28 @@ function pg_result_seek($result, int $row_number): bool {}
 /**
  * @param resource $result
  * @param string|int $row_number
- * @param string|int $field
  */
-function pg_field_prtlen($result, $row_number, $field = UNKNOWN): int|false {}
+function pg_field_prtlen($result, $row_number, string|int $field = UNKNOWN): int|false {}
 
 /**
  * @param resource $result
  * @param string|int $row_number
- * @param string|int $field
  * @alias pg_field_prtlen
  */
-function pg_fieldprtlen($result, $row_number, $field = UNKNOWN): int|false {}
+function pg_fieldprtlen($result, $row_number, string|int $field = UNKNOWN): int|false {}
 
 /**
  * @param resource $result
  * @param string|int $row_number
- * @param string|int $field
  */
-function pg_field_is_null($result, $row_number, $field = UNKNOWN): int|false {}
+function pg_field_is_null($result, $row_number, string|int $field = UNKNOWN): int|false {}
 
 /**
  * @param resource $result
  * @param string|int $row_number
- * @param string|int $field
  * @alias pg_field_is_null
  */
-function pg_fieldisnull($result, $row_number, $field = UNKNOWN): int|false {}
+function pg_fieldisnull($result, $row_number, string|int $field = UNKNOWN): int|false {}
 
 /** @param resource $result */
 function pg_free_result($result): bool {}
@@ -351,7 +342,7 @@ function pg_loimport($connection, $filename = UNKNOWN, $large_object_id = UNKNOW
  * @param string|int $filename
  * @return resource|false
  */
-function pg_lo_export($connection,$large_object_id = UNKNOWN, $filename = UNKNOWN): bool {}
+function pg_lo_export($connection, $large_object_id = UNKNOWN, $filename = UNKNOWN): bool {}
 
 /**
  * @param resource|string|int $connection
@@ -360,7 +351,7 @@ function pg_lo_export($connection,$large_object_id = UNKNOWN, $filename = UNKNOW
  * @return resource|false
  * @alias pg_lo_export
  */
-function pg_loexport($connection,$large_object_id = UNKNOWN, $filename = UNKNOWN): bool {}
+function pg_loexport($connection, $large_object_id = UNKNOWN, $filename = UNKNOWN): bool {}
 
 /** @param resource $large_object */
 function pg_lo_seek($large_object, int $offset, int $whence = SEEK_CUR): bool {}
index 2724464432a744b9f574c5dcfaa524e7d0b9316a..cfbdc18c2b43b14192aa6452494168ddcd98c8aa 100644 (file)
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 2ae99621cf060e986e354587ec34766d12b89d6c */
+ * Stub hash: 38d1c57d8bf23dcd17d4f775cdf4c2df61087331 */
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_pg_connect, 0, 0, 1)
        ZEND_ARG_TYPE_INFO(0, connection_string, IS_STRING, 0)
@@ -126,7 +126,7 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pg_fetch_result, 0, 2, MAY_BE_STRING|MAY_BE_FALSE|MAY_BE_NULL)
        ZEND_ARG_INFO(0, result)
        ZEND_ARG_INFO(0, row_number)
-       ZEND_ARG_INFO(0, field)
+       ZEND_ARG_TYPE_MASK(0, field, MAY_BE_STRING|MAY_BE_LONG, NULL)
 ZEND_END_ARG_INFO()
 
 #define arginfo_pg_result arginfo_pg_fetch_result
@@ -152,7 +152,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pg_fetch_object, 0, 1, MAY_BE_OB
        ZEND_ARG_INFO(0, result)
        ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, row_number, IS_LONG, 1, "null")
        ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, class_name, IS_STRING, 0, "\"stdClass\"")
-       ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, ctor_params, "null")
+       ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, ctor_params, IS_ARRAY, 1, "null")
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pg_fetch_all, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE)
@@ -173,7 +173,7 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pg_field_prtlen, 0, 2, MAY_BE_LONG|MAY_BE_FALSE)
        ZEND_ARG_INFO(0, result)
        ZEND_ARG_INFO(0, row_number)
-       ZEND_ARG_INFO(0, field)
+       ZEND_ARG_TYPE_MASK(0, field, MAY_BE_STRING|MAY_BE_LONG, NULL)
 ZEND_END_ARG_INFO()
 
 #define arginfo_pg_fieldprtlen arginfo_pg_field_prtlen