Skip to content

Commit f29bfc0

Browse files
committed
Use string|int union types in pgsql
For "field name or field offset" parameters. Also make $ctor_params an ?array parameter.
1 parent b7fe1b6 commit f29bfc0

File tree

3 files changed

+64
-75
lines changed

3 files changed

+64
-75
lines changed

ext/pgsql/pgsql.c

Lines changed: 50 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1723,20 +1723,24 @@ PHP_FUNCTION(pg_field_num)
17231723
/* {{{ Returns values from a result identifier */
17241724
PHP_FUNCTION(pg_fetch_result)
17251725
{
1726-
zval *result, *field=NULL;
1727-
zend_long row;
1726+
zval *result;
1727+
zend_string *field_name;
1728+
zend_long row, field_offset;
17281729
PGresult *pgsql_result;
17291730
pgsql_result_handle *pg_result;
1730-
int field_offset, pgsql_row, argc = ZEND_NUM_ARGS();
1731+
int pgsql_row, argc = ZEND_NUM_ARGS();
17311732

17321733
if (argc == 2) {
1733-
if (zend_parse_parameters(argc, "rz", &result, &field) == FAILURE) {
1734-
RETURN_THROWS();
1735-
}
1734+
ZEND_PARSE_PARAMETERS_START(2, 2)
1735+
Z_PARAM_RESOURCE(result)
1736+
Z_PARAM_STR_OR_LONG(field_name, field_offset)
1737+
ZEND_PARSE_PARAMETERS_END();
17361738
} else {
1737-
if (zend_parse_parameters(argc, "rlz", &result, &row, &field) == FAILURE) {
1738-
RETURN_THROWS();
1739-
}
1739+
ZEND_PARSE_PARAMETERS_START(3, 3)
1740+
Z_PARAM_RESOURCE(result)
1741+
Z_PARAM_LONG(row)
1742+
Z_PARAM_STR_OR_LONG(field_name, field_offset)
1743+
ZEND_PARSE_PARAMETERS_END();
17401744
}
17411745

17421746
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)
17611765
}
17621766
pgsql_row = (int)row;
17631767
}
1764-
switch (Z_TYPE_P(field)) {
1765-
case IS_STRING:
1766-
field_offset = PQfnumber(pgsql_result, Z_STRVAL_P(field));
1767-
if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
1768-
php_error_docref(NULL, E_WARNING, "Bad column offset specified");
1769-
RETURN_FALSE;
1770-
}
1771-
break;
1772-
default:
1773-
convert_to_long_ex(field);
1774-
if (Z_LVAL_P(field) < 0 || Z_LVAL_P(field) >= PQnfields(pgsql_result)) {
1775-
php_error_docref(NULL, E_WARNING, "Bad column offset specified");
1776-
RETURN_FALSE;
1777-
}
1778-
field_offset = (int)Z_LVAL_P(field);
1779-
break;
1768+
if (field_name) {
1769+
field_offset = PQfnumber(pgsql_result, ZSTR_VAL(field_name));
1770+
if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
1771+
php_error_docref(NULL, E_WARNING, "Bad column offset specified");
1772+
RETURN_FALSE;
1773+
}
1774+
} else {
1775+
if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
1776+
php_error_docref(NULL, E_WARNING, "Bad column offset specified");
1777+
RETURN_FALSE;
1778+
}
17801779
}
17811780

17821781
if (PQgetisnull(pgsql_result, pgsql_row, field_offset)) {
@@ -1802,7 +1801,7 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_
18021801
zend_class_entry *ce = NULL;
18031802

18041803
if (into_object) {
1805-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l!Cz", &result, &row, &row_is_null, &ce, &ctor_params) == FAILURE) {
1804+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|l!Ca!", &result, &row, &row_is_null, &ce, &ctor_params) == FAILURE) {
18061805
RETURN_THROWS();
18071806
}
18081807
if (!ce) {
@@ -1899,7 +1898,7 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_
18991898
fci.param_count = 0;
19001899
fci.named_params = NULL;
19011900

1902-
if (ctor_params && Z_TYPE_P(ctor_params) != IS_NULL) {
1901+
if (ctor_params) {
19031902
if (zend_fcall_info_args(&fci, ctor_params) == FAILURE) {
19041903
/* Two problems why we throw exceptions here: PHP is typeless
19051904
* and hence passing one argument that's not an array could be
@@ -2068,20 +2067,24 @@ PHP_FUNCTION(pg_result_seek)
20682067
/* {{{ php_pgsql_data_info */
20692068
static void php_pgsql_data_info(INTERNAL_FUNCTION_PARAMETERS, int entry_type)
20702069
{
2071-
zval *result, *field;
2072-
zend_long row;
2070+
zval *result;
2071+
zend_string *field_name;
2072+
zend_long row, field_offset;
20732073
PGresult *pgsql_result;
20742074
pgsql_result_handle *pg_result;
2075-
int field_offset, pgsql_row, argc = ZEND_NUM_ARGS();
2075+
int pgsql_row, argc = ZEND_NUM_ARGS();
20762076

20772077
if (argc == 2) {
2078-
if (zend_parse_parameters(argc, "rz", &result, &field) == FAILURE) {
2079-
RETURN_THROWS();
2080-
}
2078+
ZEND_PARSE_PARAMETERS_START(2, 2)
2079+
Z_PARAM_RESOURCE(result)
2080+
Z_PARAM_STR_OR_LONG(field_name, field_offset)
2081+
ZEND_PARSE_PARAMETERS_END();
20812082
} else {
2082-
if (zend_parse_parameters(argc, "rlz", &result, &row, &field) == FAILURE) {
2083-
RETURN_THROWS();
2084-
}
2083+
ZEND_PARSE_PARAMETERS_START(3, 3)
2084+
Z_PARAM_RESOURCE(result)
2085+
Z_PARAM_LONG(row)
2086+
Z_PARAM_STR_OR_LONG(field_name, field_offset)
2087+
ZEND_PARSE_PARAMETERS_END();
20852088
}
20862089

20872090
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)
21062109
pgsql_row = (int)row;
21072110
}
21082111

2109-
switch (Z_TYPE_P(field)) {
2110-
case IS_STRING:
2111-
field_offset = PQfnumber(pgsql_result, Z_STRVAL_P(field));
2112-
if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
2113-
php_error_docref(NULL, E_WARNING, "Bad column offset specified");
2114-
RETURN_FALSE;
2115-
}
2116-
break;
2117-
default:
2118-
convert_to_long_ex(field);
2119-
if (Z_LVAL_P(field) < 0 || Z_LVAL_P(field) >= PQnfields(pgsql_result)) {
2120-
php_error_docref(NULL, E_WARNING, "Bad column offset specified");
2121-
RETURN_FALSE;
2122-
}
2123-
field_offset = (int)Z_LVAL_P(field);
2124-
break;
2112+
if (field_name) {
2113+
field_offset = PQfnumber(pgsql_result, ZSTR_VAL(field_name));
2114+
if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
2115+
php_error_docref(NULL, E_WARNING, "Bad column offset specified");
2116+
RETURN_FALSE;
2117+
}
2118+
} else {
2119+
if (field_offset < 0 || field_offset >= PQnfields(pgsql_result)) {
2120+
php_error_docref(NULL, E_WARNING, "Bad column offset specified");
2121+
RETURN_FALSE;
2122+
}
21252123
}
21262124

21272125
switch (entry_type) {

ext/pgsql/pgsql.stub.php

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -155,17 +155,15 @@ function pg_fieldnum($result, string $field_name): int {}
155155
/**
156156
* @param resource $result
157157
* @param string|int $row_number
158-
* @param string|int $field
159158
*/
160-
function pg_fetch_result($result, $row_number, $field = UNKNOWN): string|false|null {}
159+
function pg_fetch_result($result, $row_number, string|int $field = UNKNOWN): string|false|null {}
161160

162161
/**
163162
* @param resource $result
164163
* @param string|int $row_number
165-
* @param string|int $field
166164
* @alias pg_fetch_result
167165
*/
168-
function pg_result($result, $row_number, $field = UNKNOWN): string|false|null {}
166+
function pg_result($result, $row_number, string|int $field = UNKNOWN): string|false|null {}
169167

170168
/**
171169
* @param resource $result
@@ -182,11 +180,8 @@ function pg_fetch_assoc($result, ?int $row_number = null): array|false {}
182180
*/
183181
function pg_fetch_array($result, ?int $row_number = null, int $result_type = PGSQL_BOTH): array|false {}
184182

185-
/**
186-
* @param resource $result
187-
* @param array|null $ctor_params
188-
*/
189-
function pg_fetch_object($result, ?int $row_number = null, string $class_name = "stdClass", $ctor_params = null): object|false {}
183+
/** @param resource $result */
184+
function pg_fetch_object($result, ?int $row_number = null, string $class_name = "stdClass", ?array $ctor_params = null): object|false {}
190185

191186
/** @param resource $result */
192187
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 {}
200195
/**
201196
* @param resource $result
202197
* @param string|int $row_number
203-
* @param string|int $field
204198
*/
205-
function pg_field_prtlen($result, $row_number, $field = UNKNOWN): int|false {}
199+
function pg_field_prtlen($result, $row_number, string|int $field = UNKNOWN): int|false {}
206200

207201
/**
208202
* @param resource $result
209203
* @param string|int $row_number
210-
* @param string|int $field
211204
* @alias pg_field_prtlen
212205
*/
213-
function pg_fieldprtlen($result, $row_number, $field = UNKNOWN): int|false {}
206+
function pg_fieldprtlen($result, $row_number, string|int $field = UNKNOWN): int|false {}
214207

215208
/**
216209
* @param resource $result
217210
* @param string|int $row_number
218-
* @param string|int $field
219211
*/
220-
function pg_field_is_null($result, $row_number, $field = UNKNOWN): int|false {}
212+
function pg_field_is_null($result, $row_number, string|int $field = UNKNOWN): int|false {}
221213

222214
/**
223215
* @param resource $result
224216
* @param string|int $row_number
225-
* @param string|int $field
226217
* @alias pg_field_is_null
227218
*/
228-
function pg_fieldisnull($result, $row_number, $field = UNKNOWN): int|false {}
219+
function pg_fieldisnull($result, $row_number, string|int $field = UNKNOWN): int|false {}
229220

230221
/** @param resource $result */
231222
function pg_free_result($result): bool {}
@@ -351,7 +342,7 @@ function pg_loimport($connection, $filename = UNKNOWN, $large_object_id = UNKNOW
351342
* @param string|int $filename
352343
* @return resource|false
353344
*/
354-
function pg_lo_export($connection,$large_object_id = UNKNOWN, $filename = UNKNOWN): bool {}
345+
function pg_lo_export($connection, $large_object_id = UNKNOWN, $filename = UNKNOWN): bool {}
355346

356347
/**
357348
* @param resource|string|int $connection
@@ -360,7 +351,7 @@ function pg_lo_export($connection,$large_object_id = UNKNOWN, $filename = UNKNOW
360351
* @return resource|false
361352
* @alias pg_lo_export
362353
*/
363-
function pg_loexport($connection,$large_object_id = UNKNOWN, $filename = UNKNOWN): bool {}
354+
function pg_loexport($connection, $large_object_id = UNKNOWN, $filename = UNKNOWN): bool {}
364355

365356
/** @param resource $large_object */
366357
function pg_lo_seek($large_object, int $offset, int $whence = SEEK_CUR): bool {}

ext/pgsql/pgsql_arginfo.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 2ae99621cf060e986e354587ec34766d12b89d6c */
2+
* Stub hash: 38d1c57d8bf23dcd17d4f775cdf4c2df61087331 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_pg_connect, 0, 0, 1)
55
ZEND_ARG_TYPE_INFO(0, connection_string, IS_STRING, 0)
@@ -126,7 +126,7 @@ ZEND_END_ARG_INFO()
126126
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pg_fetch_result, 0, 2, MAY_BE_STRING|MAY_BE_FALSE|MAY_BE_NULL)
127127
ZEND_ARG_INFO(0, result)
128128
ZEND_ARG_INFO(0, row_number)
129-
ZEND_ARG_INFO(0, field)
129+
ZEND_ARG_TYPE_MASK(0, field, MAY_BE_STRING|MAY_BE_LONG, NULL)
130130
ZEND_END_ARG_INFO()
131131

132132
#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
152152
ZEND_ARG_INFO(0, result)
153153
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, row_number, IS_LONG, 1, "null")
154154
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, class_name, IS_STRING, 0, "\"stdClass\"")
155-
ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, ctor_params, "null")
155+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, ctor_params, IS_ARRAY, 1, "null")
156156
ZEND_END_ARG_INFO()
157157

158158
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()
173173
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_pg_field_prtlen, 0, 2, MAY_BE_LONG|MAY_BE_FALSE)
174174
ZEND_ARG_INFO(0, result)
175175
ZEND_ARG_INFO(0, row_number)
176-
ZEND_ARG_INFO(0, field)
176+
ZEND_ARG_TYPE_MASK(0, field, MAY_BE_STRING|MAY_BE_LONG, NULL)
177177
ZEND_END_ARG_INFO()
178178

179179
#define arginfo_pg_fieldprtlen arginfo_pg_field_prtlen

0 commit comments

Comments
 (0)