@@ -68,6 +68,7 @@ static zend_function_entry redis_functions[] = {
68
68
PHP_ME (Redis , decr , NULL , ZEND_ACC_PUBLIC )
69
69
PHP_ME (Redis , type , NULL , ZEND_ACC_PUBLIC )
70
70
PHP_ME (Redis , getKeys , NULL , ZEND_ACC_PUBLIC )
71
+ PHP_ME (Redis , sort , NULL , ZEND_ACC_PUBLIC )
71
72
PHP_ME (Redis , sortAsc , NULL , ZEND_ACC_PUBLIC )
72
73
PHP_ME (Redis , sortAscAlpha , NULL , ZEND_ACC_PUBLIC )
73
74
PHP_ME (Redis , sortDesc , NULL , ZEND_ACC_PUBLIC )
@@ -1986,6 +1987,107 @@ PHP_METHOD(Redis, sDiffStore) {
1986
1987
}
1987
1988
/* }}} */
1988
1989
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
+ }
1989
2091
1990
2092
PHPAPI void generic_sort_cmd (INTERNAL_FUNCTION_PARAMETERS , char * sort , int use_alpha ) {
1991
2093
0 commit comments