Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichael-grunder <michael.grunder@gmail.com>2014-06-08 04:15:37 +0400
committermichael-grunder <michael.grunder@gmail.com>2015-05-06 00:39:30 +0300
commit27815795fa7fec0d25a02bfbf0fe0456b107ba38 (patch)
treec0bf47c44f037cd2499587a9c371a029d2aa1340
parent2f3257a8e3c1bec7578028851e60013a2745676b (diff)
SMOVE
Implemented SMOVE command
-rw-r--r--redis.c34
-rw-r--r--redis_cluster.c7
-rw-r--r--redis_cluster.h1
-rw-r--r--redis_commands.c46
-rw-r--r--redis_commands.h4
5 files changed, 59 insertions, 33 deletions
diff --git a/redis.c b/redis.c
index 7323f494..769b991b 100644
--- a/redis.c
+++ b/redis.c
@@ -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: */