@@ -1507,36 +1507,31 @@ int redis_unsubscribe_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
15071507 char * kw , char * * cmd , int * cmd_len , short * slot ,
15081508 void * * ctx )
15091509{
1510- zval * z_arr , * z_chan ;
1511- HashTable * ht_arr ;
15121510 smart_string cmdstr = {0 };
1513- subscribeContext * sctx = ecalloc (1 , sizeof (* sctx ));
1511+ subscribeContext * sctx ;
1512+ HashTable * channels ;
1513+ zval * channel ;
15141514
1515- if (zend_parse_parameters (ZEND_NUM_ARGS (), "a" , & z_arr ) == FAILURE ) {
1516- efree (sctx );
1517- return FAILURE ;
1518- }
1515+ ZEND_PARSE_PARAMETERS_START (1 , 1 )
1516+ Z_PARAM_ARRAY_HT (channels )
1517+ ZEND_PARSE_PARAMETERS_END_EX (return FAILURE );
15191518
1520- ht_arr = Z_ARRVAL_P (z_arr );
1519+ if (zend_hash_num_elements (channels ) == 0 )
1520+ return FAILURE ;
15211521
1522+ sctx = ecalloc (1 , sizeof (* sctx ));
15221523 sctx -> kw = kw ;
1523- sctx -> argc = zend_hash_num_elements (ht_arr );
1524- redis_cmd_init_sstr (& cmdstr , sctx -> argc , kw , strlen (kw ));
1524+ sctx -> argc = zend_hash_num_elements (channels );
15251525
1526- ZEND_HASH_FOREACH_VAL (ht_arr , z_chan ) {
1527- char * key = Z_STRVAL_P (z_chan );
1528- size_t key_len = Z_STRLEN_P (z_chan );
1529- int key_free ;
1526+ redis_cmd_init_sstr (& cmdstr , sctx -> argc , kw , strlen (kw ));
15301527
1531- key_free = redis_key_prefix (redis_sock , & key , & key_len );
1532- redis_cmd_append_sstr (& cmdstr , key , key_len );
1533- if (key_free ) efree (key );
1528+ ZEND_HASH_FOREACH_VAL (channels , channel ) {
1529+ redis_cmd_append_sstr_key_zval (& cmdstr , channel , redis_sock , slot );
15341530 } ZEND_HASH_FOREACH_END ();
15351531
1536- // Push out vals
15371532 * cmd_len = cmdstr .len ;
1538- * cmd = cmdstr .c ;
1539- * ctx = ( void * ) sctx ;
1533+ * cmd = cmdstr .c ;
1534+ * ctx = sctx ;
15401535
15411536 return SUCCESS ;
15421537}
@@ -1726,54 +1721,32 @@ int redis_key_varval_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
17261721}
17271722
17281723/* Commands that take a key and then an array of values */
1729- #define VAL_TYPE_VALUES 1
1730- #define VAL_TYPE_STRINGS 2
17311724static int gen_key_arr_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
1732- char * kw , int valtype , char * * cmd , int * cmd_len ,
1725+ char * kw , zend_bool pack_values , char * * cmd , int * cmd_len ,
17331726 short * slot , void * * ctx )
17341727{
1735- zval * z_arr , * z_val ;
1736- HashTable * ht_arr ;
17371728 smart_string cmdstr = {0 };
1738- zend_string * zstr ;
1739- int key_free , val_free , argc = 1 ;
1740- size_t val_len , key_len ;
1741- char * key , * val ;
1729+ HashTable * values = NULL ;
1730+ zend_string * key = NULL ;
1731+ zval * zv ;
17421732
1743- if (zend_parse_parameters (ZEND_NUM_ARGS (), "sa" , & key , & key_len ,
1744- & z_arr ) == FAILURE ||
1745- zend_hash_num_elements (Z_ARRVAL_P (z_arr )) == 0 )
1746- {
1747- return FAILURE ;
1748- }
1733+ ZEND_PARSE_PARAMETERS_START (2 , 2 )
1734+ Z_PARAM_STR (key )
1735+ Z_PARAM_ARRAY_HT (values )
1736+ ZEND_PARSE_PARAMETERS_END_EX (return FAILURE ) ;
17491737
1750- /* Start constructing our command */
1751- ht_arr = Z_ARRVAL_P (z_arr );
1752- argc += zend_hash_num_elements (ht_arr );
1753- redis_cmd_init_sstr (& cmdstr , argc , kw , strlen (kw ));
1738+ if (zend_hash_num_elements (values ) == 0 )
1739+ return FAILURE ;
17541740
1755- /* Prefix if required and append the key name */
1756- key_free = redis_key_prefix (redis_sock , & key , & key_len );
1757- redis_cmd_append_sstr (& cmdstr , key , key_len );
1758- CMD_SET_SLOT (slot , key , key_len );
1759- if (key_free ) efree (key );
1741+ redis_cmd_init_sstr (& cmdstr , 1 + zend_hash_num_elements (values ), kw , strlen (kw ));
1742+ redis_cmd_append_sstr_key_zstr (& cmdstr , key , redis_sock , slot );
17601743
1761- /* Iterate our hash table, serializing and appending values */
1762- assert (valtype == VAL_TYPE_VALUES || valtype == VAL_TYPE_STRINGS );
1763- ZEND_HASH_FOREACH_VAL (ht_arr , z_val ) {
1764- if (valtype == VAL_TYPE_VALUES ) {
1765- val_free = redis_pack (redis_sock , z_val , & val , & val_len );
1766- redis_cmd_append_sstr (& cmdstr , val , val_len );
1767- if (val_free ) efree (val );
1768- } else {
1769- zstr = zval_get_string (z_val );
1770- redis_cmd_append_sstr (& cmdstr , ZSTR_VAL (zstr ), ZSTR_LEN (zstr ));
1771- zend_string_release (zstr );
1772- }
1744+ ZEND_HASH_FOREACH_VAL (values , zv ) {
1745+ redis_cmd_append_sstr_zval (& cmdstr , zv , pack_values ? redis_sock : NULL );
17731746 } ZEND_HASH_FOREACH_END ();
17741747
1775- * cmd_len = cmdstr .len ;
17761748 * cmd = cmdstr .c ;
1749+ * cmd_len = cmdstr .len ;
17771750
17781751 return SUCCESS ;
17791752}
@@ -1783,15 +1756,15 @@ int redis_key_val_arr_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
17831756 void * * ctx )
17841757{
17851758 return gen_key_arr_cmd (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , kw ,
1786- VAL_TYPE_VALUES , cmd , cmd_len , slot , ctx );
1759+ 1 , cmd , cmd_len , slot , ctx );
17871760}
17881761
17891762int redis_key_str_arr_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
17901763 char * kw , char * * cmd , int * cmd_len , short * slot ,
17911764 void * * ctx )
17921765{
17931766 return gen_key_arr_cmd (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , kw ,
1794- VAL_TYPE_STRINGS , cmd , cmd_len , slot , ctx );
1767+ 0 , cmd , cmd_len , slot , ctx );
17951768}
17961769
17971770/* Generic function that takes one or more non-serialized arguments */
0 commit comments