@@ -1989,81 +1989,137 @@ PHP_METHOD(Redis, sDiffStore) {
1989
1989
1990
1990
PHP_METHOD (Redis , sort ) {
1991
1991
1992
- zval * object = getThis (), * * z_args ;
1993
- char * cmd , * old_cmd = NULL ;
1994
- int cmd_len , elements = 1 ;
1992
+ zval * object = getThis (), * z_array = NULL , * * z_cur ;
1993
+ char * cmd , * old_cmd = NULL , * key ;
1994
+ int cmd_len , elements = 2 , key_len ;
1995
1995
int i , argc = ZEND_NUM_ARGS ();
1996
1996
int using_store = 0 ;
1997
1997
RedisSock * redis_sock ;
1998
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 );
1999
+ if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Os|a" ,
2000
+ & object , redis_ce ,
2001
+ & key , & key_len , & z_array ) == FAILURE ) {
2007
2002
RETURN_FALSE ;
2008
2003
}
2009
2004
2010
2005
if (redis_sock_get (object , & redis_sock TSRMLS_CC ) < 0 ) {
2011
2006
RETURN_FALSE ;
2012
2007
}
2013
2008
2014
- cmd = estrdup ("$4" _NL "SORT" _NL );
2015
- cmd_len = strlen (cmd );
2016
-
2017
- for (i = 0 ; i < argc ; i ++ ) {
2009
+ cmd_len = redis_cmd_format (& cmd , "$4" _NL "SORT" _NL "$%d" _NL "%s" _NL
2010
+ , key_len , key , key_len );
2018
2011
2019
- zval * z_cur = z_args [i ];
2012
+ if (z_array ) {
2013
+ if ((zend_hash_find (Z_ARRVAL_P (z_array ), "by" , sizeof ("by" ), (void * * ) & z_cur ) == SUCCESS
2014
+ || zend_hash_find (Z_ARRVAL_P (z_array ), "BY" , sizeof ("BY" ), (void * * ) & z_cur ) == SUCCESS )
2015
+ && Z_TYPE_PP (z_cur ) == IS_STRING ) {
2016
+
2017
+ old_cmd = cmd ;
2018
+ cmd_len = redis_cmd_format (& cmd , "%s"
2019
+ "$2" _NL
2020
+ "BY" _NL
2021
+ "$%d" _NL
2022
+ "%s" _NL
2023
+ , cmd , cmd_len
2024
+ , Z_STRLEN_PP (z_cur ), Z_STRVAL_PP (z_cur ), Z_STRLEN_PP (z_cur ));
2025
+ elements += 2 ;
2026
+ efree (old_cmd );
2020
2027
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 ;
2028
+ }
2034
2029
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 ;
2030
+ if ((zend_hash_find (Z_ARRVAL_P (z_array ), "sort" , sizeof ("sort" ), (void * * ) & z_cur ) == SUCCESS
2031
+ || zend_hash_find (Z_ARRVAL_P (z_array ), "SORT" , sizeof ("SORT" ), (void * * ) & z_cur ) == SUCCESS )
2032
+ && Z_TYPE_PP (z_cur ) == IS_STRING ) {
2033
+
2034
+ old_cmd = cmd ;
2035
+ cmd_len = redis_cmd_format (& cmd , "%s"
2036
+ "$%d" _NL
2037
+ "%s" _NL
2038
+ , cmd , cmd_len
2039
+ , Z_STRLEN_PP (z_cur ), Z_STRVAL_PP (z_cur ), Z_STRLEN_PP (z_cur ));
2040
+ elements += 1 ;
2041
+ efree (old_cmd );
2042
+ }
2044
2043
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 ;
2044
+ if ((zend_hash_find (Z_ARRVAL_P (z_array ), "store" , sizeof ("store" ), (void * * ) & z_cur ) == SUCCESS
2045
+ || zend_hash_find (Z_ARRVAL_P (z_array ), "STORE" , sizeof ("STORE" ), (void * * ) & z_cur ) == SUCCESS )
2046
+ && Z_TYPE_PP (z_cur ) == IS_STRING ) {
2047
+
2048
+ using_store = 1 ;
2049
+ old_cmd = cmd ;
2050
+ cmd_len = redis_cmd_format (& cmd , "%s"
2051
+ "$5" _NL
2052
+ "STORE" _NL
2053
+ "$%d" _NL
2054
+ "%s" _NL
2055
+ , cmd , cmd_len
2056
+ , Z_STRLEN_PP (z_cur ), Z_STRVAL_PP (z_cur ), Z_STRLEN_PP (z_cur ));
2057
+ elements += 2 ;
2058
+ efree (old_cmd );
2059
+ }
2056
2060
2061
+ if ((zend_hash_find (Z_ARRVAL_P (z_array ), "get" , sizeof ("get" ), (void * * ) & z_cur ) == SUCCESS
2062
+ || zend_hash_find (Z_ARRVAL_P (z_array ), "GET" , sizeof ("GET" ), (void * * ) & z_cur ) == SUCCESS )
2063
+ && Z_TYPE_PP (z_cur ) == IS_STRING ) {
2064
+
2065
+ old_cmd = cmd ;
2066
+ cmd_len = redis_cmd_format (& cmd , "%s"
2067
+ "$3" _NL
2068
+ "GET" _NL
2069
+ "$%d" _NL
2070
+ "%s" _NL
2071
+ , cmd , cmd_len
2072
+ , Z_STRLEN_PP (z_cur ), Z_STRVAL_PP (z_cur ), Z_STRLEN_PP (z_cur ));
2073
+ elements += 2 ;
2074
+ efree (old_cmd );
2057
2075
}
2058
- if (old_cmd ) {
2076
+
2077
+ if ((zend_hash_find (Z_ARRVAL_P (z_array ), "alpha" , sizeof ("alpha" ), (void * * ) & z_cur ) == SUCCESS
2078
+ || zend_hash_find (Z_ARRVAL_P (z_array ), "ALPHA" , sizeof ("ALPHA" ), (void * * ) & z_cur ) == SUCCESS )
2079
+ && Z_TYPE_PP (z_cur ) == IS_BOOL && Z_BVAL_PP (z_cur ) == 1 ) {
2080
+
2081
+ old_cmd = cmd ;
2082
+ cmd_len = redis_cmd_format (& cmd , "%s"
2083
+ "$5" _NL
2084
+ "ALPHA" _NL
2085
+ , cmd , cmd_len );
2086
+ elements += 1 ;
2059
2087
efree (old_cmd );
2060
2088
}
2061
- }
2062
2089
2063
- if ( elements == 1 ) {
2064
- RETURN_FALSE ;
2065
- }
2090
+ if (( zend_hash_find ( Z_ARRVAL_P ( z_array ), "limit" , sizeof ( "limit" ), ( void * * ) & z_cur ) == SUCCESS
2091
+ || zend_hash_find ( Z_ARRVAL_P ( z_array ), "LIMIT" , sizeof ( "LIMIT" ), ( void * * ) & z_cur ) == SUCCESS )
2092
+ && Z_TYPE_PP ( z_cur ) == IS_ARRAY ) {
2066
2093
2094
+ if (zend_hash_num_elements (Z_ARRVAL_PP (z_cur )) == 2 ) {
2095
+ zval * * z_offset_pp , * * z_count_pp ;
2096
+ // get the two values from the table, check that they are indeed of LONG type
2097
+ if (SUCCESS == zend_hash_index_find (Z_ARRVAL_PP (z_cur ), 0 , (void * * )& z_offset_pp ) &&
2098
+ SUCCESS == zend_hash_index_find (Z_ARRVAL_PP (z_cur ), 1 , (void * * )& z_count_pp ) &&
2099
+ Z_TYPE_PP (z_offset_pp ) == IS_LONG &&
2100
+ Z_TYPE_PP (z_count_pp ) == IS_LONG ) {
2101
+
2102
+ long limit_low = Z_LVAL_PP (z_offset_pp );
2103
+ long limit_high = Z_LVAL_PP (z_count_pp );
2104
+
2105
+ old_cmd = cmd ;
2106
+ cmd_len = redis_cmd_format (& cmd , "%s"
2107
+ "$5" _NL
2108
+ "LIMIT" _NL
2109
+ "$%d" _NL
2110
+ "%ld" _NL
2111
+ "$%d" _NL
2112
+ "%ld" _NL
2113
+ , cmd , cmd_len
2114
+ , integer_length (limit_low ), limit_low
2115
+ , integer_length (limit_high ), limit_high );
2116
+ elements += 3 ;
2117
+ efree (old_cmd );
2118
+ }
2119
+ }
2120
+ }
2121
+
2122
+ }
2067
2123
2068
2124
/* complete with prefix */
2069
2125
old_cmd = cmd ;
0 commit comments