Skip to content

Commit 183b951

Browse files
committed
Native type casting
According to this PR - php/php-src#4939
1 parent ddc650b commit 183b951

File tree

2 files changed

+95
-59
lines changed

2 files changed

+95
-59
lines changed

‎swoole_postgresql_coro.cc

Lines changed: 84 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,68 @@ static void _php_pgsql_free_params(char **params, int num_params)
848848
}
849849
}
850850

851+
/* {{{ void php_pgsql_get_field_value */
852+
static inline void php_pgsql_get_field_value(zval *value, PGresult *pgsql_result, zend_long result_type, int row, int column)
853+
{
854+
if (PQgetisnull(pgsql_result, row, column)) {
855+
ZVAL_NULL(value);
856+
} else {
857+
char *element = PQgetvalue(pgsql_result, row, column);
858+
if (element) {
859+
const size_t element_len = PQgetlength(pgsql_result, row, column);
860+
Oid pgsql_type = PQftype(pgsql_result, column);
861+
862+
switch (pgsql_type) {
863+
case BOOLOID:
864+
ZVAL_BOOL(value, *element == 't');
865+
break;
866+
case FLOAT4OID:
867+
case FLOAT8OID:
868+
if (element_len == sizeof("Infinity") - 1 && strcmp(element, "Infinity") == 0) {
869+
ZVAL_DOUBLE(value, ZEND_INFINITY);
870+
} else if (element_len == sizeof("-Infinity") - 1 && strcmp(element, "-Infinity") == 0) {
871+
ZVAL_DOUBLE(value, -ZEND_INFINITY);
872+
} else if (element_len == sizeof("NaN") - 1 && strcmp(element, "NaN") == 0) {
873+
ZVAL_DOUBLE(value, ZEND_NAN);
874+
} else {
875+
ZVAL_DOUBLE(value, zend_strtod(element, NULL));
876+
}
877+
break;
878+
case OIDOID:
879+
case INT2OID:
880+
case INT4OID:
881+
#if SIZEOF_ZEND_LONG >= 8
882+
case INT8OID:
883+
#endif
884+
{
885+
zend_long long_value;
886+
ZEND_ATOL(long_value, element);
887+
ZVAL_LONG(value, long_value);
888+
break;
889+
}
890+
case BYTEAOID:
891+
{
892+
size_t tmp_len;
893+
char *tmp_ptr = (char *)PQunescapeBytea((unsigned char *)element, &tmp_len);
894+
if (!tmp_ptr) {
895+
/* PQunescapeBytea returned an error */
896+
ZVAL_NULL(value);
897+
} else {
898+
ZVAL_STRINGL(value, tmp_ptr, tmp_len);
899+
PQfreemem(tmp_ptr);
900+
}
901+
break;
902+
}
903+
default:
904+
ZVAL_STRINGL(value, element, element_len);
905+
}
906+
} else {
907+
ZVAL_NULL(value);
908+
}
909+
}
910+
}
911+
/* }}} */
912+
851913
/* {{{ php_pgsql_result2array
852914
*/
853915
int swoole_pgsql_result2array(PGresult *pg_result, zval *ret_array, long result_type)
@@ -859,48 +921,29 @@ int swoole_pgsql_result2array(PGresult *pg_result, zval *ret_array, long result_
859921
uint32_t i;
860922
assert(Z_TYPE_P(ret_array) == IS_ARRAY);
861923

862-
if ((pg_numrows = PQntuples(pg_result)) <= 0)
863-
{
924+
if ((pg_numrows = PQntuples(pg_result)) <= 0) {
864925
return FAILURE;
865926
}
866-
for (pg_row = 0; pg_row < pg_numrows; pg_row++)
867-
{
927+
for (pg_row = 0; pg_row < pg_numrows; pg_row++) {
868928
array_init(&row);
869-
for (i = 0, num_fields = PQnfields(pg_result); i < num_fields; i++)
870-
{
871-
field_name = PQfname(pg_result, i);
872-
if (PQgetisnull(pg_result, pg_row, i))
873-
{
874-
if (result_type & PGSQL_ASSOC)
875-
{
876-
add_assoc_null(&row, field_name);
877-
}
878-
if (result_type & PGSQL_NUM)
879-
{
880-
add_next_index_null(&row);
881-
}
929+
for (i = 0, num_fields = PQnfields(pg_result); i < num_fields; i++) {
930+
if (result_type & PGSQL_ASSOC) {
931+
zval value;
932+
php_pgsql_get_field_value(&value, pg_result, result_type, pg_row, i);
933+
field_name = PQfname(pg_result, i);
934+
add_assoc_zval(&row, field_name, &value);
882935
}
883-
else
884-
{
885-
char *element = PQgetvalue(pg_result, pg_row, i);
886-
if (element)
887-
{
888-
const size_t element_len = strlen(element);
889-
if (result_type & PGSQL_ASSOC)
890-
{
891-
add_assoc_stringl(&row, field_name, element, element_len);
892-
}
893-
if (result_type & PGSQL_NUM)
894-
{
895-
add_next_index_stringl(&row, element, element_len);
896-
}
897-
}
936+
if (result_type & PGSQL_NUM) {
937+
zval value;
938+
php_pgsql_get_field_value(&value, pg_result, result_type, pg_row, i);
939+
add_next_index_zval(&row, &value);
898940
}
899941
}
900942
add_index_zval(ret_array, pg_row, &row);
901943
}
902944
return SUCCESS;
903945
}
946+
/* }}} */
904947

905948
static PHP_METHOD(swoole_postgresql_coro, fetchAll)
906949
{
@@ -1176,35 +1219,17 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_
11761219
array_init(return_value);
11771220
for (i = 0, num_fields = PQnfields(pgsql_result); i < num_fields; i++)
11781221
{
1179-
if (PQgetisnull(pgsql_result, pgsql_row, i)) {
1180-
if (result_type & PGSQL_NUM)
1181-
{
1182-
add_index_null(return_value, i);
1183-
}
1184-
if (result_type & PGSQL_ASSOC)
1185-
{
1186-
field_name = PQfname(pgsql_result, i);
1187-
add_assoc_null(return_value, field_name);
1188-
}
1222+
if (result_type & PGSQL_NUM) {
1223+
zval value;
1224+
php_pgsql_get_field_value(&value, pgsql_result, result_type, pgsql_row, i);
1225+
add_index_zval(return_value, i, &value);
11891226
}
1190-
else
1191-
{
1192-
char *element = PQgetvalue(pgsql_result, pgsql_row, i);
1193-
if (element)
1194-
{
1195-
const size_t element_len = strlen(element);
1196-
1197-
if (result_type & PGSQL_NUM)
1198-
{
1199-
add_index_stringl(return_value, i, element, element_len);
1200-
}
12011227

1202-
if (result_type & PGSQL_ASSOC)
1203-
{
1204-
field_name = PQfname(pgsql_result, i);
1205-
add_assoc_stringl(return_value, field_name, element, element_len);
1206-
}
1207-
}
1228+
if (result_type & PGSQL_ASSOC) {
1229+
zval value;
1230+
php_pgsql_get_field_value(&value, pgsql_result, result_type, pgsql_row, i);
1231+
field_name = PQfname(pgsql_result, i);
1232+
add_assoc_zval(return_value, field_name, &value);
12081233
}
12091234
}
12101235

‎swoole_postgresql_coro.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,15 @@ typedef struct _php_pgsql_object
5959
#define PGSQL_NUM 1<<1
6060
#define PGSQL_BOTH (PGSQL_ASSOC|PGSQL_NUM)
6161

62+
/* from postgresql/src/include/catalog/pg_type.h */
63+
#define BOOLOID 16
64+
#define BYTEAOID 17
65+
#define INT2OID 21
66+
#define INT4OID 23
67+
#define INT8OID 20
68+
#define TEXTOID 25
69+
#define OIDOID 26
70+
#define FLOAT4OID 700
71+
#define FLOAT8OID 701
72+
6273
#endif

0 commit comments

Comments
 (0)