From: Nikita Popov Date: Fri, 11 Sep 2020 15:28:20 +0000 (+0200) Subject: Use string|int union types in pgsql X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f29bfc0bd8c0dc152e6115ec260957e1617d08dc;p=php Use string|int union types in pgsql For "field name or field offset" parameters. Also make $ctor_params an ?array parameter. --- diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index 30f9772656..c5ee4ffebc 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -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) { diff --git a/ext/pgsql/pgsql.stub.php b/ext/pgsql/pgsql.stub.php index c524763ece..5537b8ff6f 100644 --- a/ext/pgsql/pgsql.stub.php +++ b/ext/pgsql/pgsql.stub.php @@ -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 {} diff --git a/ext/pgsql/pgsql_arginfo.h b/ext/pgsql/pgsql_arginfo.h index 2724464432..cfbdc18c2b 100644 --- a/ext/pgsql/pgsql_arginfo.h +++ b/ext/pgsql/pgsql_arginfo.h @@ -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