@@ -491,6 +491,12 @@ int redis_fmt_scan_cmd(char **cmd, REDIS_SCAN_TYPE type, char *key, int key_len,
491491 return cmdstr .len ;
492492}
493493
494+ /* ZRANGEBYSCORE/ZREVRANGEBYSCORE */
495+ #define IS_WITHSCORES_ARG (s , l ) \
496+ (l == sizeof("withscores") - 1 && !strncasecmp(s, "withscores", l))
497+ #define IS_LIMIT_ARG (s , l ) \
498+ (l == sizeof("limit") - 1 && !strncasecmp(s,"limit", l))
499+
494500/* ZRANGE/ZREVRANGE */
495501int redis_zrange_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
496502 char * kw , char * * cmd , int * cmd_len , int * withscores ,
@@ -499,33 +505,43 @@ int redis_zrange_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
499505 char * key ;
500506 size_t key_len ;
501507 zend_long start , end ;
502- zend_bool ws = 0 ;
508+ zend_string * zkey ;
509+ zval * z_ws = NULL , * z_ele ;
503510
504- if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "sll|b " , & key , & key_len ,
505- & start , & end , & ws ) == FAILURE )
511+ if (zend_parse_parameters (ZEND_NUM_ARGS () TSRMLS_CC , "sll|z " , & key , & key_len ,
512+ & start , & end , & z_ws ) == FAILURE )
506513 {
507514 return FAILURE ;
508515 }
509516
510- if (ws ) {
517+ // Clear withscores arg
518+ * withscores = 0 ;
519+
520+ /* Accept ['withscores' => true], or the legacy `true` value */
521+ if (z_ws ) {
522+ if (Z_TYPE_P (z_ws ) == IS_ARRAY ) {
523+ ZEND_HASH_FOREACH_STR_KEY_VAL (Z_ARRVAL_P (z_ws ), zkey , z_ele ) {
524+ ZVAL_DEREF (z_ele );
525+ if (IS_WITHSCORES_ARG (ZSTR_VAL (zkey ), ZSTR_LEN (zkey ))) {
526+ * withscores = zval_is_true (z_ele );
527+ break ;
528+ }
529+ } ZEND_HASH_FOREACH_END ();
530+ } else if (Z_TYPE_P (z_ws ) == IS_TRUE ) {
531+ * withscores = Z_TYPE_P (z_ws ) == IS_TRUE ;
532+ }
533+ }
534+
535+ if (* withscores ) {
511536 * cmd_len = REDIS_CMD_SPPRINTF (cmd , kw , "kdds" , key , key_len , start , end ,
512537 "WITHSCORES" , sizeof ("WITHSCORES" ) - 1 );
513538 } else {
514539 * cmd_len = REDIS_CMD_SPPRINTF (cmd , kw , "kdd" , key , key_len , start , end );
515540 }
516541
517- // Push out WITHSCORES option
518- * withscores = ws ;
519-
520542 return SUCCESS ;
521543}
522544
523- /* ZRANGEBYSCORE/ZREVRANGEBYSCORE */
524- #define IS_WITHSCORES_ARG (s , l ) \
525- (l == sizeof("withscores") - 1 && !strncasecmp(s, "withscores", l))
526- #define IS_LIMIT_ARG (s , l ) \
527- (l == sizeof("limit") - 1 && !strncasecmp(s,"limit", l))
528-
529545int redis_zrangebyscore_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
530546 char * kw , char * * cmd , int * cmd_len , int * withscores ,
531547 short * slot , void * * ctx )
0 commit comments