Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2bb6403

Browse files
yatsukhnenkomichael-grunder
authored andcommitted
Issue #1894
Add the CH, NX, XX arguments to GEOADD
1 parent f2bb2cd commit 2bb6403

11 files changed

Lines changed: 96 additions & 16 deletions

redis.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3470,7 +3470,7 @@ PHP_METHOD(Redis, pfmerge) {
34703470
*/
34713471

34723472
PHP_METHOD(Redis, geoadd) {
3473-
REDIS_PROCESS_KW_CMD("GEOADD", redis_key_varval_cmd, redis_long_response);
3473+
REDIS_PROCESS_CMD(geoadd, redis_long_response);
34743474
}
34753475

34763476
PHP_METHOD(Redis, geohash) {

redis.stub.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,7 @@ public function flushAll(?bool $sync = null): Redis|bool;
559559
*/
560560
public function flushDB(?bool $sync = null): Redis|bool;
561561

562-
public function geoadd(string $key, float $lng, float $lat, string $member, mixed ...$other_triples): Redis|int|false;
562+
public function geoadd(string $key, ?array $options = null, float $lng, float $lat, string $member, mixed ...$other_triples): Redis|int|false;
563563

564564
public function geodist(string $key, string $src, string $dst, ?string $unit = null): Redis|float|false;
565565

redis_arginfo.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: ed7bf573247cb4bd4ead254d75ad5b60a97313be */
2+
* Stub hash: 0ff87f3b3f10dacbef8455ba09b17fa4107c7999 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0)
55
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "null")
@@ -237,8 +237,9 @@ ZEND_END_ARG_INFO()
237237

238238
#define arginfo_class_Redis_flushDB arginfo_class_Redis_flushAll
239239

240-
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_Redis_geoadd, 0, 4, Redis, MAY_BE_LONG|MAY_BE_FALSE)
240+
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_Redis_geoadd, 0, 5, Redis, MAY_BE_LONG|MAY_BE_FALSE)
241241
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
242+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null")
242243
ZEND_ARG_TYPE_INFO(0, lng, IS_DOUBLE, 0)
243244
ZEND_ARG_TYPE_INFO(0, lat, IS_DOUBLE, 0)
244245
ZEND_ARG_TYPE_INFO(0, member, IS_STRING, 0)

redis_cluster.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2759,9 +2759,9 @@ PHP_METHOD(RedisCluster, slowlog) {
27592759
}
27602760
/* }}} */
27612761

2762-
/* {{{ proto int RedisCluster::geoadd(string key, float long float lat string mem, ...) */
2762+
/* {{{ proto int RedisCluster::geoadd(string key, ?array options, float long float lat string mem, ...) */
27632763
PHP_METHOD(RedisCluster, geoadd) {
2764-
CLUSTER_PROCESS_KW_CMD("GEOADD", redis_key_varval_cmd, cluster_long_resp, 0);
2764+
CLUSTER_PROCESS_CMD(geoadd, cluster_long_resp, 0);
27652765
}
27662766

27672767
/* {{{ proto array RedisCluster::geohash(string key, string mem1, [string mem2...]) */

redis_cluster.stub.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public function flushall(string|array $key_or_address, bool $async = false): Red
165165

166166
public function flushdb(string|array $key_or_address, bool $async = false): RedisCluster|bool;
167167

168-
public function geoadd(string $key, float $lng, float $lat, string $member, mixed ...$other_triples): RedisCluster|int;
168+
public function geoadd(string $key, ?array $options = null, float $lng, float $lat, string $member, mixed ...$other_triples): RedisCluster|int|false;
169169

170170
public function geodist(string $key, string $src, string $dest, ?string $unit = null): RedisCluster|float|false;
171171

redis_cluster_arginfo.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 37a25fa4537a2d10a2c2a8b09292e77e5cc35d59 */
2+
* Stub hash: ae14a0f53c3ee46b132ef5db70e539c52a1388bd */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1)
55
ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 1)
@@ -232,8 +232,9 @@ ZEND_END_ARG_INFO()
232232

233233
#define arginfo_class_RedisCluster_flushdb arginfo_class_RedisCluster_flushall
234234

235-
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_geoadd, 0, 4, RedisCluster, MAY_BE_LONG)
235+
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_geoadd, 0, 5, RedisCluster, MAY_BE_LONG|MAY_BE_FALSE)
236236
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
237+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null")
237238
ZEND_ARG_TYPE_INFO(0, lng, IS_DOUBLE, 0)
238239
ZEND_ARG_TYPE_INFO(0, lat, IS_DOUBLE, 0)
239240
ZEND_ARG_TYPE_INFO(0, member, IS_STRING, 0)

redis_cluster_legacy_arginfo.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 37a25fa4537a2d10a2c2a8b09292e77e5cc35d59 */
2+
* Stub hash: ae14a0f53c3ee46b132ef5db70e539c52a1388bd */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1)
55
ZEND_ARG_INFO(0, name)
@@ -204,8 +204,9 @@ ZEND_END_ARG_INFO()
204204

205205
#define arginfo_class_RedisCluster_flushdb arginfo_class_RedisCluster_flushall
206206

207-
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_geoadd, 0, 0, 4)
207+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_geoadd, 0, 0, 5)
208208
ZEND_ARG_INFO(0, key)
209+
ZEND_ARG_INFO(0, options)
209210
ZEND_ARG_INFO(0, lng)
210211
ZEND_ARG_INFO(0, lat)
211212
ZEND_ARG_INFO(0, member)

redis_commands.c

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3927,6 +3927,79 @@ int redis_object_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
39273927
return SUCCESS;
39283928
}
39293929

3930+
int
3931+
redis_geoadd_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
3932+
char **cmd, int *cmd_len, short *slot, void **ctx)
3933+
{
3934+
zval *z_args, *z_ele;
3935+
smart_string cmdstr = {0};
3936+
zend_bool ch = 0;
3937+
zend_string *zstr;
3938+
char *mode = NULL;
3939+
int argc, i;
3940+
3941+
// We at least need a key and one value
3942+
if ((argc = ZEND_NUM_ARGS()) < 5 || argc % 3 != 2) {
3943+
zend_wrong_param_count();
3944+
return FAILURE;
3945+
}
3946+
3947+
// Make sure we at least have a key, and we can get other args
3948+
z_args = ecalloc(argc, sizeof(*z_args));
3949+
if (zend_get_parameters_array(ht, argc, z_args) == FAILURE) {
3950+
efree(z_args);
3951+
return FAILURE;
3952+
}
3953+
3954+
if (Z_TYPE(z_args[1]) != IS_NULL) {
3955+
if (Z_TYPE(z_args[1]) != IS_ARRAY) {
3956+
php_error_docref(NULL, E_WARNING, "Invalid options value");
3957+
efree(z_args);
3958+
return FAILURE;
3959+
}
3960+
ZEND_HASH_FOREACH_VAL(Z_ARRVAL(z_args[1]), z_ele) {
3961+
ZVAL_DEREF(z_ele);
3962+
if (Z_TYPE_P(z_ele) == IS_STRING) {
3963+
if (zend_string_equals_literal_ci(Z_STR_P(z_ele), "NX") ||
3964+
zend_string_equals_literal_ci(Z_STR_P(z_ele), "XX"))
3965+
{
3966+
mode = Z_STRVAL_P(z_ele);
3967+
} else if (zend_string_equals_literal_ci(Z_STR_P(z_ele), "CH")) {
3968+
ch = 1;
3969+
}
3970+
}
3971+
} ZEND_HASH_FOREACH_END();
3972+
}
3973+
3974+
/* Initialize our command */
3975+
REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, argc - 1 + (mode != NULL) + ch, "GEOADD");
3976+
3977+
/* Append key */
3978+
zstr = zval_get_string(&z_args[0]);
3979+
redis_cmd_append_sstr_key(&cmdstr, ZSTR_VAL(zstr), ZSTR_LEN(zstr), redis_sock, slot);
3980+
zend_string_release(zstr);
3981+
3982+
/* Append options */
3983+
if (mode != NULL) {
3984+
redis_cmd_append_sstr(&cmdstr, mode, strlen(mode));
3985+
}
3986+
REDIS_CMD_APPEND_SSTR_OPT_STATIC(&cmdstr, ch, "CH");
3987+
3988+
/* Append members */
3989+
for (i = 2; i < argc; ++i) {
3990+
redis_cmd_append_sstr_zval(&cmdstr, &z_args[i], redis_sock);
3991+
}
3992+
3993+
// Cleanup arg array
3994+
efree(z_args);
3995+
3996+
// Push out values
3997+
*cmd = cmdstr.c;
3998+
*cmd_len = cmdstr.len;
3999+
4000+
return SUCCESS;
4001+
}
4002+
39304003
/* GEODIST */
39314004
int redis_geodist_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
39324005
char **cmd, int *cmd_len, short *slot, void **ctx)

redis_commands.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,9 @@ int redis_copy_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
286286
int redis_fmt_scan_cmd(char **cmd, REDIS_SCAN_TYPE type, char *key, int key_len,
287287
long it, char *pat, int pat_len, long count);
288288

289+
int redis_geoadd_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
290+
char **cmd, int *cmd_len, short *slot, void **ctx);
291+
289292
int redis_geodist_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
290293
char **cmd, int *cmd_len, short *slot, void **ctx);
291294

redis_legacy_arginfo.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: ed7bf573247cb4bd4ead254d75ad5b60a97313be */
2+
* Stub hash: 0ff87f3b3f10dacbef8455ba09b17fa4107c7999 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0)
55
ZEND_ARG_INFO(0, options)
@@ -219,8 +219,9 @@ ZEND_END_ARG_INFO()
219219

220220
#define arginfo_class_Redis_flushDB arginfo_class_Redis_flushAll
221221

222-
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_geoadd, 0, 0, 4)
222+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_geoadd, 0, 0, 5)
223223
ZEND_ARG_INFO(0, key)
224+
ZEND_ARG_INFO(0, options)
224225
ZEND_ARG_INFO(0, lng)
225226
ZEND_ARG_INFO(0, lat)
226227
ZEND_ARG_INFO(0, member)

0 commit comments

Comments
 (0)