@@ -1781,64 +1781,85 @@ redis_mpop_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
17811781 return res ;
17821782}
17831783
1784+ #if PHP_VERSION_ID < 80200
1785+ static HashTable * zend_array_to_list (HashTable * arr ) {
1786+ zval zret = {0 }, * zv ;
1787+
1788+ array_init_size (& zret , zend_hash_num_elements (arr ));
1789+
1790+ ZEND_HASH_FOREACH_VAL (arr , zv ) {
1791+ Z_TRY_ADDREF_P (zv );
1792+ add_next_index_zval (& zret , zv );
1793+ } ZEND_HASH_FOREACH_END ();
1794+
1795+ return Z_ARRVAL (zret );
1796+ }
1797+ #endif
1798+
17841799PHP_REDIS_API int
1785- redis_geosearch_response ( INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
1786- zval * z_tab , void * ctx )
1800+ redis_read_geosearch_response ( zval * zdst , RedisSock * redis_sock ,
1801+ long long elements , int with_aux_data )
17871802{
1788- int numElems ;
1789- zval z_ret , z_multi_result , z_sub , z_tmp , * z_ele , * zv ;
1803+ zval z_multi_result , z_sub , * z_ele , * zv ;
17901804 zend_string * zkey ;
17911805
1792- if (read_mbulk_header (redis_sock , & numElems ) < 0 ) {
1793- if (IS_ATOMIC (redis_sock )) {
1794- RETVAL_FALSE ;
1795- } else {
1796- add_next_index_bool (z_tab , 0 );
1797- }
1798- return FAILURE ;
1806+ /* Handle the trivial "empty" result first */
1807+ if (elements < 0 && redis_sock -> null_mbulk_as_null ) {
1808+ ZVAL_NULL (zdst );
1809+ return SUCCESS ;
17991810 }
18001811
1801- if (numElems < 0 && redis_sock -> null_mbulk_as_null ) {
1802- ZVAL_NULL (& z_ret );
1812+ array_init (zdst );
1813+
1814+ if (with_aux_data == 0 ) {
1815+ redis_mbulk_reply_loop (redis_sock , zdst , elements , UNSERIALIZE_NONE );
18031816 } else {
1804- array_init (& z_ret );
1805- if (ctx == NULL ) {
1806- redis_mbulk_reply_loop (redis_sock , & z_ret , numElems , UNSERIALIZE_NONE );
1807- } else {
1808- array_init (& z_multi_result );
1809- redis_read_multibulk_recursive (redis_sock , numElems , 0 , & z_multi_result );
1817+ array_init (& z_multi_result );
18101818
1811- ZEND_HASH_FOREACH_VAL (Z_ARRVAL (z_multi_result ), z_ele ) {
1812- // The first item in the sub-array is always the name of the returned item
1813- zv = zend_hash_index_find (Z_ARRVAL_P (z_ele ), 0 );
1814- zkey = zval_get_string (zv );
1819+ redis_read_multibulk_recursive (redis_sock , elements , 0 , & z_multi_result );
18151820
1816- zend_hash_index_del (Z_ARRVAL_P (z_ele ), 0 );
1821+ ZEND_HASH_FOREACH_VAL (Z_ARRVAL (z_multi_result ), z_ele ) {
1822+ // The first item in the sub-array is always the name of the returned item
1823+ zv = zend_hash_index_find (Z_ARRVAL_P (z_ele ), 0 );
1824+ zkey = zval_get_string (zv );
18171825
1818- // The other information is returned in the following order as successive
1819- // elements of the sub-array: distance, geohash, coordinates
1820- zend_hash_apply (Z_ARRVAL_P (z_ele ), geosearch_cast );
1826+ zend_hash_index_del (Z_ARRVAL_P (z_ele ), 0 );
18211827
1822- // Copy values to re-order from zero
1823- array_init (& z_sub );
1824- ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (z_ele ), zv ) {
1825- ZVAL_ZVAL (& z_tmp , zv , 1 , 0 );
1826- add_next_index_zval (& z_sub , & z_tmp );
1827- } ZEND_HASH_FOREACH_END ();
1828+ // The other information is returned in the following order as successive
1829+ // elements of the sub-array: distance, geohash, coordinates
1830+ zend_hash_apply (Z_ARRVAL_P (z_ele ), geosearch_cast );
18281831
1829- add_assoc_zval_ex (& z_ret , ZSTR_VAL (zkey ), ZSTR_LEN (zkey ), & z_sub );
1830- zend_string_release (zkey );
1831- } ZEND_HASH_FOREACH_END ();
1832+ // Reindex elements so they start at zero */
1833+ ZVAL_ARR (& z_sub , zend_array_to_list (Z_ARRVAL_P (z_ele )));
18321834
1833- // Cleanup
1834- zval_dtor (& z_multi_result );
1835- }
1835+ add_assoc_zval_ex (zdst , ZSTR_VAL (zkey ), ZSTR_LEN (zkey ), & z_sub );
1836+ zend_string_release (zkey );
1837+ } ZEND_HASH_FOREACH_END ();
1838+
1839+ // Cleanup
1840+ zval_dtor (& z_multi_result );
1841+ }
1842+
1843+ return SUCCESS ;
1844+ }
1845+
1846+ PHP_REDIS_API int
1847+ redis_geosearch_response (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
1848+ zval * z_tab , void * ctx )
1849+ {
1850+ zval zret = {0 };
1851+ int elements ;
1852+
1853+ if (read_mbulk_header (redis_sock , & elements ) < 0 ||
1854+ redis_read_geosearch_response (& zret , redis_sock , elements , ctx != NULL ) < 0 )
1855+ {
1856+ ZVAL_FALSE (& zret );
18361857 }
18371858
18381859 if (IS_ATOMIC (redis_sock )) {
1839- RETVAL_ZVAL (& z_ret , 0 , 1 );
1860+ RETVAL_ZVAL (& zret , 0 , 1 );
18401861 } else {
1841- add_next_index_zval (z_tab , & z_ret );
1862+ add_next_index_zval (z_tab , & zret );
18421863 }
18431864
18441865 return SUCCESS ;
0 commit comments