@@ -848,6 +848,68 @@ static void _php_pgsql_free_params(char **params, int num_params)
848
848
}
849
849
}
850
850
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
+
851
913
/* {{{ php_pgsql_result2array
852
914
*/
853
915
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_
859
921
uint32_t i;
860
922
assert (Z_TYPE_P (ret_array) == IS_ARRAY);
861
923
862
- if ((pg_numrows = PQntuples (pg_result)) <= 0 )
863
- {
924
+ if ((pg_numrows = PQntuples (pg_result)) <= 0 ) {
864
925
return FAILURE;
865
926
}
866
- for (pg_row = 0 ; pg_row < pg_numrows; pg_row++)
867
- {
927
+ for (pg_row = 0 ; pg_row < pg_numrows; pg_row++) {
868
928
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);
882
935
}
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);
898
940
}
899
941
}
900
942
add_index_zval (ret_array, pg_row, &row);
901
943
}
902
944
return SUCCESS;
903
945
}
946
+ /* }}} */
904
947
905
948
static PHP_METHOD (swoole_postgresql_coro, fetchAll)
906
949
{
@@ -1176,35 +1219,17 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_
1176
1219
array_init (return_value);
1177
1220
for (i = 0 , num_fields = PQnfields (pgsql_result); i < num_fields; i++)
1178
1221
{
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);
1189
1226
}
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
- }
1201
1227
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);
1208
1233
}
1209
1234
}
1210
1235
0 commit comments