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>2019-02-14 21:21:00 +0300
committermichael-grunder <michael.grunder@gmail.com>2019-02-14 21:21:00 +0300
commit85419ce7d370dca4d81e9426363ca0ae65c93439 (patch)
treeee93c41d26f12d0ee66ac72dae5fe521bd2629f5
parentf90ba7c8e0add275b2308ff05d483d2ae1ba5efb (diff)
parent22d81a94eee2ea613fc515e1d714b73142d46241 (diff)
Merge branch 'issue.1502.geo-readonly-cmds' into issue.1448-require_php7
-rw-r--r--php_redis.h2
-rw-r--r--redis.c14
-rw-r--r--redis_cluster.c16
-rw-r--r--redis_cluster.h2
-rw-r--r--redis_commands.c15
-rw-r--r--redis_commands.h12
-rw-r--r--tests/RedisTest.php38
7 files changed, 65 insertions, 34 deletions
diff --git a/php_redis.h b/php_redis.h
index 655f9730..8dc2f5c6 100644
--- a/php_redis.h
+++ b/php_redis.h
@@ -205,7 +205,9 @@ PHP_METHOD(Redis, geohash);
PHP_METHOD(Redis, geopos);
PHP_METHOD(Redis, geodist);
PHP_METHOD(Redis, georadius);
+PHP_METHOD(Redis, georadius_ro);
PHP_METHOD(Redis, georadiusbymember);
+PHP_METHOD(Redis, georadiusbymember_ro);
PHP_METHOD(Redis, client);
PHP_METHOD(Redis, command);
diff --git a/redis.c b/redis.c
index e99527fa..562849c8 100644
--- a/redis.c
+++ b/redis.c
@@ -285,7 +285,9 @@ static zend_function_entry redis_functions[] = {
PHP_ME(Redis, geohash, arginfo_key_members, ZEND_ACC_PUBLIC)
PHP_ME(Redis, geopos, arginfo_key_members, ZEND_ACC_PUBLIC)
PHP_ME(Redis, georadius, arginfo_georadius, ZEND_ACC_PUBLIC)
+ PHP_ME(Redis, georadius_ro, arginfo_georadius, ZEND_ACC_PUBLIC)
PHP_ME(Redis, georadiusbymember, arginfo_georadiusbymember, ZEND_ACC_PUBLIC)
+ PHP_ME(Redis, georadiusbymember_ro, arginfo_georadiusbymember, ZEND_ACC_PUBLIC)
PHP_ME(Redis, get, arginfo_key, ZEND_ACC_PUBLIC)
PHP_ME(Redis, getAuth, arginfo_void, ZEND_ACC_PUBLIC)
PHP_ME(Redis, getBit, arginfo_key_offset, ZEND_ACC_PUBLIC)
@@ -3535,11 +3537,19 @@ PHP_METHOD(Redis, geodist) {
}
PHP_METHOD(Redis, georadius) {
- REDIS_PROCESS_CMD(georadius, redis_read_variant_reply);
+ REDIS_PROCESS_KW_CMD("GEORADIUS", redis_georadius_cmd, redis_read_variant_reply);
+}
+
+PHP_METHOD(Redis, georadius_ro) {
+ REDIS_PROCESS_KW_CMD("GEORADIUS_RO", redis_georadius_cmd, redis_read_variant_reply);
}
PHP_METHOD(Redis, georadiusbymember) {
- REDIS_PROCESS_CMD(georadiusbymember, redis_read_variant_reply);
+ REDIS_PROCESS_KW_CMD("GEORADIUSBYMEMBER", redis_georadiusbymember_cmd, redis_read_variant_reply);
+}
+
+PHP_METHOD(Redis, georadiusbymember_ro) {
+ REDIS_PROCESS_KW_CMD("GEORADIUSBYMEMBER_RO", redis_georadiusbymember_cmd, redis_read_variant_reply);
}
/*
diff --git a/redis_cluster.c b/redis_cluster.c
index 63e4bdcf..75f4b6ef 100644
--- a/redis_cluster.c
+++ b/redis_cluster.c
@@ -149,7 +149,9 @@ zend_function_entry redis_cluster_functions[] = {
PHP_ME(RedisCluster, geohash, arginfo_key_members, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, geopos, arginfo_key_members, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, georadius, arginfo_georadius, ZEND_ACC_PUBLIC)
+ PHP_ME(RedisCluster, georadius_ro, arginfo_georadius, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, georadiusbymember, arginfo_georadiusbymember, ZEND_ACC_PUBLIC)
+ PHP_ME(RedisCluster, georadiusbymember_ro, arginfo_georadiusbymember, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, get, arginfo_key, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, getbit, arginfo_key_offset, ZEND_ACC_PUBLIC)
PHP_ME(RedisCluster, getlasterror, arginfo_void, ZEND_ACC_PUBLIC)
@@ -2840,12 +2842,22 @@ PHP_METHOD(RedisCluster, geodist) {
/* {{{ proto array RedisCluster::georadius() }}} */
PHP_METHOD(RedisCluster, georadius) {
- CLUSTER_PROCESS_CMD(georadius, cluster_variant_resp, 1);
+ CLUSTER_PROCESS_KW_CMD("GEORADIUS", redis_georadius_cmd, cluster_variant_resp, 1);
+}
+
+/* {{{ proto array RedisCluster::georadius() }}} */
+PHP_METHOD(RedisCluster, georadius_ro) {
+ CLUSTER_PROCESS_KW_CMD("GEORADIUS_RO", redis_georadius_cmd, cluster_variant_resp, 1);
}
/* {{{ proto array RedisCluster::georadiusbymember() }}} */
PHP_METHOD(RedisCluster, georadiusbymember) {
- CLUSTER_PROCESS_CMD(georadiusbymember, cluster_variant_resp, 1)
+ CLUSTER_PROCESS_KW_CMD("GEORADIUSBYMEMBER", redis_georadiusbymember_cmd, cluster_variant_resp, 1);
+}
+
+/* {{{ proto array RedisCluster::georadiusbymember() }}} */
+PHP_METHOD(RedisCluster, georadiusbymember_ro) {
+ CLUSTER_PROCESS_KW_CMD("GEORADIUSBYMEMBER_RO", redis_georadiusbymember_cmd, cluster_variant_resp, 1);
}
/* {{{ proto array RedisCluster::role(string key)
diff --git a/redis_cluster.h b/redis_cluster.h
index 9e536678..c8c40ff1 100644
--- a/redis_cluster.h
+++ b/redis_cluster.h
@@ -244,7 +244,9 @@ PHP_METHOD(RedisCluster, geohash);
PHP_METHOD(RedisCluster, geopos);
PHP_METHOD(RedisCluster, geodist);
PHP_METHOD(RedisCluster, georadius);
+PHP_METHOD(RedisCluster, georadius_ro);
PHP_METHOD(RedisCluster, georadiusbymember);
+PHP_METHOD(RedisCluster, georadiusbymember_ro);
/* SCAN and friends */
PHP_METHOD(RedisCluster, scan);
diff --git a/redis_commands.c b/redis_commands.c
index 263e3516..2ad7e212 100644
--- a/redis_commands.c
+++ b/redis_commands.c
@@ -2788,9 +2788,10 @@ void append_georadius_opts(RedisSock *redis_sock, smart_string *str, short *slot
}
}
-/* GEORADIUS */
+/* GEORADIUS / GEORADIUS_RO */
int redis_georadius_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
- char **cmd, int *cmd_len, short *slot, void **ctx)
+ char *kw, char **cmd, int *cmd_len, short *slot,
+ void **ctx)
{
char *key, *unit;
short store_slot = 0;
@@ -2823,7 +2824,7 @@ int redis_georadius_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
(gopts.store != STORE_NONE ? 2 : 0);
/* Begin construction of our command */
- REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, argc, "GEORADIUS");
+ redis_cmd_init_sstr(&cmdstr, argc, kw, strlen(kw));
/* Prefix and set slot */
keyfree = redis_key_prefix(redis_sock, &key, &keylen);
@@ -2858,9 +2859,11 @@ int redis_georadius_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
return SUCCESS;
}
-/* GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] */
+/* GEORADIUSBYMEMBER/GEORADIUSBYMEMBER_RO
+ * key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] */
int redis_georadiusbymember_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
- char **cmd, int *cmd_len, short *slot, void **ctx)
+ char *kw, char **cmd, int *cmd_len, short *slot,
+ void **ctx)
{
char *key, *mem, *unit;
size_t keylen, memlen, unitlen;
@@ -2890,7 +2893,7 @@ int redis_georadiusbymember_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_s
(gopts.store != STORE_NONE ? 2 : 0);
/* Begin command construction*/
- REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, argc, "GEORADIUSBYMEMBER");
+ redis_cmd_init_sstr(&cmdstr, argc, kw, strlen(kw));
/* Prefix our key if we're prefixing and set the slot */
keyfree = redis_key_prefix(redis_sock, &key, &keylen);
diff --git a/redis_commands.h b/redis_commands.h
index 2f3e53de..1ef1712c 100644
--- a/redis_commands.h
+++ b/redis_commands.h
@@ -118,6 +118,12 @@ int redis_flush_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
int redis_xrange_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
char *kw, char **cmd, int *cmd_len, short *slot, void **ctx);
+int redis_georadius_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
+ char *kw, char **cmd, int *cmd_len, short *slot, void **ctx);
+
+int redis_georadiusbymember_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
+ char *kw, char **cmd, int *cmd_len, short *slot, void **ctx);
+
/* Commands which need a unique construction mechanism. This is either because
* they don't share a signature with any other command, or because there is
* specific processing we do (e.g. verifying subarguments) that make them
@@ -253,12 +259,6 @@ int redis_fmt_scan_cmd(char **cmd, REDIS_SCAN_TYPE type, char *key, int key_len,
int redis_geodist_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
char **cmd, int *cmd_len, short *slot, void **ctx);
-int redis_georadius_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
- char **cmd, int *cmd_len, short *slot, void **ctx);
-
-int redis_georadiusbymember_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
- char **cmd, int *cmd_len, short *slot, void **ctx);
-
int redis_migrate_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
char **cmd, int *cmd_len, short *slot, void **ctx);
diff --git a/tests/RedisTest.php b/tests/RedisTest.php
index 03f6e0e8..b9b65f53 100644
--- a/tests/RedisTest.php
+++ b/tests/RedisTest.php
@@ -5109,29 +5109,29 @@ class Redis_Test extends TestSuite
$this->addCities('{gk}');
/* Pre tested with redis-cli. We're just verifying proper delivery of distance and unit */
- if ($cmd == 'georadius') {
- $this->assertEquals($this->redis->georadius('{gk}', $lng, $lat, 10, 'mi'), ['Chico']);
- $this->assertEquals($this->redis->georadius('{gk}', $lng, $lat, 30, 'mi'), ['Gridley','Chico']);
- $this->assertEquals($this->redis->georadius('{gk}', $lng, $lat, 50, 'km'), ['Gridley','Chico']);
- $this->assertEquals($this->redis->georadius('{gk}', $lng, $lat, 50000, 'm'), ['Gridley','Chico']);
- $this->assertEquals($this->redis->georadius('{gk}', $lng, $lat, 150000, 'ft'), ['Gridley', 'Chico']);
- $args = ['georadius', '{gk}', $lng, $lat, 500, 'mi'];
+ if ($cmd == 'georadius' || $cmd == 'georadius_ro') {
+ $this->assertEquals($this->redis->$cmd('{gk}', $lng, $lat, 10, 'mi'), Array('Chico'));
+ $this->assertEquals($this->redis->$cmd('{gk}', $lng, $lat, 30, 'mi'), Array('Gridley','Chico'));
+ $this->assertEquals($this->redis->$cmd('{gk}', $lng, $lat, 50, 'km'), Array('Gridley','Chico'));
+ $this->assertEquals($this->redis->$cmd('{gk}', $lng, $lat, 50000, 'm'), Array('Gridley','Chico'));
+ $this->assertEquals($this->redis->$cmd('{gk}', $lng, $lat, 150000, 'ft'), Array('Gridley', 'Chico'));
+ $args = Array($cmd, '{gk}', $lng, $lat, 500, 'mi');
/* Test a bad COUNT argument */
- foreach ([-1, 0, 'notanumber'] as $count) {
- $this->assertFalse(@$this->redis->georadius('{gk}', $lng, $lat, 10, 'mi', ['count' => $count]));
+ foreach (Array(-1, 0, 'notanumber') as $count) {
+ $this->assertFalse(@$this->redis->$cmd('{gk}', $lng, $lat, 10, 'mi', Array('count' => $count)));
}
} else {
- $this->assertEquals($this->redis->georadiusbymember('{gk}', $city, 10, 'mi'), ['Chico']);
- $this->assertEquals($this->redis->georadiusbymember('{gk}', $city, 30, 'mi'), ['Gridley','Chico']);
- $this->assertEquals($this->redis->georadiusbymember('{gk}', $city, 50, 'km'), ['Gridley','Chico']);
- $this->assertEquals($this->redis->georadiusbymember('{gk}', $city, 50000, 'm'), ['Gridley','Chico']);
- $this->assertEquals($this->redis->georadiusbymember('{gk}', $city, 150000, 'ft'), ['Gridley', 'Chico']);
- $args = ['georadiusbymember', '{gk}', $city, 500, 'mi'];
+ $this->assertEquals($this->redis->$cmd('{gk}', $city, 10, 'mi'), Array('Chico'));
+ $this->assertEquals($this->redis->$cmd('{gk}', $city, 30, 'mi'), Array('Gridley','Chico'));
+ $this->assertEquals($this->redis->$cmd('{gk}', $city, 50, 'km'), Array('Gridley','Chico'));
+ $this->assertEquals($this->redis->$cmd('{gk}', $city, 50000, 'm'), Array('Gridley','Chico'));
+ $this->assertEquals($this->redis->$cmd('{gk}', $city, 150000, 'ft'), Array('Gridley', 'Chico'));
+ $args = Array($cmd, '{gk}', $city, 500, 'mi');
/* Test a bad COUNT argument */
- foreach ([-1, 0, 'notanumber'] as $count) {
- $this->assertFalse(@$this->redis->georadiusbymember('{gk}', $city, 10, 'mi', ['count' => $count]));
+ foreach (Array(-1, 0, 'notanumber') as $count) {
+ $this->assertFalse(@$this->redis->$cmd('{gk}', $city, 10, 'mi', Array('count' => $count)));
}
}
@@ -5185,7 +5185,7 @@ class Redis_Test extends TestSuite
}
$ret1 = $this->rawCommandArray('{gk}', $realargs);
- if ($cmd == 'georadius') {
+ if ($cmd == 'georadius' || $cmd == 'georadius_ro') {
$ret2 = $this->redis->$cmd('{gk}', $lng, $lat, 500, 'mi', $realopts);
} else {
$ret2 = $this->redis->$cmd('{gk}', $city, 500, 'mi', $realopts);
@@ -5205,6 +5205,7 @@ class Redis_Test extends TestSuite
}
$this->genericGeoRadiusTest('georadius');
+ $this->genericGeoRadiusTest('georadius_ro');
}
public function testGeoRadiusByMember() {
@@ -5213,6 +5214,7 @@ class Redis_Test extends TestSuite
}
$this->genericGeoRadiusTest('georadiusbymember');
+ $this->genericGeoRadiusTest('georadiusbymember_ro');
}
public function testGeoPos() {