@@ -5650,29 +5650,55 @@ int redis_xinfo_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
56505650 return SUCCESS ;
56515651}
56525652
5653- /* XTRIM MAXLEN [ ~] count */
5653+ // XTRIM key < MAXLEN | MINID> [= | ~] threshold [LIMIT count]
56545654int redis_xtrim_cmd (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock ,
56555655 char * * cmd , int * cmd_len , short * slot , void * * ctx )
56565656{
5657- char * key ;
5658- size_t keylen ;
5659- zend_long maxlen ;
5660- zend_bool approx = 0 ;
5657+ zend_long threshold = 0 , limit = -1 ;
5658+ zend_bool approx = 0 , minid = 0 ;
5659+ smart_string cmdstr = {0 };
5660+ zend_string * key = NULL ;
5661+ int argc ;
56615662
5662- if (zend_parse_parameters (ZEND_NUM_ARGS (), "sl|b" , & key , & keylen ,
5663- & maxlen , & approx ) == FAILURE )
5664- {
5665- return FAILURE ;
5663+ ZEND_PARSE_PARAMETERS_START (2 , 5 )
5664+ Z_PARAM_STR (key )
5665+ Z_PARAM_LONG (threshold )
5666+ Z_PARAM_OPTIONAL
5667+ Z_PARAM_BOOL (approx )
5668+ Z_PARAM_BOOL (minid )
5669+ Z_PARAM_LONG (limit )
5670+ ZEND_PARSE_PARAMETERS_END_EX (return FAILURE );
5671+
5672+ argc = 4 + (approx && limit > -1 ? 2 : 0 );
5673+ REDIS_CMD_INIT_SSTR_STATIC (& cmdstr , argc , "XTRIM ");
5674+
5675+ redis_cmd_append_sstr_key_zstr (& cmdstr , key , redis_sock , slot ) ;
5676+
5677+ if (minid ) {
5678+ REDIS_CMD_APPEND_SSTR_STATIC (& cmdstr , "MINID" );
5679+ } else {
5680+ REDIS_CMD_APPEND_SSTR_STATIC (& cmdstr , "MAXLEN" );
56665681 }
56675682
56685683 if (approx ) {
5669- * cmd_len = REDIS_CMD_SPPRINTF (cmd , "XTRIM" , "kssl" , key , keylen ,
5670- "MAXLEN" , 6 , "~" , 1 , maxlen );
5684+ REDIS_CMD_APPEND_SSTR_STATIC (& cmdstr , "~" );
56715685 } else {
5672- * cmd_len = REDIS_CMD_SPPRINTF (cmd , "XTRIM" , "ksl" , key , keylen ,
5673- "MAXLEN" , 6 , maxlen );
5686+ REDIS_CMD_APPEND_SSTR_STATIC (& cmdstr , "=" );
56745687 }
56755688
5689+ redis_cmd_append_sstr_long (& cmdstr , threshold );
5690+
5691+ if (limit > -1 && approx ) {
5692+ REDIS_CMD_APPEND_SSTR_STATIC (& cmdstr , "LIMIT" );
5693+ redis_cmd_append_sstr_long (& cmdstr , limit );
5694+ } else if (limit > -1 ) {
5695+ php_error_docref (NULL , E_WARNING , "Cannot use LIMIT without an approximate match, ignoring" );
5696+ } else if (ZEND_NUM_ARGS () == 5 ) {
5697+ php_error_docref (NULL , E_WARNING , "Limit must be >= 0" );
5698+ }
5699+
5700+ * cmd = cmdstr .c ;
5701+ * cmd_len = cmdstr .len ;
56765702 return SUCCESS ;
56775703}
56785704
0 commit comments