diff options
author | michael-grunder <michael.grunder@gmail.com> | 2019-02-14 21:21:00 +0300 |
---|---|---|
committer | michael-grunder <michael.grunder@gmail.com> | 2019-02-14 21:21:00 +0300 |
commit | 85419ce7d370dca4d81e9426363ca0ae65c93439 (patch) | |
tree | ee93c41d26f12d0ee66ac72dae5fe521bd2629f5 | |
parent | f90ba7c8e0add275b2308ff05d483d2ae1ba5efb (diff) | |
parent | 22d81a94eee2ea613fc515e1d714b73142d46241 (diff) |
Merge branch 'issue.1502.geo-readonly-cmds' into issue.1448-require_php7
-rw-r--r-- | php_redis.h | 2 | ||||
-rw-r--r-- | redis.c | 14 | ||||
-rw-r--r-- | redis_cluster.c | 16 | ||||
-rw-r--r-- | redis_cluster.h | 2 | ||||
-rw-r--r-- | redis_commands.c | 15 | ||||
-rw-r--r-- | redis_commands.h | 12 | ||||
-rw-r--r-- | tests/RedisTest.php | 38 |
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); @@ -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() { |