@@ -1989,81 +1989,137 @@ PHP_METHOD(Redis, sDiffStore) {
19891989
19901990PHP_METHOD (Redis , sort ) {
19911991
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 ;
19951995 int i , argc = ZEND_NUM_ARGS ();
19961996 int using_store = 0 ;
19971997 RedisSock * redis_sock ;
19981998
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 ) {
20072002 RETURN_FALSE ;
20082003 }
20092004
20102005 if (redis_sock_get (object , & redis_sock TSRMLS_CC ) < 0 ) {
20112006 RETURN_FALSE ;
20122007 }
20132008
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 );
20182011
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 );
20202027
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+ }
20342029
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+ }
20442043
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+ }
20562060
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 );
20572075 }
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 ;
20592087 efree (old_cmd );
20602088 }
2061- }
20622089
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 ) {
20662093
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+ }
20672123
20682124 /* complete with prefix */
20692125 old_cmd = cmd ;
0 commit comments