diff options
author | michael-grunder <michael.grunder@gmail.com> | 2014-06-08 04:15:37 +0400 |
---|---|---|
committer | michael-grunder <michael.grunder@gmail.com> | 2015-05-06 00:39:30 +0300 |
commit | 27815795fa7fec0d25a02bfbf0fe0456b107ba38 (patch) | |
tree | c0bf47c44f037cd2499587a9c371a029d2aa1340 | |
parent | 2f3257a8e3c1bec7578028851e60013a2745676b (diff) |
SMOVE
Implemented SMOVE command
-rw-r--r-- | redis.c | 34 | ||||
-rw-r--r-- | redis_cluster.c | 7 | ||||
-rw-r--r-- | redis_cluster.h | 1 | ||||
-rw-r--r-- | redis_commands.c | 46 | ||||
-rw-r--r-- | redis_commands.h | 4 |
5 files changed, 59 insertions, 33 deletions
@@ -1322,39 +1322,7 @@ PHP_METHOD(Redis, sRemove) */ PHP_METHOD(Redis, sMove) { - zval *object; - RedisSock *redis_sock; - char *src = NULL, *dst = NULL, *val = NULL, *cmd; - int src_len, dst_len, val_len, cmd_len; - int val_free, src_free, dst_free; - zval *z_value; - - if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ossz", - &object, redis_ce, - &src, &src_len, - &dst, &dst_len, - &z_value) == FAILURE) { - RETURN_FALSE; - } - - if (redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) { - RETURN_FALSE; - } - - val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC); - src_free = redis_key_prefix(redis_sock, &src, &src_len); - dst_free = redis_key_prefix(redis_sock, &dst, &dst_len); - cmd_len = redis_cmd_format_static(&cmd, "SMOVE", "sss", src, - src_len, dst, dst_len, val, val_len); - if(val_free) STR_FREE(val); - if(src_free) efree(src); - if(dst_free) efree(dst); - - REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len); - IF_ATOMIC() { - redis_1_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL); - } - REDIS_PROCESS_RESPONSE(redis_1_response); + REDIS_PROCESS_CMD(smove, redis_1_response); } /* }}} */ diff --git a/redis_cluster.c b/redis_cluster.c index 4a3f5c4a..8321a8be 100644 --- a/redis_cluster.c +++ b/redis_cluster.c @@ -111,6 +111,7 @@ zend_function_entry redis_cluster_functions[] = { PHP_ME(RedisCluster, pfmerge, NULL, ZEND_ACC_PUBLIC) PHP_ME(RedisCluster, setrange, NULL, ZEND_ACC_PUBLIC) PHP_ME(RedisCluster, restore, NULL, ZEND_ACC_PUBLIC) + PHP_ME(RedisCluster, smove, NULL, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; @@ -423,6 +424,12 @@ PHP_METHOD(RedisCluster, sismember) { } /* }}} */ +/* {{{ proto bool RedisCluster::smove(sting src, string dst, string mem) */ +PHP_METHOD(RedisCluster, smove) { + CLUSTER_PROCESS_CMD(smove, cluster_1_resp); +} +/* }}} */ + /* {{{ proto bool RedisCluster::persist(string key) */ PHP_METHOD(RedisCluster, persist) { CLUSTER_PROCESS_KW_CMD("PERSIST", redis_key_cmd, cluster_1_resp); diff --git a/redis_cluster.h b/redis_cluster.h index c4d1cb2b..c2016c2f 100644 --- a/redis_cluster.h +++ b/redis_cluster.h @@ -135,4 +135,5 @@ PHP_METHOD(RedisCluster, pfadd); PHP_METHOD(RedisCluster, pfmerge); PHP_METHOD(RedisCluster, restore); PHP_METHOD(RedisCluster, setrange); +PHP_METHOD(RedisCluster, smove); #endif diff --git a/redis_commands.c b/redis_commands.c index 7eaf5b44..156e0256 100644 --- a/redis_commands.c +++ b/redis_commands.c @@ -1129,4 +1129,50 @@ int redis_lrem_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, return SUCCESS; } +int redis_smove_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, + char **cmd, int *cmd_len, short *slot, void **ctx) +{ + char *src, *dst, *val; + int src_len, dst_len, val_len; + int val_free, src_free, dst_free; + zval *z_val; + + if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ssz", &src, &src_len, + &dst, &dst_len, &z_val)==FAILURE) + { + return FAILURE; + } + + val_free = redis_serialize(redis_sock, z_val, &val, &val_len TSRMLS_CC); + src_free = redis_key_prefix(redis_sock, &src, &src_len); + dst_free = redis_key_prefix(redis_sock, &dst, &dst_len); + + // Protect against a CROSSSLOT error + if(slot) { + short slot1 = cluster_hash_key(src, src_len); + short slot2 = cluster_hash_key(dst, dst_len); + if(slot1 != slot2) { + php_error_docref(0 TSRMLS_CC, E_WARNING, + "Source and destination keys don't hash to the same slot!"); + if(val_free) STR_FREE(val); + if(src_free) efree(src); + if(dst_free) efree(dst); + return FAILURE; + } + *slot = slot1; + } + + // Construct command + *cmd_len = redis_cmd_format_static(cmd, "SMOVE", "sss", src, src_len, dst, + dst_len, val, val_len); + + // Cleanup + if(val_free) STR_FREE(val); + if(src_free) efree(src); + if(dst_free) efree(dst); + + // Succcess! + return SUCCESS; +} + /* vim: set tabstop=4 softtabstops=4 noexpandtab shiftwidth=4: */ diff --git a/redis_commands.h b/redis_commands.h index e535b18d..006d4a79 100644 --- a/redis_commands.h +++ b/redis_commands.h @@ -101,6 +101,10 @@ int redis_linsert_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, int redis_lrem_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, char **cmd, int *cmd_len, short *slot, void **ctx); + +int redis_smove_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, + char **cmd, int *cmd_len, short *slot, void **ctx); + #endif /* vim: set tabstop=4 softtabstops=4 noexpandtab shiftwidth=4: */ |