Skip to content
This repository has been archived by the owner on Jul 24, 2019. It is now read-only.

Commit

Permalink
More MULTI/EXEC/PIPELINE fixes.
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolasff committed May 13, 2010
1 parent a8558c7 commit 576dd06
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 90 deletions.
6 changes: 3 additions & 3 deletions common.h
Expand Up @@ -66,7 +66,7 @@
RETURN_FALSE; \
}

#define REDIS_MULTI_RESPONSE(callback) IF_MULTI_OR_PIPELINE() { \
#define REDIS_SAVE_CALLBACK(callback) IF_MULTI_OR_PIPELINE() { \
fold_item *f1 = malloc(sizeof(fold_item)); \
f1->fun = (void *)callback; \
f1->next = NULL; \
Expand All @@ -80,15 +80,15 @@
#define REDIS_ELSE_IF_MULTI(function) \
else if(get_flag(object) == REDIS_MULTI) { \
if(redis_response_enqueued(redis_sock TSRMLS_CC) == 1) {\
REDIS_MULTI_RESPONSE(function); \
REDIS_SAVE_CALLBACK(function); \
RETURN_ZVAL(getThis(), 1, 0);\
} else {\
RETURN_FALSE;\
}\
}

#define REDIS_ELSE_IF_PIPELINE(function) else IF_PIPELINE() { \
REDIS_MULTI_RESPONSE(function); \
REDIS_SAVE_CALLBACK(function); \
RETURN_ZVAL(getThis(), 1, 0);\
}

Expand Down
59 changes: 35 additions & 24 deletions library.c
Expand Up @@ -186,7 +186,7 @@ redis_cmd_format(char **ret, char *format, ...) {
}
}

PHPAPI void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock TSRMLS_DC) {
PHPAPI void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab TSRMLS_DC) {

char *response;
int response_len;
Expand All @@ -198,7 +198,11 @@ PHPAPI void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *

double ret = atof(response);
efree(response);
RETURN_DOUBLE(ret);
IF_MULTI_OR_PIPELINE() {
add_next_index_double(z_tab, ret);
} else {
RETURN_DOUBLE(ret);
}
}

PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab TSRMLS_DC) {
Expand Down Expand Up @@ -262,34 +266,41 @@ PHPAPI void redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_s
RETURN_FALSE;
}
}



PHPAPI void redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab TSRMLS_DC) {

redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL TSRMLS_CC);
array_zip_values_and_scores(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
}

PHPAPI void redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab TSRMLS_DC) {

char *response;
int response_len;
char ret;
char *response;
int response_len;
char ret;

zval *object = getThis();
if ((response = redis_sock_read(redis_sock, &response_len TSRMLS_CC)) == NULL) {
IF_MULTI_OR_PIPELINE() {
add_next_index_bool(z_tab, 0);
return;
}
RETURN_FALSE;
}
ret = response[1];
efree(response);

zval *object = getThis();
if ((response = redis_sock_read(redis_sock, &response_len TSRMLS_CC)) == NULL) {
IF_MULTI_OR_PIPELINE() {
add_next_index_bool(z_tab, 0);
return;
if(ret == '1') {
add_next_index_bool(z_tab, 1);
} else {
add_next_index_bool(z_tab, 0);
}
}
RETURN_FALSE;
}
ret = response[1];
efree(response);

IF_MULTI_OR_PIPELINE() {
if(ret == '1') {
add_next_index_bool(z_tab, 1);
} else {
add_next_index_bool(z_tab, 0);
}
}

if (ret == '1') {
RETURN_TRUE;
if (ret == '1') {
RETURN_TRUE;
} else {
RETURN_FALSE;
}
Expand Down
4 changes: 2 additions & 2 deletions library.h
Expand Up @@ -3,11 +3,10 @@ int redis_cmd_format(char **ret, char *format, ...);

PHPAPI char * redis_sock_read(RedisSock *redis_sock, int *buf_len TSRMLS_DC);

PHPAPI void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock TSRMLS_DC);
PHPAPI void redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab TSRMLS_DC);
PHPAPI void redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval* z_tab TSRMLS_DC);
PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab TSRMLS_DC);
PHPAPI void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock TSRMLS_DC);
PHPAPI void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab TSRMLS_DC);
PHPAPI void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab TSRMLS_DC);
PHPAPI RedisSock* redis_sock_create(char *host, int host_len, unsigned short port, long timeout);
PHPAPI int redis_sock_connect(RedisSock *redis_sock TSRMLS_DC);
Expand All @@ -16,6 +15,7 @@ PHPAPI int redis_sock_disconnect(RedisSock *redis_sock TSRMLS_DC);
PHPAPI char *redis_sock_read_bulk_reply(RedisSock *redis_sock, int bytes);
PHPAPI int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *_z_tab TSRMLS_DC);
PHPAPI int redis_sock_read_multibulk_reply_loop(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, int numElems TSRMLS_DC);
PHPAPI void redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab TSRMLS_DC);
PHPAPI int redis_sock_write(RedisSock *redis_sock, char *cmd, size_t sz);
PHPAPI void redis_check_eof(RedisSock *redis_sock TSRMLS_DC);
//PHPAPI int redis_sock_get(zval *id, RedisSock **redis_sock TSRMLS_DC);
Expand Down
40 changes: 17 additions & 23 deletions redis.c
Expand Up @@ -2569,27 +2569,22 @@ PHP_METHOD(Redis, zRangeByScore)
efree(limit);
}

if (redis_sock_write(redis_sock, cmd, cmd_len) < 0) {
efree(cmd);
RETURN_FALSE;
}
efree(cmd);

if (redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU,
redis_sock, NULL TSRMLS_CC) < 0) {
RETURN_FALSE;
}

if(!withscores) {
return;
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
if(withscores) {
/* with scores! we have to transform the return array.
* return_value currently holds this: [elt0, val0, elt1, val1 ... ]
* we want [elt0 => val0, elt1 => val1], etc.
*/
IF_ATOMIC() {
redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL TSRMLS_CC);
}
REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply_zipped);
} else {
IF_ATOMIC() {
redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL TSRMLS_CC);
}
REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply);
}
/* with scores! we have to transform the return array.
* return_value currently holds this: [elt0, val0, elt1, val1 ... ]
* we want [elt0 => val0, elt1 => val1], etc.
*/
IF_NOT_MULTI() {
array_zip_values_and_scores(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
} ELSE_IF_MULTI()
}
/* }}} */

Expand Down Expand Up @@ -2645,10 +2640,9 @@ PHP_METHOD(Redis, zScore)

REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
IF_ATOMIC() {
redis_bulk_double_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock TSRMLS_CC);
redis_bulk_double_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL TSRMLS_CC);
}
REDIS_PROCESS_RESPONSE(redis_bulk_double_response);

}

PHPAPI void generic_incrby_method(INTERNAL_FUNCTION_PARAMETERS, char *keyword, int keyword_len TSRMLS_DC) {
Expand All @@ -2673,7 +2667,7 @@ PHPAPI void generic_incrby_method(INTERNAL_FUNCTION_PARAMETERS, char *keyword, i

REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
IF_ATOMIC() {
redis_bulk_double_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock TSRMLS_CC);
redis_bulk_double_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL TSRMLS_CC);
}
REDIS_PROCESS_RESPONSE(redis_bulk_double_response);

Expand Down
99 changes: 61 additions & 38 deletions tests/testPipeline.php
Expand Up @@ -257,7 +257,7 @@ function test2($r, $type) {
assert(is_array($ret) && count($ret) === 1);
assert(is_string($ret[0]));

/* ttl, mget, mset, msetnx, expire, expireAt */
// ttl, mget, mset, msetnx, expire, expireAt
$ret = $r->multi($type)
->ttl('key')
->mget(array('key1', 'key2', 'key3'))
Expand All @@ -279,7 +279,7 @@ function test2($r, $type) {
assert($ret[$i++] === TRUE); // expireAt returns TRUE for an existing key
assert(count($ret) === $i);

/* lists */
// lists
$ret = $r->multi($type)
->delete('lkey', 'lDest')
->rpush('lkey', 'lvalue')
Expand All @@ -296,7 +296,7 @@ function test2($r, $type) {
->llen('lkey')
->lget('lkey', 0)
->lGetRange('lkey', 0, -1)
->lSet('lkey', 1, "newValue") /* check errors on key not exists */
->lSet('lkey', 1, "newValue") // check errors on missing key
->lGetRange('lkey', 0, -1)
->llen('lkey')
->exec();
Expand Down Expand Up @@ -325,7 +325,7 @@ function test2($r, $type) {
assert(count($ret) === $i);


/* sets */
// sets
$ret = $r->multi($type)
->delete('skey1', 'skey2', 'skeydest', 'skeyUnion', 'sDiffDest')
->sadd('skey1', 'sValue1')
Expand Down Expand Up @@ -406,40 +406,63 @@ function test2($r, $type) {

assert(count($ret) === $i);

return;
/* sets */
// sorted sets
$ret = $r->multi($type)
->zadd('zkey1', 1, 'zValue1')
->zadd('zkey1', 5, 'zValue5')
->zadd('zkey1', 2, 'zValue2')
->zrange('zkey1', 0, -1)
->zDelete('zkey1', 'zValue2')
->zrange('zkey1', 0, -1)
->zadd('zkey1', 11, 'zValue11')
->zadd('zkey1', 12, 'zValue12')
->zadd('zkey1', 13, 'zValue13')
->zadd('zkey1', 14, 'zValue14')
->zadd('zkey1', 15, 'zValue15')
->zDeleteRangeByScore('zkey1', 11, 13)
->zrange('zkey1', 0, -1)
->zReverseRange('zkey1', 0, -1)
//->zRangeByScore('zkey1', 1, 6) /* seg fault */
->zCard('zkey1')
//->zScore('zkey1', 'zValue15') /* no result */
->zadd('zkey2', 5, 'zValue5')
->zadd('zkey2', 2, 'zValue2')
//->zRange('zkey1', 'zkey2')
->zInter('zInter', array('zkey1', 'zkey2'))
->zRange('zkey1', 0, -1)
->zRange('zkey2', 0, -1)
->zRange('zInter', 0, -1)
->zInter('zUnion', array('zkey1', 'zkey2'))
->zRange('zUnion', 0, -1)
->zadd('zkey5', 5, 'zValue5')
->zIncrBy('zkey5', 3, 'zValue5') /* fix this */
->zScore('zkey5', 'zValue5')
->exec();
// var_dump($ret);
->delete('zkey1', 'zkey2', 'zkey5')
->zadd('zkey1', 1, 'zValue1')
->zadd('zkey1', 5, 'zValue5')
->zadd('zkey1', 2, 'zValue2')
->zRange('zkey1', 0, -1)
->zDelete('zkey1', 'zValue2')
->zRange('zkey1', 0, -1)
->zadd('zkey1', 11, 'zValue11')
->zadd('zkey1', 12, 'zValue12')
->zadd('zkey1', 13, 'zValue13')
->zadd('zkey1', 14, 'zValue14')
->zadd('zkey1', 15, 'zValue15')
->zDeleteRangeByScore('zkey1', 11, 13)
->zrange('zkey1', 0, -1)
->zReverseRange('zkey1', 0, -1)
->zRangeByScore('zkey1', 1, 6)
->zCard('zkey1')
->zScore('zkey1', 'zValue15')
// ->zadd('zkey2', 5, 'zValue5')
// ->zadd('zkey2', 2, 'zValue2')
// //->zRange('zkey1', 'zkey2')
// ->zInter('zInter', array('zkey1', 'zkey2'))
// ->zRange('zkey1', 0, -1)
// ->zRange('zkey2', 0, -1)
// ->zRange('zInter', 0, -1)
// ->zInter('zUnion', array('zkey1', 'zkey2'))
// ->zRange('zUnion', 0, -1)
// ->zadd('zkey5', 5, 'zValue5')
// ->zIncrBy('zkey5', 3, 'zValue5') /* fix this */
// ->zScore('zkey5', 'zValue5')
->exec();
// var_dump($ret);

$i = 0;
assert(is_array($ret));
assert(is_long($ret[$i]) && $ret[$i] >= 0 && $ret[$i] <= 3); $i++; // deleting at most 3 keys
assert($ret[$i++] === 1);
assert($ret[$i++] === 1);
assert($ret[$i++] === 1);
assert($ret[$i++] === array('zValue1', 'zValue2', 'zValue5'));
assert($ret[$i++] === 1);
assert($ret[$i++] === array('zValue1', 'zValue5'));
assert($ret[$i++] === 1); // adding zValue11
assert($ret[$i++] === 1); // adding zValue12
assert($ret[$i++] === 1); // adding zValue13
assert($ret[$i++] === 1); // adding zValue14
assert($ret[$i++] === 1); // adding zValue15
assert($ret[$i++] === 3); // deleted zValue11, zValue12, zValue13
assert($ret[$i++] === array('zValue1', 'zValue5', 'zValue14', 'zValue15'));
assert($ret[$i++] === array('zValue15', 'zValue14', 'zValue5', 'zValue1'));
assert($ret[$i++] === array('zValue1', 'zValue5'));
assert($ret[$i++] === 4); // 4 elements
assert($ret[$i++] === 15.0);

return;

/* hash */
$ret = $r->multi($type)
Expand All @@ -461,7 +484,7 @@ function test2($r, $type) {


$count = 10000;
$count = 10;
$count = 100;

for($i = 1; $i <= $count; $i++) {
test1($r, Redis::MULTI);
Expand Down

0 comments on commit 576dd06

Please sign in to comment.