@@ -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