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:
authorPavlo Yatsukhnenko <yatsukhnenko@gmail.com>2022-10-30 15:33:58 +0300
committerMichael Grunder <michael.grunder@gmail.com>2022-10-30 22:00:12 +0300
commit2bb64038837419a2d661376a56e5f40c51144522 (patch)
treec4d1ea5fbe1f540ab222b37f2cc9818497079308
parentf2bb2cdb5a8cc770d22b6d516e230d2cf544929b (diff)
Issue #1894
Add the CH, NX, XX arguments to GEOADD
-rw-r--r--redis.c2
-rw-r--r--redis.stub.php2
-rw-r--r--redis_arginfo.h5
-rw-r--r--redis_cluster.c4
-rw-r--r--redis_cluster.stub.php2
-rw-r--r--redis_cluster_arginfo.h5
-rw-r--r--redis_cluster_legacy_arginfo.h5
-rw-r--r--redis_commands.c73
-rw-r--r--redis_commands.h3
-rw-r--r--redis_legacy_arginfo.h5
-rw-r--r--tests/RedisTest.php6
11 files changed, 96 insertions, 16 deletions
diff --git a/redis.c b/redis.c
index 89caae90..6d3b6292 100644
--- a/redis.c
+++ b/redis.c
@@ -3470,7 +3470,7 @@ PHP_METHOD(Redis, pfmerge) {
*/
PHP_METHOD(Redis, geoadd) {
- REDIS_PROCESS_KW_CMD("GEOADD", redis_key_varval_cmd, redis_long_response);
+ REDIS_PROCESS_CMD(geoadd, redis_long_response);
}
PHP_METHOD(Redis, geohash) {
diff --git a/redis.stub.php b/redis.stub.php
index f8a87a82..fddcec9b 100644
--- a/redis.stub.php
+++ b/redis.stub.php
@@ -559,7 +559,7 @@ class Redis {
*/
public function flushDB(?bool $sync = null): Redis|bool;
- public function geoadd(string $key, float $lng, float $lat, string $member, mixed ...$other_triples): Redis|int|false;
+ public function geoadd(string $key, ?array $options = null, float $lng, float $lat, string $member, mixed ...$other_triples): Redis|int|false;
public function geodist(string $key, string $src, string $dst, ?string $unit = null): Redis|float|false;
diff --git a/redis_arginfo.h b/redis_arginfo.h
index 4d0a341f..e685218d 100644
--- a/redis_arginfo.h
+++ b/redis_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: ed7bf573247cb4bd4ead254d75ad5b60a97313be */
+ * Stub hash: 0ff87f3b3f10dacbef8455ba09b17fa4107c7999 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "null")
@@ -237,8 +237,9 @@ ZEND_END_ARG_INFO()
#define arginfo_class_Redis_flushDB arginfo_class_Redis_flushAll
-ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_Redis_geoadd, 0, 4, Redis, MAY_BE_LONG|MAY_BE_FALSE)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_Redis_geoadd, 0, 5, Redis, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null")
ZEND_ARG_TYPE_INFO(0, lng, IS_DOUBLE, 0)
ZEND_ARG_TYPE_INFO(0, lat, IS_DOUBLE, 0)
ZEND_ARG_TYPE_INFO(0, member, IS_STRING, 0)
diff --git a/redis_cluster.c b/redis_cluster.c
index df731c8e..c3fdef3c 100644
--- a/redis_cluster.c
+++ b/redis_cluster.c
@@ -2759,9 +2759,9 @@ PHP_METHOD(RedisCluster, slowlog) {
}
/* }}} */
-/* {{{ proto int RedisCluster::geoadd(string key, float long float lat string mem, ...) */
+/* {{{ proto int RedisCluster::geoadd(string key, ?array options, float long float lat string mem, ...) */
PHP_METHOD(RedisCluster, geoadd) {
- CLUSTER_PROCESS_KW_CMD("GEOADD", redis_key_varval_cmd, cluster_long_resp, 0);
+ CLUSTER_PROCESS_CMD(geoadd, cluster_long_resp, 0);
}
/* {{{ proto array RedisCluster::geohash(string key, string mem1, [string mem2...]) */
diff --git a/redis_cluster.stub.php b/redis_cluster.stub.php
index e5fb7e88..f6ab90e8 100644
--- a/redis_cluster.stub.php
+++ b/redis_cluster.stub.php
@@ -165,7 +165,7 @@ class RedisCluster {
public function flushdb(string|array $key_or_address, bool $async = false): RedisCluster|bool;
- public function geoadd(string $key, float $lng, float $lat, string $member, mixed ...$other_triples): RedisCluster|int;
+ public function geoadd(string $key, ?array $options = null, float $lng, float $lat, string $member, mixed ...$other_triples): RedisCluster|int|false;
public function geodist(string $key, string $src, string $dest, ?string $unit = null): RedisCluster|float|false;
diff --git a/redis_cluster_arginfo.h b/redis_cluster_arginfo.h
index b8174f47..15492cb2 100644
--- a/redis_cluster_arginfo.h
+++ b/redis_cluster_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 37a25fa4537a2d10a2c2a8b09292e77e5cc35d59 */
+ * Stub hash: ae14a0f53c3ee46b132ef5db70e539c52a1388bd */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 1)
@@ -232,8 +232,9 @@ ZEND_END_ARG_INFO()
#define arginfo_class_RedisCluster_flushdb arginfo_class_RedisCluster_flushall
-ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_geoadd, 0, 4, RedisCluster, MAY_BE_LONG)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_geoadd, 0, 5, RedisCluster, MAY_BE_LONG|MAY_BE_FALSE)
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
+ ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null")
ZEND_ARG_TYPE_INFO(0, lng, IS_DOUBLE, 0)
ZEND_ARG_TYPE_INFO(0, lat, IS_DOUBLE, 0)
ZEND_ARG_TYPE_INFO(0, member, IS_STRING, 0)
diff --git a/redis_cluster_legacy_arginfo.h b/redis_cluster_legacy_arginfo.h
index 8a82598a..d1630ef0 100644
--- a/redis_cluster_legacy_arginfo.h
+++ b/redis_cluster_legacy_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 37a25fa4537a2d10a2c2a8b09292e77e5cc35d59 */
+ * Stub hash: ae14a0f53c3ee46b132ef5db70e539c52a1388bd */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1)
ZEND_ARG_INFO(0, name)
@@ -204,8 +204,9 @@ ZEND_END_ARG_INFO()
#define arginfo_class_RedisCluster_flushdb arginfo_class_RedisCluster_flushall
-ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_geoadd, 0, 0, 4)
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_geoadd, 0, 0, 5)
ZEND_ARG_INFO(0, key)
+ ZEND_ARG_INFO(0, options)
ZEND_ARG_INFO(0, lng)
ZEND_ARG_INFO(0, lat)
ZEND_ARG_INFO(0, member)
diff --git a/redis_commands.c b/redis_commands.c
index 2861a134..e17fce1f 100644
--- a/redis_commands.c
+++ b/redis_commands.c
@@ -3927,6 +3927,79 @@ int redis_object_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
return SUCCESS;
}
+int
+redis_geoadd_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
+ char **cmd, int *cmd_len, short *slot, void **ctx)
+{
+ zval *z_args, *z_ele;
+ smart_string cmdstr = {0};
+ zend_bool ch = 0;
+ zend_string *zstr;
+ char *mode = NULL;
+ int argc, i;
+
+ // We at least need a key and one value
+ if ((argc = ZEND_NUM_ARGS()) < 5 || argc % 3 != 2) {
+ zend_wrong_param_count();
+ return FAILURE;
+ }
+
+ // Make sure we at least have a key, and we can get other args
+ z_args = ecalloc(argc, sizeof(*z_args));
+ if (zend_get_parameters_array(ht, argc, z_args) == FAILURE) {
+ efree(z_args);
+ return FAILURE;
+ }
+
+ if (Z_TYPE(z_args[1]) != IS_NULL) {
+ if (Z_TYPE(z_args[1]) != IS_ARRAY) {
+ php_error_docref(NULL, E_WARNING, "Invalid options value");
+ efree(z_args);
+ return FAILURE;
+ }
+ ZEND_HASH_FOREACH_VAL(Z_ARRVAL(z_args[1]), z_ele) {
+ ZVAL_DEREF(z_ele);
+ if (Z_TYPE_P(z_ele) == IS_STRING) {
+ if (zend_string_equals_literal_ci(Z_STR_P(z_ele), "NX") ||
+ zend_string_equals_literal_ci(Z_STR_P(z_ele), "XX"))
+ {
+ mode = Z_STRVAL_P(z_ele);
+ } else if (zend_string_equals_literal_ci(Z_STR_P(z_ele), "CH")) {
+ ch = 1;
+ }
+ }
+ } ZEND_HASH_FOREACH_END();
+ }
+
+ /* Initialize our command */
+ REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, argc - 1 + (mode != NULL) + ch, "GEOADD");
+
+ /* Append key */
+ zstr = zval_get_string(&z_args[0]);
+ redis_cmd_append_sstr_key(&cmdstr, ZSTR_VAL(zstr), ZSTR_LEN(zstr), redis_sock, slot);
+ zend_string_release(zstr);
+
+ /* Append options */
+ if (mode != NULL) {
+ redis_cmd_append_sstr(&cmdstr, mode, strlen(mode));
+ }
+ REDIS_CMD_APPEND_SSTR_OPT_STATIC(&cmdstr, ch, "CH");
+
+ /* Append members */
+ for (i = 2; i < argc; ++i) {
+ redis_cmd_append_sstr_zval(&cmdstr, &z_args[i], redis_sock);
+ }
+
+ // Cleanup arg array
+ efree(z_args);
+
+ // Push out values
+ *cmd = cmdstr.c;
+ *cmd_len = cmdstr.len;
+
+ return SUCCESS;
+}
+
/* GEODIST */
int redis_geodist_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
char **cmd, int *cmd_len, short *slot, void **ctx)
diff --git a/redis_commands.h b/redis_commands.h
index 3b34a155..6a4ec01a 100644
--- a/redis_commands.h
+++ b/redis_commands.h
@@ -286,6 +286,9 @@ int redis_copy_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
int redis_fmt_scan_cmd(char **cmd, REDIS_SCAN_TYPE type, char *key, int key_len,
long it, char *pat, int pat_len, long count);
+int redis_geoadd_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
+ char **cmd, int *cmd_len, short *slot, void **ctx);
+
int redis_geodist_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
char **cmd, int *cmd_len, short *slot, void **ctx);
diff --git a/redis_legacy_arginfo.h b/redis_legacy_arginfo.h
index d6f5641a..ef1aeb0e 100644
--- a/redis_legacy_arginfo.h
+++ b/redis_legacy_arginfo.h
@@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: ed7bf573247cb4bd4ead254d75ad5b60a97313be */
+ * Stub hash: 0ff87f3b3f10dacbef8455ba09b17fa4107c7999 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0)
ZEND_ARG_INFO(0, options)
@@ -219,8 +219,9 @@ ZEND_END_ARG_INFO()
#define arginfo_class_Redis_flushDB arginfo_class_Redis_flushAll
-ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_geoadd, 0, 0, 4)
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_geoadd, 0, 0, 5)
ZEND_ARG_INFO(0, key)
+ ZEND_ARG_INFO(0, options)
ZEND_ARG_INFO(0, lng)
ZEND_ARG_INFO(0, lat)
ZEND_ARG_INFO(0, member)
diff --git a/tests/RedisTest.php b/tests/RedisTest.php
index 336cf23e..c0ab9c08 100644
--- a/tests/RedisTest.php
+++ b/tests/RedisTest.php
@@ -6230,7 +6230,7 @@ class Redis_Test extends TestSuite
protected function addCities($key) {
$this->redis->del($key);
foreach ($this->cities as $city => $longlat) {
- $this->redis->geoadd($key, $longlat[0], $longlat[1], $city);
+ $this->redis->geoadd($key, null, $longlat[0], $longlat[1], $city);
}
}
@@ -6244,11 +6244,11 @@ class Redis_Test extends TestSuite
/* Add them one at a time */
foreach ($this->cities as $city => $longlat) {
- $this->assertEquals($this->redis->geoadd('geokey', $longlat[0], $longlat[1], $city), 1);
+ $this->assertEquals($this->redis->geoadd('geokey', null, $longlat[0], $longlat[1], $city), 1);
}
/* Add them again, all at once */
- $args = ['geokey'];
+ $args = ['geokey', null];
foreach ($this->cities as $city => $longlat) {
$args = array_merge($args, [$longlat[0], $longlat[1], $city]);
}