Skip to content

Commit c18fb24

Browse files
committed
Fixed "sort".
1 parent 4360785 commit c18fb24

File tree

1 file changed

+110
-54
lines changed

1 file changed

+110
-54
lines changed

redis.c

Lines changed: 110 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1989,81 +1989,137 @@ PHP_METHOD(Redis, sDiffStore) {
19891989

19901990
PHP_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

Comments
 (0)