@@ -5245,64 +5245,51 @@ redis_client_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
52455245int redis_command_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
52465246 char * * cmd , int * cmd_len , short * slot , void * * ctx )
52475247{
5248- char * kw = NULL ;
5249- zval * z_arg ;
5250- size_t kw_len ;
5251-
5252- /* Parse our args */
5253- if (zend_parse_parameters (ZEND_NUM_ARGS (), "|sz" , & kw , & kw_len ,
5254- & z_arg ) == FAILURE )
5255- {
5256- return FAILURE ;
5257- }
5248+ smart_string cmdstr = {0 };
5249+ zend_string * op = NULL , * zstr ;
5250+ zval * z_args = NULL ;
5251+ int i , argc = 0 ;
52585252
5259- /* Construct our command */
5260- if (!kw ) {
5261- * cmd_len = REDIS_CMD_SPPRINTF (cmd , "COMMAND" , "" );
5262- } else if (!z_arg ) {
5263- /* Sanity check */
5264- if (strncasecmp (kw , "count" , sizeof ("count" ) - 1 )) {
5265- return FAILURE ;
5266- }
5267- /* COMMAND COUNT */
5268- * cmd_len = REDIS_CMD_SPPRINTF (cmd , "COMMAND" , "s" , "COUNT" , sizeof ("COUNT" ) - 1 );
5269- } else if (Z_TYPE_P (z_arg ) == IS_STRING ) {
5270- /* Sanity check */
5271- if (strncasecmp (kw , "info" , sizeof ("info" ) - 1 )) {
5272- return FAILURE ;
5273- }
5253+ ZEND_PARSE_PARAMETERS_START (0 , -1 )
5254+ Z_PARAM_OPTIONAL
5255+ Z_PARAM_STR (op )
5256+ Z_PARAM_VARIADIC ('*' , z_args , argc )
5257+ ZEND_PARSE_PARAMETERS_END_EX (return FAILURE );
52745258
5275- /* COMMAND INFO <cmd> */
5276- * cmd_len = REDIS_CMD_SPPRINTF (cmd , "COMMAND" , "ss" , "INFO" , sizeof ("INFO" ) - 1 ,
5277- Z_STRVAL_P (z_arg ), Z_STRLEN_P (z_arg ));
5259+ if (op == NULL ) {
5260+ * ctx = NULL ;
5261+ argc = 0 ;
5262+ } else if (zend_string_equals_literal_ci (op , "COUNT" )) {
5263+ * ctx = PHPREDIS_CTX_PTR ;
5264+ argc = 0 ;
5265+ } else if (zend_string_equals_literal_ci (op , "DOCS" ) ||
5266+ zend_string_equals_literal_ci (op , "INFO" )
5267+ ) {
5268+ * ctx = NULL ;
5269+ } else if (zend_string_equals_literal_ci (op , "GETKEYS" ) ||
5270+ zend_string_equals_literal_ci (op , "LIST" )
5271+ ) {
5272+ * ctx = PHPREDIS_CTX_PTR + 1 ;
5273+ } else if (zend_string_equals_literal_ci (op , "GETKEYSANDFLAGS" )) {
5274+ * ctx = PHPREDIS_CTX_PTR + 2 ;
52785275 } else {
5279- int arr_len ;
5280-
5281- /* Sanity check on args */
5282- if (strncasecmp (kw , "getkeys" , sizeof ("getkeys" )- 1 ) ||
5283- Z_TYPE_P (z_arg )!= IS_ARRAY ||
5284- (arr_len = zend_hash_num_elements (Z_ARRVAL_P (z_arg )))< 1 )
5285- {
5286- return FAILURE ;
5287- }
5288-
5289- zval * z_ele ;
5290- HashTable * ht_arr = Z_ARRVAL_P (z_arg );
5291- smart_string cmdstr = {0 };
5292-
5293- redis_cmd_init_sstr (& cmdstr , 1 + arr_len , ZEND_STRL ("COMMAND" ));
5294- redis_cmd_append_sstr (& cmdstr , ZEND_STRL ("GETKEYS" ));
5276+ php_error_docref (NULL , E_WARNING , "Unknown COMMAND operation '%s'" , ZSTR_VAL (op ));
5277+ return FAILURE ;
5278+ }
52955279
5296- ZEND_HASH_FOREACH_VAL (ht_arr , z_ele ) {
5297- zend_string * zstr = zval_get_string (z_ele );
5298- redis_cmd_append_sstr (& cmdstr , ZSTR_VAL (zstr ), ZSTR_LEN (zstr ));
5299- zend_string_release (zstr );
5300- } ZEND_HASH_FOREACH_END ();
5280+ REDIS_CMD_INIT_SSTR_STATIC (& cmdstr , !!op + argc , "COMMAND" );
5281+ if (op ) redis_cmd_append_sstr_zstr (& cmdstr , op );
53015282
5302- * cmd = cmdstr .c ;
5303- * cmd_len = cmdstr .len ;
5283+ for (i = 0 ; i < argc ; ++ i ) {
5284+ zstr = zval_get_string (& z_args [i ]);
5285+ redis_cmd_append_sstr (& cmdstr , ZSTR_VAL (zstr ), ZSTR_LEN (zstr ));
5286+ zend_string_release (zstr );
53045287 }
53055288
5289+ // Push out values
5290+ * cmd = cmdstr .c ;
5291+ * cmd_len = cmdstr .len ;
5292+
53065293 /* Any slot will do */
53075294 CMD_RAND_SLOT (slot );
53085295
0 commit comments