@@ -3399,15 +3399,16 @@ PHP_METHOD(Redis, command) {
33993399/* Helper to format any combination of SCAN arguments */
34003400PHP_REDIS_API int
34013401redis_build_scan_cmd (char * * cmd , REDIS_SCAN_TYPE type , char * key , int key_len ,
3402- int iter , char * pattern , int pattern_len , int count )
3402+ int iter , char * pattern , int pattern_len , int count ,
3403+ zend_string * match_type )
34033404{
34043405 smart_string cmdstr = {0 };
34053406 char * keyword ;
34063407 int argc ;
34073408
34083409 /* Count our arguments +1 for key if it's got one, and + 2 for pattern */
34093410 /* or count given that they each carry keywords with them. */
3410- argc = 1 + (key_len > 0 ) + (pattern_len > 0 ? 2 : 0 ) + (count > 0 ? 2 : 0 );
3411+ argc = 1 + (key_len > 0 ) + (pattern_len > 0 ? 2 : 0 ) + (count > 0 ? 2 : 0 ) + ( match_type ? 2 : 0 ) ;
34113412
34123413 /* Turn our type into a keyword */
34133414 switch (type ) {
@@ -3443,12 +3444,17 @@ redis_build_scan_cmd(char **cmd, REDIS_SCAN_TYPE type, char *key, int key_len,
34433444 redis_cmd_append_sstr (& cmdstr , pattern , pattern_len );
34443445 }
34453446
3447+ if (match_type ) {
3448+ REDIS_CMD_APPEND_SSTR_STATIC (& cmdstr , "TYPE" );
3449+ redis_cmd_append_sstr (& cmdstr , ZSTR_VAL (match_type ), ZSTR_LEN (match_type ));
3450+ }
3451+
34463452 /* Return our command length */
34473453 * cmd = cmdstr .c ;
34483454 return cmdstr .len ;
34493455}
34503456
3451- /* {{{ proto redis::scan(&$iterator, [pattern, [count]]) */
3457+ /* {{{ proto redis::scan(&$iterator, [pattern, [count, [type] ]]) */
34523458PHP_REDIS_API void
34533459generic_scan_cmd (INTERNAL_FUNCTION_PARAMETERS , REDIS_SCAN_TYPE type ) {
34543460 zval * object , * z_iter ;
@@ -3457,6 +3463,7 @@ generic_scan_cmd(INTERNAL_FUNCTION_PARAMETERS, REDIS_SCAN_TYPE type) {
34573463 char * pattern = NULL , * cmd , * key = NULL ;
34583464 int cmd_len , num_elements , key_free = 0 ;
34593465 size_t key_len = 0 , pattern_len = 0 ;
3466+ zend_string * match_type = NULL ;
34603467 zend_long count = 0 , iter ;
34613468
34623469 /* Different prototype depending on if this is a key based scan */
@@ -3472,8 +3479,8 @@ generic_scan_cmd(INTERNAL_FUNCTION_PARAMETERS, REDIS_SCAN_TYPE type) {
34723479 } else {
34733480 // Doesn't require a key
34743481 if (zend_parse_method_parameters (ZEND_NUM_ARGS (), getThis (),
3475- "Oz/|s!l " , & object , redis_ce , & z_iter ,
3476- & pattern , & pattern_len , & count )
3482+ "Oz/|s!lS " , & object , redis_ce , & z_iter ,
3483+ & pattern , & pattern_len , & count , & match_type )
34773484 == FAILURE )
34783485 {
34793486 RETURN_FALSE ;
@@ -3530,7 +3537,7 @@ generic_scan_cmd(INTERNAL_FUNCTION_PARAMETERS, REDIS_SCAN_TYPE type) {
35303537
35313538 // Format our SCAN command
35323539 cmd_len = redis_build_scan_cmd (& cmd , type , key , key_len , (int )iter ,
3533- pattern , pattern_len , count );
3540+ pattern , pattern_len , count , match_type );
35343541
35353542 /* Execute our command getting our new iterator value */
35363543 REDIS_PROCESS_REQUEST (redis_sock , cmd , cmd_len );
0 commit comments