@@ -68,6 +68,7 @@ static zend_function_entry redis_functions[] = {
6868 PHP_ME (Redis , decr , NULL , ZEND_ACC_PUBLIC )
6969 PHP_ME (Redis , type , NULL , ZEND_ACC_PUBLIC )
7070 PHP_ME (Redis , getKeys , NULL , ZEND_ACC_PUBLIC )
71+ PHP_ME (Redis , sort , NULL , ZEND_ACC_PUBLIC )
7172 PHP_ME (Redis , sortAsc , NULL , ZEND_ACC_PUBLIC )
7273 PHP_ME (Redis , sortAscAlpha , NULL , ZEND_ACC_PUBLIC )
7374 PHP_ME (Redis , sortDesc , NULL , ZEND_ACC_PUBLIC )
@@ -1986,6 +1987,107 @@ PHP_METHOD(Redis, sDiffStore) {
19861987}
19871988/* }}} */
19881989
1990+ PHP_METHOD (Redis , sort ) {
1991+
1992+ zval * object = getThis (), * * z_args ;
1993+ char * cmd , * old_cmd = NULL ;
1994+ int cmd_len , elements = 1 ;
1995+ int i , argc = ZEND_NUM_ARGS ();
1996+ int using_store = 0 ;
1997+ RedisSock * redis_sock ;
1998+
1999+ if (argc < 1 ) {
2000+ WRONG_PARAM_COUNT ;
2001+ RETURN_FALSE ;
2002+ }
2003+
2004+ z_args = emalloc (argc * sizeof (zval * ));
2005+ if (zend_get_parameters_array (ht , argc , z_args ) == FAILURE ) {
2006+ efree (z_args );
2007+ RETURN_FALSE ;
2008+ }
2009+
2010+ if (redis_sock_get (object , & redis_sock TSRMLS_CC ) < 0 ) {
2011+ RETURN_FALSE ;
2012+ }
2013+
2014+ cmd = estrdup ("$4" _NL "SORT" _NL );
2015+ cmd_len = strlen (cmd );
2016+
2017+ for (i = 0 ; i < argc ; i ++ ) {
2018+
2019+ zval * z_cur = z_args [i ];
2020+
2021+ switch (Z_TYPE_P (z_cur )) {
2022+ case IS_STRING :
2023+ if (strncasecmp (Z_STRVAL_P (z_cur ), "STORE" , 5 ) == 0 ) {
2024+ using_store = 1 ;
2025+ }
2026+ elements ++ ;
2027+ old_cmd = cmd ;
2028+ cmd_len = redis_cmd_format (& cmd , "%s"
2029+ "$%d" _NL
2030+ "%s" _NL
2031+ , cmd , cmd_len
2032+ , Z_STRLEN_P (z_cur ), Z_STRVAL_P (z_cur ), Z_STRLEN_P (z_cur ));
2033+ break ;
2034+
2035+ case IS_LONG :
2036+ elements ++ ;
2037+ old_cmd = cmd ;
2038+ cmd_len = redis_cmd_format (& cmd , "%s"
2039+ "$%d" _NL
2040+ "%d" _NL
2041+ , cmd , cmd_len
2042+ , integer_length (Z_LVAL_P (z_cur )), Z_LVAL_P (z_cur ));
2043+ break ;
2044+
2045+ case IS_DOUBLE :
2046+ elements ++ ;
2047+ old_cmd = cmd ;
2048+ cmd_len = redis_cmd_format (& cmd , "%s"
2049+ "$%d" _NL
2050+ "%f" _NL
2051+ , cmd , cmd_len
2052+ , double_length (Z_DVAL_P (z_cur )), Z_DVAL_P (z_cur ));
2053+ break ;
2054+ default :
2055+ continue ;
2056+
2057+ }
2058+ if (old_cmd ) {
2059+ efree (old_cmd );
2060+ }
2061+ }
2062+
2063+ if (elements == 1 ) {
2064+ RETURN_FALSE ;
2065+ }
2066+
2067+
2068+ /* complete with prefix */
2069+ old_cmd = cmd ;
2070+ cmd_len = redis_cmd_format (& cmd , "*%d" _NL "%s" ,
2071+ elements , cmd , cmd_len );
2072+ efree (old_cmd );
2073+
2074+ /* run command */
2075+ REDIS_PROCESS_REQUEST (redis_sock , cmd , cmd_len );
2076+ if (using_store ) {
2077+ IF_ATOMIC () {
2078+ redis_long_response (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL );
2079+ }
2080+ REDIS_PROCESS_RESPONSE (redis_long_response );
2081+ } else {
2082+ IF_ATOMIC () {
2083+ if (redis_sock_read_multibulk_reply (INTERNAL_FUNCTION_PARAM_PASSTHRU ,
2084+ redis_sock , NULL ) < 0 ) {
2085+ RETURN_FALSE ;
2086+ }
2087+ }
2088+ REDIS_PROCESS_RESPONSE (redis_sock_read_multibulk_reply );
2089+ }
2090+ }
19892091
19902092PHPAPI void generic_sort_cmd (INTERNAL_FUNCTION_PARAMETERS , char * sort , int use_alpha ) {
19912093
0 commit comments