@@ -130,6 +130,7 @@ static zend_function_entry redis_functions[] = {
130130 PHP_ME (Redis , hGetAll , NULL , ZEND_ACC_PUBLIC )
131131 PHP_ME (Redis , hExists , NULL , ZEND_ACC_PUBLIC )
132132 PHP_ME (Redis , hIncrBy , NULL , ZEND_ACC_PUBLIC )
133+ PHP_ME (Redis , hMset , NULL , ZEND_ACC_PUBLIC )
133134
134135 PHP_ME (Redis , multi , NULL , ZEND_ACC_PUBLIC )
135136 PHP_ME (Redis , discard , NULL , ZEND_ACC_PUBLIC )
@@ -3723,6 +3724,94 @@ PHP_METHOD(Redis, hIncrBy)
37233724
37243725}
37253726
3727+ PHP_METHOD (Redis , hMset )
3728+ {
3729+ zval * object ;
3730+ RedisSock * redis_sock ;
3731+ char * key = NULL , * cmd , * member ;
3732+ int key_len , member_len , cmd_len ;
3733+ zval * z_hash , * data ;
3734+ HashTable * ht_hash ;
3735+ HashPosition pointer ;
3736+ int i ;
3737+ int element_count = 2 ;
3738+ char * old_cmd = NULL ;
3739+
3740+ if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Osa" ,
3741+ & object , redis_ce ,
3742+ & key , & key_len , & z_hash ) == FAILURE ) {
3743+ RETURN_FALSE ;
3744+ }
3745+
3746+ if (redis_sock_get (object , & redis_sock TSRMLS_CC ) < 0 ) {
3747+ RETURN_FALSE ;
3748+ }
3749+
3750+ ht_hash = Z_ARRVAL_P (z_hash );
3751+
3752+ if (zend_hash_num_elements (ht_hash ) == 0 ) {
3753+ RETURN_FALSE ;
3754+ }
3755+
3756+ cmd_len = redis_cmd_format (& cmd ,
3757+ "$5" _NL "HMSET" _NL
3758+ "$%d" _NL "%s" _NL
3759+ , key_len , key , key_len );
3760+
3761+ /* looping on each item of the array */
3762+ for (i = 0 , zend_hash_internal_pointer_reset (ht_hash );
3763+ zend_hash_has_more_elements (ht_hash ) == SUCCESS ;
3764+ i ++ , zend_hash_move_forward (ht_hash )) {
3765+
3766+ char * hkey ;
3767+ unsigned int hkey_len ;
3768+ unsigned long idx ;
3769+ int type ;
3770+ zval * z_value , * * z_value_p ;
3771+
3772+ type = zend_hash_get_current_key_ex (ht_hash , & hkey , & hkey_len , & idx , 0 , NULL );
3773+
3774+ if (zend_hash_get_current_data (ht_hash , (void * * )& z_value_p ) == FAILURE ) {
3775+ continue ; /* this should never happen */
3776+ }
3777+
3778+ if (type != HASH_KEY_IS_STRING ) {
3779+ continue ;
3780+ }
3781+ element_count += 2 ;
3782+
3783+ /* key is set. */
3784+ if (Z_TYPE_PP (z_value_p ) != IS_STRING ) {
3785+ convert_to_string (* z_value_p );
3786+ }
3787+ if (* cmd ) {
3788+ old_cmd = cmd ;
3789+ }
3790+ cmd_len = redis_cmd_format (& cmd , "%s"
3791+ "$%d" _NL "%s" _NL
3792+ "$%d" _NL "%s" _NL
3793+ , cmd , cmd_len
3794+ , hkey_len - 1 , hkey , hkey_len - 1
3795+ , Z_STRLEN_PP (z_value_p ), Z_STRVAL_PP (z_value_p ), Z_STRLEN_PP (z_value_p ));
3796+ if (old_cmd ) {
3797+ efree (old_cmd );
3798+ }
3799+ }
3800+
3801+ old_cmd = cmd ;
3802+ cmd_len = redis_cmd_format (& cmd , "*%d" _NL "%s"
3803+ , element_count , cmd , cmd_len );
3804+ efree (old_cmd );
3805+
3806+ REDIS_PROCESS_REQUEST (redis_sock , cmd , cmd_len );
3807+ IF_ATOMIC () {
3808+ redis_boolean_response (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL TSRMLS_CC );
3809+ }
3810+ REDIS_PROCESS_RESPONSE (redis_boolean_response );
3811+ }
3812+
3813+
3814+
37263815PHPAPI int redis_response_enqueued (RedisSock * redis_sock TSRMLS_DC ) {
37273816
37283817 char * response ;
0 commit comments