@@ -2670,9 +2670,83 @@ int redis_smove_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
26702670 return SUCCESS ;
26712671}
26722672
2673- /* Generic command construction for HSET and HSETNX */
2674- static int gen_hset_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
2675- char * kw , char * * cmd , int * cmd_len , short * slot )
2673+ /* HSET */
2674+ int redis_hset_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
2675+ char * * cmd , int * cmd_len , short * slot , void * * ctx )
2676+ {
2677+ int i , argc ;
2678+ smart_string cmdstr = {0 };
2679+ zend_string * zkey ;
2680+ zval * z_args , * z_ele ;
2681+
2682+ if ((argc = ZEND_NUM_ARGS ()) < 2 ) {
2683+ return FAILURE ;
2684+ }
2685+
2686+ z_args = ecalloc (argc , sizeof (* z_args ));
2687+ if (zend_get_parameters_array (ht , argc , z_args ) == FAILURE ) {
2688+ efree (z_args );
2689+ return FAILURE ;
2690+ }
2691+
2692+ if (argc == 2 ) {
2693+ if (Z_TYPE (z_args [1 ]) != IS_ARRAY || zend_hash_num_elements (Z_ARRVAL (z_args [1 ])) == 0 ) {
2694+ efree (z_args );
2695+ return FAILURE ;
2696+ }
2697+
2698+ /* Initialize our command */
2699+ redis_cmd_init_sstr (& cmdstr , 1 + zend_hash_num_elements (Z_ARRVAL (z_args [1 ])), ZEND_STRL ("HSET" ));
2700+
2701+ /* Append key */
2702+ zkey = zval_get_string (& z_args [0 ]);
2703+ redis_cmd_append_sstr_key (& cmdstr , ZSTR_VAL (zkey ), ZSTR_LEN (zkey ), redis_sock , slot );
2704+ zend_string_release (zkey );
2705+
2706+ ZEND_HASH_FOREACH_STR_KEY_VAL (Z_ARRVAL (z_args [1 ]), zkey , z_ele ) {
2707+ if (zkey != NULL ) {
2708+ ZVAL_DEREF (z_ele );
2709+ redis_cmd_append_sstr (& cmdstr , ZSTR_VAL (zkey ), ZSTR_LEN (zkey ));
2710+ redis_cmd_append_sstr_zval (& cmdstr , z_ele , redis_sock );
2711+ }
2712+ } ZEND_HASH_FOREACH_END ();
2713+ } else {
2714+ if (argc % 2 == 0 ) {
2715+ efree (z_args );
2716+ return FAILURE ;
2717+ }
2718+ /* Initialize our command */
2719+ redis_cmd_init_sstr (& cmdstr , argc , ZEND_STRL ("HSET" ));
2720+
2721+ /* Append key */
2722+ zkey = zval_get_string (& z_args [0 ]);
2723+ redis_cmd_append_sstr_key (& cmdstr , ZSTR_VAL (zkey ), ZSTR_LEN (zkey ), redis_sock , slot );
2724+ zend_string_release (zkey );
2725+
2726+ for (i = 1 ; i < argc ; ++ i ) {
2727+ if (i % 2 ) {
2728+ zkey = zval_get_string (& z_args [i ]);
2729+ redis_cmd_append_sstr (& cmdstr , ZSTR_VAL (zkey ), ZSTR_LEN (zkey ));
2730+ zend_string_release (zkey );
2731+ } else {
2732+ redis_cmd_append_sstr_zval (& cmdstr , & z_args [i ], redis_sock );
2733+ }
2734+ }
2735+ }
2736+
2737+ // Push out values
2738+ * cmd = cmdstr .c ;
2739+ * cmd_len = cmdstr .len ;
2740+
2741+ // Cleanup arg array
2742+ efree (z_args );
2743+
2744+ return SUCCESS ;
2745+ }
2746+
2747+ /* HSETNX */
2748+ int redis_hsetnx_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
2749+ char * * cmd , int * cmd_len , short * slot , void * * ctx )
26762750{
26772751 char * key , * mem ;
26782752 size_t key_len , mem_len ;
@@ -2685,28 +2759,12 @@ static int gen_hset_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
26852759 }
26862760
26872761 /* Construct command */
2688- * cmd_len = REDIS_CMD_SPPRINTF (cmd , kw , "ksv" , key , key_len , mem , mem_len , z_val );
2762+ * cmd_len = REDIS_CMD_SPPRINTF (cmd , "HSETNX" , "ksv" , key , key_len , mem , mem_len , z_val );
26892763
26902764 // Success
26912765 return SUCCESS ;
26922766}
26932767
2694- /* HSET */
2695- int redis_hset_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
2696- char * * cmd , int * cmd_len , short * slot , void * * ctx )
2697- {
2698- return gen_hset_cmd (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , "HSET" ,
2699- cmd , cmd_len , slot );
2700- }
2701-
2702- /* HSETNX */
2703- int redis_hsetnx_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
2704- char * * cmd , int * cmd_len , short * slot , void * * ctx )
2705- {
2706- return gen_hset_cmd (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , "HSETNX" ,
2707- cmd , cmd_len , slot );
2708- }
2709-
27102768int
27112769redis_hrandfield_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
27122770 char * * cmd , int * cmd_len , short * slot , void * * ctx )
0 commit comments