From 7d3b2e4d6d87a905cc8952497a383350b2806247 Mon Sep 17 00:00:00 2001 From: Pavlo Yatsukhnenko Date: Mon, 6 Oct 2025 15:15:28 +0300 Subject: [PATCH] Add `hGetWithMeta` method --- redis.c | 7 ++++ redis.stub.php | 11 ++++++ redis_arginfo.h | 43 ++++++++++++++-------- redis_cluster.c | 6 ++++ redis_cluster.stub.php | 5 +++ redis_cluster_arginfo.h | 25 +++++++------ redis_cluster_legacy_arginfo.h | 23 +++++++----- redis_legacy_arginfo.h | 41 ++++++++++++++------- tests/RedisTest.php | 66 ++++++++++++++++++++++++++++++++++ 9 files changed, 181 insertions(+), 46 deletions(-) diff --git a/redis.c b/redis.c index b383d0c..662f18a 100644 --- a/redis.c +++ b/redis.c @@ -1928,6 +1928,13 @@ PHP_METHOD(Redis, hGet) } /* }}} */ +/* {{{ proto string Redis::hgetWithMeta(string key, string mem) */ +PHP_METHOD(Redis, hGetWithMeta) +{ + REDIS_PROCESS_KW_CMD("HGET", redis_key_str_cmd, redis_bulk_withmeta_response); +} +/* }}} */ + /* {{{ proto long Redis::hLen(string key) */ PHP_METHOD(Redis, hLen) { diff --git a/redis.stub.php b/redis.stub.php index 5ae2d27..56ca02a 100644 --- a/redis.stub.php +++ b/redis.stub.php @@ -1759,6 +1759,17 @@ class Redis { */ public function hGetAll(string $key): Redis|array|false; + /** + * Retrieve a value and metadata of hash field. + * + * @param string $key The key to query + * @param string $member The key to query + * @return mixed + * + * @example $redis->hgetWithMeta('foo', 'field'); + */ + public function hGetWithMeta(string $key, string $member): mixed; + /** * Increment a hash field's value by an integer * diff --git a/redis_arginfo.h b/redis_arginfo.h index 2d33429..568bf43 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: 619374bbad94b8a9992f9c11abd12362e07359d0 */ + * Stub hash: 358ec6a551a8da176ffa340e6f9696389b614758 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null") @@ -417,6 +417,8 @@ ZEND_END_ARG_INFO() #define arginfo_class_Redis_hGetAll arginfo_class_Redis_getWithMeta +#define arginfo_class_Redis_hGetWithMeta arginfo_class_Redis_hGet + ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_Redis_hIncrBy, 0, 3, Redis, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, field, IS_STRING, 0) @@ -1297,7 +1299,6 @@ ZEND_END_ARG_INFO() #define arginfo_class_Redis_zunionstore arginfo_class_Redis_zinterstore - ZEND_METHOD(Redis, __construct); ZEND_METHOD(Redis, __destruct); ZEND_METHOD(Redis, _compress); @@ -1393,6 +1394,7 @@ ZEND_METHOD(Redis, hDel); ZEND_METHOD(Redis, hExists); ZEND_METHOD(Redis, hGet); ZEND_METHOD(Redis, hGetAll); +ZEND_METHOD(Redis, hGetWithMeta); ZEND_METHOD(Redis, hIncrBy); ZEND_METHOD(Redis, hIncrByFloat); ZEND_METHOD(Redis, hKeys); @@ -1582,7 +1584,6 @@ ZEND_METHOD(Redis, zscan); ZEND_METHOD(Redis, zunion); ZEND_METHOD(Redis, zunionstore); - static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, __construct, arginfo_class_Redis___construct, ZEND_ACC_PUBLIC) ZEND_ME(Redis, __destruct, arginfo_class_Redis___destruct, ZEND_ACC_PUBLIC) @@ -1624,7 +1625,11 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, decrBy, arginfo_class_Redis_decrBy, ZEND_ACC_PUBLIC) ZEND_ME(Redis, del, arginfo_class_Redis_del, ZEND_ACC_PUBLIC) ZEND_ME(Redis, delifeq, arginfo_class_Redis_delifeq, ZEND_ACC_PUBLIC) - ZEND_MALIAS(Redis, delete, del, arginfo_class_Redis_delete, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("delete", zim_Redis_del, arginfo_class_Redis_delete, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED, NULL, NULL) +#else + ZEND_RAW_FENTRY("delete", zim_Redis_del, arginfo_class_Redis_delete, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) +#endif ZEND_ME(Redis, discard, arginfo_class_Redis_discard, ZEND_ACC_PUBLIC) ZEND_ME(Redis, dump, arginfo_class_Redis_dump, ZEND_ACC_PUBLIC) ZEND_ME(Redis, echo, arginfo_class_Redis_echo, ZEND_ACC_PUBLIC) @@ -1680,6 +1685,7 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, hExists, arginfo_class_Redis_hExists, ZEND_ACC_PUBLIC) ZEND_ME(Redis, hGet, arginfo_class_Redis_hGet, ZEND_ACC_PUBLIC) ZEND_ME(Redis, hGetAll, arginfo_class_Redis_hGetAll, ZEND_ACC_PUBLIC) + ZEND_ME(Redis, hGetWithMeta, arginfo_class_Redis_hGetWithMeta, ZEND_ACC_PUBLIC) ZEND_ME(Redis, hIncrBy, arginfo_class_Redis_hIncrBy, ZEND_ACC_PUBLIC) ZEND_ME(Redis, hIncrByFloat, arginfo_class_Redis_hIncrByFloat, ZEND_ACC_PUBLIC) ZEND_ME(Redis, hKeys, arginfo_class_Redis_hKeys, ZEND_ACC_PUBLIC) @@ -1735,7 +1741,11 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, msetnx, arginfo_class_Redis_msetnx, ZEND_ACC_PUBLIC) ZEND_ME(Redis, multi, arginfo_class_Redis_multi, ZEND_ACC_PUBLIC) ZEND_ME(Redis, object, arginfo_class_Redis_object, ZEND_ACC_PUBLIC) - ZEND_MALIAS(Redis, open, connect, arginfo_class_Redis_open, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("open", zim_Redis_connect, arginfo_class_Redis_open, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED, NULL, NULL) +#else + ZEND_RAW_FENTRY("open", zim_Redis_connect, arginfo_class_Redis_open, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) +#endif ZEND_ME(Redis, pconnect, arginfo_class_Redis_pconnect, ZEND_ACC_PUBLIC) ZEND_ME(Redis, persist, arginfo_class_Redis_persist, ZEND_ACC_PUBLIC) ZEND_ME(Redis, pexpire, arginfo_class_Redis_pexpire, ZEND_ACC_PUBLIC) @@ -1745,7 +1755,11 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, pfmerge, arginfo_class_Redis_pfmerge, ZEND_ACC_PUBLIC) ZEND_ME(Redis, ping, arginfo_class_Redis_ping, ZEND_ACC_PUBLIC) ZEND_ME(Redis, pipeline, arginfo_class_Redis_pipeline, ZEND_ACC_PUBLIC) - ZEND_MALIAS(Redis, popen, pconnect, arginfo_class_Redis_popen, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("popen", zim_Redis_pconnect, arginfo_class_Redis_popen, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED, NULL, NULL) +#else + ZEND_RAW_FENTRY("popen", zim_Redis_pconnect, arginfo_class_Redis_popen, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) +#endif ZEND_ME(Redis, psetex, arginfo_class_Redis_psetex, ZEND_ACC_PUBLIC) ZEND_ME(Redis, psubscribe, arginfo_class_Redis_psubscribe, ZEND_ACC_PUBLIC) ZEND_ME(Redis, pttl, arginfo_class_Redis_pttl, ZEND_ACC_PUBLIC) @@ -1873,17 +1887,16 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_FE_END }; - -static const zend_function_entry class_RedisException_methods[] = { - ZEND_FE_END -}; - static zend_class_entry *register_class_Redis(void) { zend_class_entry ce, *class_entry; INIT_CLASS_ENTRY(ce, "Redis", class_Redis_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif zval const_REDIS_NOT_FOUND_value; ZVAL_LONG(&const_REDIS_NOT_FOUND_value, REDIS_NOT_FOUND); @@ -2232,7 +2245,6 @@ static zend_class_entry *register_class_Redis(void) zend_string *const_OPT_BACKOFF_CAP_name = zend_string_init_interned("OPT_BACKOFF_CAP", sizeof("OPT_BACKOFF_CAP") - 1, 1); zend_declare_class_constant_ex(class_entry, const_OPT_BACKOFF_CAP_name, &const_OPT_BACKOFF_CAP_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_OPT_BACKOFF_CAP_name); -#if (PHP_VERSION_ID >= 80000) zend_string *attribute_name_SensitiveParameter_func_auth_arg0_0 = zend_string_init_interned("SensitiveParameter", sizeof("SensitiveParameter") - 1, 1); @@ -2242,7 +2254,6 @@ static zend_class_entry *register_class_Redis(void) zend_string *attribute_name_SensitiveParameter_func_migrate_arg7_0 = zend_string_init_interned("SensitiveParameter", sizeof("SensitiveParameter") - 1, 1); zend_add_parameter_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "migrate", sizeof("migrate") - 1), 7, attribute_name_SensitiveParameter_func_migrate_arg7_0, 0); zend_string_release(attribute_name_SensitiveParameter_func_migrate_arg7_0); -#endif return class_entry; } @@ -2251,8 +2262,12 @@ static zend_class_entry *register_class_RedisException(zend_class_entry *class_e { zend_class_entry ce, *class_entry; - INIT_CLASS_ENTRY(ce, "RedisException", class_RedisException_methods); + INIT_CLASS_ENTRY(ce, "RedisException", NULL); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_RuntimeException, 0); +#else class_entry = zend_register_internal_class_ex(&ce, class_entry_RuntimeException); +#endif return class_entry; } diff --git a/redis_cluster.c b/redis_cluster.c index 5665d4d..6d7768d 100644 --- a/redis_cluster.c +++ b/redis_cluster.c @@ -1278,6 +1278,12 @@ PHP_METHOD(RedisCluster, hget) { } /* }}} */ +/* {{{ proto string RedisCluster::hgetWithMeta(string key, string mem) */ +PHP_METHOD(RedisCluster, hgetWithMeta) { + CLUSTER_PROCESS_KW_CMD("HGET", redis_key_str_cmd, cluster_bulk_withmeta_resp, 1); +} +/* }}} */ + /* {{{ proto bool RedisCluster::hset(string key, string mem, string val) */ PHP_METHOD(RedisCluster, hset) { CLUSTER_PROCESS_CMD(hset, cluster_long_resp, 0); diff --git a/redis_cluster.stub.php b/redis_cluster.stub.php index 298c6a2..63ba4d2 100644 --- a/redis_cluster.stub.php +++ b/redis_cluster.stub.php @@ -480,6 +480,11 @@ class RedisCluster { */ public function hgetall(string $key): RedisCluster|array|false; + /** + * @see Redis::hgetWithMeta + */ + public function hgetWithMeta(string $key, string $member): mixed; + /** * @see Redis::hincrby */ diff --git a/redis_cluster_arginfo.h b/redis_cluster_arginfo.h index 46f7b45..d6cfd44 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: d504e84c671162c4ec78aa1e6bb5a47c695ee90d */ + * Stub hash: 6561a50ccac9841ac01a53feb5f88e7f592e1bc2 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 1) @@ -392,6 +392,8 @@ ZEND_END_ARG_INFO() #define arginfo_class_RedisCluster_hgetall arginfo_class_RedisCluster_getWithMeta +#define arginfo_class_RedisCluster_hgetWithMeta arginfo_class_RedisCluster_hget + ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_hincrby, 0, 3, RedisCluster, MAY_BE_LONG|MAY_BE_FALSE) ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, member, IS_STRING, 0) @@ -1179,7 +1181,6 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_zdiff, 0, ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null") ZEND_END_ARG_INFO() - ZEND_METHOD(RedisCluster, __construct); ZEND_METHOD(RedisCluster, _compress); ZEND_METHOD(RedisCluster, _uncompress); @@ -1265,6 +1266,7 @@ ZEND_METHOD(RedisCluster, hdel); ZEND_METHOD(RedisCluster, hexists); ZEND_METHOD(RedisCluster, hget); ZEND_METHOD(RedisCluster, hgetall); +ZEND_METHOD(RedisCluster, hgetWithMeta); ZEND_METHOD(RedisCluster, hincrby); ZEND_METHOD(RedisCluster, hincrbyfloat); ZEND_METHOD(RedisCluster, hkeys); @@ -1435,7 +1437,6 @@ ZEND_METHOD(RedisCluster, zdiffstore); ZEND_METHOD(RedisCluster, zunion); ZEND_METHOD(RedisCluster, zdiff); - static const zend_function_entry class_RedisCluster_methods[] = { ZEND_ME(RedisCluster, __construct, arginfo_class_RedisCluster___construct, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, _compress, arginfo_class_RedisCluster__compress, ZEND_ACC_PUBLIC) @@ -1522,6 +1523,7 @@ static const zend_function_entry class_RedisCluster_methods[] = { ZEND_ME(RedisCluster, hexists, arginfo_class_RedisCluster_hexists, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, hget, arginfo_class_RedisCluster_hget, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, hgetall, arginfo_class_RedisCluster_hgetall, ZEND_ACC_PUBLIC) + ZEND_ME(RedisCluster, hgetWithMeta, arginfo_class_RedisCluster_hgetWithMeta, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, hincrby, arginfo_class_RedisCluster_hincrby, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, hincrbyfloat, arginfo_class_RedisCluster_hincrbyfloat, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, hkeys, arginfo_class_RedisCluster_hkeys, ZEND_ACC_PUBLIC) @@ -1694,17 +1696,16 @@ static const zend_function_entry class_RedisCluster_methods[] = { ZEND_FE_END }; - -static const zend_function_entry class_RedisClusterException_methods[] = { - ZEND_FE_END -}; - static zend_class_entry *register_class_RedisCluster(void) { zend_class_entry ce, *class_entry; INIT_CLASS_ENTRY(ce, "RedisCluster", class_RedisCluster_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif zval const_OPT_SLAVE_FAILOVER_value; ZVAL_LONG(&const_OPT_SLAVE_FAILOVER_value, REDIS_OPT_FAILOVER); @@ -1735,13 +1736,11 @@ static zend_class_entry *register_class_RedisCluster(void) zend_string *const_FAILOVER_DISTRIBUTE_SLAVES_name = zend_string_init_interned("FAILOVER_DISTRIBUTE_SLAVES", sizeof("FAILOVER_DISTRIBUTE_SLAVES") - 1, 1); zend_declare_class_constant_ex(class_entry, const_FAILOVER_DISTRIBUTE_SLAVES_name, &const_FAILOVER_DISTRIBUTE_SLAVES_value, ZEND_ACC_PUBLIC, NULL); zend_string_release(const_FAILOVER_DISTRIBUTE_SLAVES_name); -#if (PHP_VERSION_ID >= 80000) zend_string *attribute_name_SensitiveParameter_func___construct_arg5_0 = zend_string_init_interned("SensitiveParameter", sizeof("SensitiveParameter") - 1, 1); zend_add_parameter_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "__construct", sizeof("__construct") - 1), 5, attribute_name_SensitiveParameter_func___construct_arg5_0, 0); zend_string_release(attribute_name_SensitiveParameter_func___construct_arg5_0); -#endif return class_entry; } @@ -1750,8 +1749,12 @@ static zend_class_entry *register_class_RedisClusterException(zend_class_entry * { zend_class_entry ce, *class_entry; - INIT_CLASS_ENTRY(ce, "RedisClusterException", class_RedisClusterException_methods); + INIT_CLASS_ENTRY(ce, "RedisClusterException", NULL); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_RuntimeException, 0); +#else class_entry = zend_register_internal_class_ex(&ce, class_entry_RuntimeException); +#endif return class_entry; } diff --git a/redis_cluster_legacy_arginfo.h b/redis_cluster_legacy_arginfo.h index c192f40..d61b36e 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: d504e84c671162c4ec78aa1e6bb5a47c695ee90d */ + * Stub hash: 6561a50ccac9841ac01a53feb5f88e7f592e1bc2 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1) ZEND_ARG_INFO(0, name) @@ -345,6 +345,8 @@ ZEND_END_ARG_INFO() #define arginfo_class_RedisCluster_hgetall arginfo_class_RedisCluster__prefix +#define arginfo_class_RedisCluster_hgetWithMeta arginfo_class_RedisCluster_hexists + ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_hincrby, 0, 0, 3) ZEND_ARG_INFO(0, key) ZEND_ARG_INFO(0, member) @@ -1008,7 +1010,6 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_zdiff, 0, 0, 1) ZEND_ARG_INFO(0, options) ZEND_END_ARG_INFO() - ZEND_METHOD(RedisCluster, __construct); ZEND_METHOD(RedisCluster, _compress); ZEND_METHOD(RedisCluster, _uncompress); @@ -1094,6 +1095,7 @@ ZEND_METHOD(RedisCluster, hdel); ZEND_METHOD(RedisCluster, hexists); ZEND_METHOD(RedisCluster, hget); ZEND_METHOD(RedisCluster, hgetall); +ZEND_METHOD(RedisCluster, hgetWithMeta); ZEND_METHOD(RedisCluster, hincrby); ZEND_METHOD(RedisCluster, hincrbyfloat); ZEND_METHOD(RedisCluster, hkeys); @@ -1264,7 +1266,6 @@ ZEND_METHOD(RedisCluster, zdiffstore); ZEND_METHOD(RedisCluster, zunion); ZEND_METHOD(RedisCluster, zdiff); - static const zend_function_entry class_RedisCluster_methods[] = { ZEND_ME(RedisCluster, __construct, arginfo_class_RedisCluster___construct, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, _compress, arginfo_class_RedisCluster__compress, ZEND_ACC_PUBLIC) @@ -1351,6 +1352,7 @@ static const zend_function_entry class_RedisCluster_methods[] = { ZEND_ME(RedisCluster, hexists, arginfo_class_RedisCluster_hexists, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, hget, arginfo_class_RedisCluster_hget, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, hgetall, arginfo_class_RedisCluster_hgetall, ZEND_ACC_PUBLIC) + ZEND_ME(RedisCluster, hgetWithMeta, arginfo_class_RedisCluster_hgetWithMeta, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, hincrby, arginfo_class_RedisCluster_hincrby, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, hincrbyfloat, arginfo_class_RedisCluster_hincrbyfloat, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, hkeys, arginfo_class_RedisCluster_hkeys, ZEND_ACC_PUBLIC) @@ -1523,17 +1525,16 @@ static const zend_function_entry class_RedisCluster_methods[] = { ZEND_FE_END }; - -static const zend_function_entry class_RedisClusterException_methods[] = { - ZEND_FE_END -}; - static zend_class_entry *register_class_RedisCluster(void) { zend_class_entry ce, *class_entry; INIT_CLASS_ENTRY(ce, "RedisCluster", class_RedisCluster_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif zval const_OPT_SLAVE_FAILOVER_value; ZVAL_LONG(&const_OPT_SLAVE_FAILOVER_value, REDIS_OPT_FAILOVER); @@ -1572,8 +1573,12 @@ static zend_class_entry *register_class_RedisClusterException(zend_class_entry * { zend_class_entry ce, *class_entry; - INIT_CLASS_ENTRY(ce, "RedisClusterException", class_RedisClusterException_methods); + INIT_CLASS_ENTRY(ce, "RedisClusterException", NULL); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_RuntimeException, 0); +#else class_entry = zend_register_internal_class_ex(&ce, class_entry_RuntimeException); +#endif return class_entry; } diff --git a/redis_legacy_arginfo.h b/redis_legacy_arginfo.h index 4008517..5a4b242 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: 619374bbad94b8a9992f9c11abd12362e07359d0 */ + * Stub hash: 358ec6a551a8da176ffa340e6f9696389b614758 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0) ZEND_ARG_INFO(0, options) @@ -379,6 +379,8 @@ ZEND_END_ARG_INFO() #define arginfo_class_Redis_hGetAll arginfo_class_Redis__prefix +#define arginfo_class_Redis_hGetWithMeta arginfo_class_Redis_hGet + ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_hIncrBy, 0, 0, 3) ZEND_ARG_INFO(0, key) ZEND_ARG_INFO(0, field) @@ -1129,7 +1131,6 @@ ZEND_END_ARG_INFO() #define arginfo_class_Redis_zunionstore arginfo_class_Redis_zinterstore - ZEND_METHOD(Redis, __construct); ZEND_METHOD(Redis, __destruct); ZEND_METHOD(Redis, _compress); @@ -1225,6 +1226,7 @@ ZEND_METHOD(Redis, hDel); ZEND_METHOD(Redis, hExists); ZEND_METHOD(Redis, hGet); ZEND_METHOD(Redis, hGetAll); +ZEND_METHOD(Redis, hGetWithMeta); ZEND_METHOD(Redis, hIncrBy); ZEND_METHOD(Redis, hIncrByFloat); ZEND_METHOD(Redis, hKeys); @@ -1414,7 +1416,6 @@ ZEND_METHOD(Redis, zscan); ZEND_METHOD(Redis, zunion); ZEND_METHOD(Redis, zunionstore); - static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, __construct, arginfo_class_Redis___construct, ZEND_ACC_PUBLIC) ZEND_ME(Redis, __destruct, arginfo_class_Redis___destruct, ZEND_ACC_PUBLIC) @@ -1456,7 +1457,11 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, decrBy, arginfo_class_Redis_decrBy, ZEND_ACC_PUBLIC) ZEND_ME(Redis, del, arginfo_class_Redis_del, ZEND_ACC_PUBLIC) ZEND_ME(Redis, delifeq, arginfo_class_Redis_delifeq, ZEND_ACC_PUBLIC) - ZEND_MALIAS(Redis, delete, del, arginfo_class_Redis_delete, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("delete", zim_Redis_del, arginfo_class_Redis_delete, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED, NULL, NULL) +#else + ZEND_RAW_FENTRY("delete", zim_Redis_del, arginfo_class_Redis_delete, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) +#endif ZEND_ME(Redis, discard, arginfo_class_Redis_discard, ZEND_ACC_PUBLIC) ZEND_ME(Redis, dump, arginfo_class_Redis_dump, ZEND_ACC_PUBLIC) ZEND_ME(Redis, echo, arginfo_class_Redis_echo, ZEND_ACC_PUBLIC) @@ -1512,6 +1517,7 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, hExists, arginfo_class_Redis_hExists, ZEND_ACC_PUBLIC) ZEND_ME(Redis, hGet, arginfo_class_Redis_hGet, ZEND_ACC_PUBLIC) ZEND_ME(Redis, hGetAll, arginfo_class_Redis_hGetAll, ZEND_ACC_PUBLIC) + ZEND_ME(Redis, hGetWithMeta, arginfo_class_Redis_hGetWithMeta, ZEND_ACC_PUBLIC) ZEND_ME(Redis, hIncrBy, arginfo_class_Redis_hIncrBy, ZEND_ACC_PUBLIC) ZEND_ME(Redis, hIncrByFloat, arginfo_class_Redis_hIncrByFloat, ZEND_ACC_PUBLIC) ZEND_ME(Redis, hKeys, arginfo_class_Redis_hKeys, ZEND_ACC_PUBLIC) @@ -1567,7 +1573,11 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, msetnx, arginfo_class_Redis_msetnx, ZEND_ACC_PUBLIC) ZEND_ME(Redis, multi, arginfo_class_Redis_multi, ZEND_ACC_PUBLIC) ZEND_ME(Redis, object, arginfo_class_Redis_object, ZEND_ACC_PUBLIC) - ZEND_MALIAS(Redis, open, connect, arginfo_class_Redis_open, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("open", zim_Redis_connect, arginfo_class_Redis_open, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED, NULL, NULL) +#else + ZEND_RAW_FENTRY("open", zim_Redis_connect, arginfo_class_Redis_open, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) +#endif ZEND_ME(Redis, pconnect, arginfo_class_Redis_pconnect, ZEND_ACC_PUBLIC) ZEND_ME(Redis, persist, arginfo_class_Redis_persist, ZEND_ACC_PUBLIC) ZEND_ME(Redis, pexpire, arginfo_class_Redis_pexpire, ZEND_ACC_PUBLIC) @@ -1577,7 +1587,11 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, pfmerge, arginfo_class_Redis_pfmerge, ZEND_ACC_PUBLIC) ZEND_ME(Redis, ping, arginfo_class_Redis_ping, ZEND_ACC_PUBLIC) ZEND_ME(Redis, pipeline, arginfo_class_Redis_pipeline, ZEND_ACC_PUBLIC) - ZEND_MALIAS(Redis, popen, pconnect, arginfo_class_Redis_popen, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) +#if (PHP_VERSION_ID >= 80400) + ZEND_RAW_FENTRY("popen", zim_Redis_pconnect, arginfo_class_Redis_popen, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED, NULL, NULL) +#else + ZEND_RAW_FENTRY("popen", zim_Redis_pconnect, arginfo_class_Redis_popen, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) +#endif ZEND_ME(Redis, psetex, arginfo_class_Redis_psetex, ZEND_ACC_PUBLIC) ZEND_ME(Redis, psubscribe, arginfo_class_Redis_psubscribe, ZEND_ACC_PUBLIC) ZEND_ME(Redis, pttl, arginfo_class_Redis_pttl, ZEND_ACC_PUBLIC) @@ -1705,17 +1719,16 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_FE_END }; - -static const zend_function_entry class_RedisException_methods[] = { - ZEND_FE_END -}; - static zend_class_entry *register_class_Redis(void) { zend_class_entry ce, *class_entry; INIT_CLASS_ENTRY(ce, "Redis", class_Redis_methods); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, NULL, 0); +#else class_entry = zend_register_internal_class_ex(&ce, NULL); +#endif zval const_REDIS_NOT_FOUND_value; ZVAL_LONG(&const_REDIS_NOT_FOUND_value, REDIS_NOT_FOUND); @@ -2072,8 +2085,12 @@ static zend_class_entry *register_class_RedisException(zend_class_entry *class_e { zend_class_entry ce, *class_entry; - INIT_CLASS_ENTRY(ce, "RedisException", class_RedisException_methods); + INIT_CLASS_ENTRY(ce, "RedisException", NULL); +#if (PHP_VERSION_ID >= 80400) + class_entry = zend_register_internal_class_with_flags(&ce, class_entry_RuntimeException, 0); +#else class_entry = zend_register_internal_class_ex(&ce, class_entry_RuntimeException); +#endif return class_entry; } diff --git a/tests/RedisTest.php b/tests/RedisTest.php index a108627..17237c6 100644 --- a/tests/RedisTest.php +++ b/tests/RedisTest.php @@ -5971,6 +5971,72 @@ class Redis_Test extends TestSuite { $this->redis->setOption(Redis::OPT_SERIALIZER, $serializer); } + public function testHGetWithMeta() { + $this->redis->del('hash'); + $this->assertFalse($this->redis->hget('hash', 'member')); + + $result = $this->redis->hgetWithMeta('hash', 'member'); + $this->assertIsArray($result, 2); + $this->assertArrayKeyEquals($result, 0, false); + $this->assertArrayKey($result, 1, function ($metadata) { + $this->assertIsArray($metadata); + $this->assertArrayKeyEquals($metadata, 'length', -1); + return true; + }); + + if ($this->havePipeline()) { + $batch = $this->redis->pipeline() + ->hget('hash', 'member') + ->hgetWithMeta('hash', 'member') + ->exec(); + $this->assertIsArray($batch, 2); + $this->assertArrayKeyEquals($batch, 0, false); + $this->assertArrayKey($batch, 1, function ($result) { + $this->assertIsArray($result, 2); + $this->assertArrayKeyEquals($result, 0, false); + $this->assertArrayKey($result, 1, function ($metadata) { + $this->assertIsArray($metadata); + $this->assertArrayKeyEquals($metadata, 'length', -1); + return true; + }); + return true; + }); + } + + $batch = $this->redis->multi() + ->hset('hash', 'member', 'value') + ->hgetWithMeta('hash', 'member') + ->exec(); + $this->assertIsArray($batch, 2); + $this->assertArrayKeyEquals($batch, 0, 1); + $this->assertArrayKey($batch, 1, function ($result) { + $this->assertIsArray($result, 2); + $this->assertArrayKeyEquals($result, 0, 'value'); + $this->assertArrayKey($result, 1, function ($metadata) { + $this->assertIsArray($metadata); + $this->assertArrayKeyEquals($metadata, 'length', strlen('value')); + return true; + }); + return true; + }); + + $serializer = $this->redis->getOption(Redis::OPT_SERIALIZER); + $this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP); + $this->assertEquals(0, $this->redis->hset('hash', 'member', false)); + + $result = $this->redis->hgetWithMeta('hash', 'member'); + $this->assertIsArray($result, 2); + $this->assertArrayKeyEquals($result, 0, false); + $this->assertArrayKey($result, 1, function ($metadata) { + $this->assertIsArray($metadata); + $this->assertArrayKeyEquals($metadata, 'length', strlen(serialize(false))); + return true; + }); + + $this->assertFalse($this->redis->hget('hash', 'member')); + $this->redis->setOption(Redis::OPT_SERIALIZER, $serializer); + } + public function testPrefix() { // no prefix $this->redis->setOption(Redis::OPT_PREFIX, '');