Skip to content

Commit 4360785

Browse files
committed
Added generic sort. TODO: doc, tests.
1 parent 0b2a644 commit 4360785

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed

php_redis.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ PHP_METHOD(Redis, incr);
4040
PHP_METHOD(Redis, decr);
4141
PHP_METHOD(Redis, type);
4242
PHP_METHOD(Redis, getKeys);
43+
PHP_METHOD(Redis, sort);
4344
PHP_METHOD(Redis, sortAsc);
4445
PHP_METHOD(Redis, sortAscAlpha);
4546
PHP_METHOD(Redis, sortDesc);

redis.c

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

19902092
PHPAPI void generic_sort_cmd(INTERNAL_FUNCTION_PARAMETERS, char *sort, int use_alpha) {
19912093

0 commit comments

Comments
 (0)