diff options
author | Nicolas Favre-Felix <n.favrefelix@gmail.com> | 2011-11-27 23:57:39 +0400 |
---|---|---|
committer | Nicolas Favre-Felix <n.favrefelix@gmail.com> | 2011-11-27 23:57:39 +0400 |
commit | 7781557bb1c09584d47b9132015688810da1514d (patch) | |
tree | 1b3d9fe789e044354aece8414f8a743218d0dcd8 | |
parent | 1ce8bcc5340bcf928ccca72a043ec0c44a4e19ac (diff) |
Added missing UNWATCH.
Possibly resolves GitHub issue #86 (TBC).
-rw-r--r-- | redis_array.c | 19 | ||||
-rw-r--r-- | redis_array.h | 1 | ||||
-rw-r--r-- | redis_array_impl.c | 12 | ||||
-rw-r--r-- | redis_array_impl.h | 1 |
4 files changed, 33 insertions, 0 deletions
diff --git a/redis_array.c b/redis_array.c index cf67cfe2..e1955735 100644 --- a/redis_array.c +++ b/redis_array.c @@ -61,6 +61,7 @@ zend_function_entry redis_array_functions[] = { PHP_ME(RedisArray, multi, NULL, ZEND_ACC_PUBLIC) PHP_ME(RedisArray, exec, NULL, ZEND_ACC_PUBLIC) PHP_ME(RedisArray, discard, NULL, ZEND_ACC_PUBLIC) + PHP_ME(RedisArray, unwatch, NULL, ZEND_ACC_PUBLIC) /* Aliases */ PHP_MALIAS(RedisArray, delete, del, NULL, ZEND_ACC_PUBLIC) @@ -1049,3 +1050,21 @@ PHP_METHOD(RedisArray, discard) /* remove multi object */ ra->z_multi_exec = NULL; } + +PHP_METHOD(RedisArray, unwatch) +{ + zval *object; + RedisArray *ra; + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", + &object, redis_array_ce) == FAILURE) { + RETURN_FALSE; + } + + if (redis_array_get(object, &ra TSRMLS_CC) < 0 || !ra->z_multi_exec) { + RETURN_FALSE; + } + + /* unwatch keys, stay in multi/exec mode. */ + ra_index_unwatch(ra->z_multi_exec, return_value TSRMLS_CC); +} diff --git a/redis_array.h b/redis_array.h index dfedbca5..d34b710b 100644 --- a/redis_array.h +++ b/redis_array.h @@ -24,6 +24,7 @@ PHP_METHOD(RedisArray, setOption); PHP_METHOD(RedisArray, multi); PHP_METHOD(RedisArray, exec); PHP_METHOD(RedisArray, discard); +PHP_METHOD(RedisArray, unwatch); typedef struct RedisArray_ { diff --git a/redis_array_impl.c b/redis_array_impl.c index c7f475d3..a13fc998 100644 --- a/redis_array_impl.c +++ b/redis_array_impl.c @@ -528,6 +528,18 @@ ra_index_discard(zval *z_redis, zval *return_value TSRMLS_DC) { zval_dtor(&z_ret); } +void +ra_index_unwatch(zval *z_redis, zval *return_value TSRMLS_DC) { + + zval z_fun_unwatch, z_ret; + + /* run UNWATCH */ + ZVAL_STRING(&z_fun_unwatch, "UNWATCH", 0); + call_user_function(&redis_ce->function_table, &z_redis, &z_fun_unwatch, &z_ret, 0, NULL TSRMLS_CC); + + zval_dtor(&z_ret); +} + zend_bool ra_is_write_cmd(RedisArray *ra, const char *cmd, int cmd_len) { diff --git a/redis_array_impl.h b/redis_array_impl.h index c42a97a7..78338bc4 100644 --- a/redis_array_impl.h +++ b/redis_array_impl.h @@ -21,6 +21,7 @@ void ra_index_keys(zval *z_pairs, zval *z_redis TSRMLS_DC); void ra_index_del(zval *z_keys, zval *z_redis TSRMLS_DC); void ra_index_exec(zval *z_redis, zval *return_value, int keep_all TSRMLS_DC); void ra_index_discard(zval *z_redis, zval *return_value TSRMLS_DC); +void ra_index_unwatch(zval *z_redis, zval *return_value TSRMLS_DC); zend_bool ra_is_write_cmd(RedisArray *ra, const char *cmd, int cmd_len); void ra_rehash(RedisArray *ra, zval *z_cb TSRMLS_DC); |