Files
phpredis/redis_array_arginfo.h
michael-grunder e52f0afaed Update SCAN to handle very large cursor values.
Technically Redis may return any unsigned 64 bit integer as a scan
cursor.  This presents a problem for PHP in that PHP's integers are
signed.  Because of that if a scan cursor is > 2^63 it will overflow and
fail to work properly.

This commit updates our SCAN family of commands to deliver cursors in
their string form.

```php
public function scan(null|int|string $iterator, ...);
```

On initial entry into our SCAN family we convert either a NULL or empty
string cursor to zero, and send the initial scan command.

As Redis replies with cursors we either represent them as a long (if
they are <= ZEND_ULONG_MAX) and as a string if greater.  This should
mean the fix is minimally breaking as the following code will still
work:

```php
$it = NULL;
do {
    print_r($redis->scan($it));
} while ($it !== 0);
```

The `$it !== 0` still works because the zero cursor will be represented
as an integer.  Only absurdly large (> 2^63) values are represented as a
string.

Fixes #2454
2024-03-17 10:59:14 -07:00

190 lines
8.5 KiB
C

/* This is a generated file, edit the .stub.php file instead.
* Stub hash: ddb92422452cb767a7d6694aa8ac60d883db6672 */
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_RedisArray___call, 0, 2, IS_MIXED, 0)
ZEND_ARG_TYPE_INFO(0, function_name, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, arguments, IS_ARRAY, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisArray___construct, 0, 0, 1)
ZEND_ARG_TYPE_MASK(0, name_or_hosts, MAY_BE_STRING|MAY_BE_ARRAY, NULL)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray__continuum, 0, 0, MAY_BE_BOOL|MAY_BE_ARRAY)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray__distributor, 0, 0, MAY_BE_BOOL|MAY_BE_CALLABLE)
ZEND_END_ARG_INFO()
#define arginfo_class_RedisArray__function arginfo_class_RedisArray__distributor
#define arginfo_class_RedisArray__hosts arginfo_class_RedisArray__continuum
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisArray__instance, 0, 1, Redis, MAY_BE_BOOL|MAY_BE_NULL)
ZEND_ARG_TYPE_INFO(0, host, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_RedisArray__rehash, 0, 0, _IS_BOOL, 1)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, fn, IS_CALLABLE, 1, "null")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray__target, 0, 1, MAY_BE_BOOL|MAY_BE_STRING|MAY_BE_NULL)
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_RedisArray_bgsave, 0, 0, IS_ARRAY, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_del, 0, 1, MAY_BE_BOOL|MAY_BE_LONG)
ZEND_ARG_TYPE_MASK(0, key, MAY_BE_STRING|MAY_BE_ARRAY, NULL)
ZEND_ARG_VARIADIC_TYPE_INFO(0, otherkeys, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_RedisArray_discard, 0, 0, _IS_BOOL, 1)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_exec, 0, 0, MAY_BE_BOOL|MAY_BE_NULL|MAY_BE_ARRAY)
ZEND_END_ARG_INFO()
#define arginfo_class_RedisArray_flushall arginfo_class_RedisArray__continuum
#define arginfo_class_RedisArray_flushdb arginfo_class_RedisArray__continuum
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_getOption, 0, 1, MAY_BE_BOOL|MAY_BE_ARRAY)
ZEND_ARG_TYPE_INFO(0, opt, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_hscan, 0, 2, MAY_BE_BOOL|MAY_BE_ARRAY)
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
ZEND_ARG_TYPE_MASK(1, iterator, MAY_BE_NULL|MAY_BE_LONG|MAY_BE_STRING, NULL)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, pattern, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, count, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
#define arginfo_class_RedisArray_info arginfo_class_RedisArray__continuum
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_keys, 0, 1, MAY_BE_BOOL|MAY_BE_ARRAY)
ZEND_ARG_TYPE_INFO(0, pattern, IS_STRING, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_mget, 0, 1, MAY_BE_BOOL|MAY_BE_ARRAY)
ZEND_ARG_TYPE_INFO(0, keys, IS_ARRAY, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_RedisArray_mset, 0, 1, _IS_BOOL, 0)
ZEND_ARG_TYPE_INFO(0, pairs, IS_ARRAY, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisArray_multi, 0, 1, RedisArray, MAY_BE_BOOL)
ZEND_ARG_TYPE_INFO(0, host, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 1, "null")
ZEND_END_ARG_INFO()
#define arginfo_class_RedisArray_ping arginfo_class_RedisArray__continuum
#define arginfo_class_RedisArray_save arginfo_class_RedisArray__continuum
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_scan, 0, 2, MAY_BE_BOOL|MAY_BE_ARRAY)
ZEND_ARG_TYPE_MASK(1, iterator, MAY_BE_NULL|MAY_BE_LONG|MAY_BE_STRING, NULL)
ZEND_ARG_TYPE_INFO(0, node, IS_STRING, 0)
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, pattern, IS_STRING, 1, "null")
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, count, IS_LONG, 0, "0")
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_select, 0, 1, MAY_BE_BOOL|MAY_BE_ARRAY)
ZEND_ARG_TYPE_INFO(0, index, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_setOption, 0, 2, MAY_BE_BOOL|MAY_BE_ARRAY)
ZEND_ARG_TYPE_INFO(0, opt, IS_LONG, 0)
ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0)
ZEND_END_ARG_INFO()
#define arginfo_class_RedisArray_sscan arginfo_class_RedisArray_hscan
#define arginfo_class_RedisArray_unlink arginfo_class_RedisArray_del
#define arginfo_class_RedisArray_unwatch arginfo_class_RedisArray_discard
#define arginfo_class_RedisArray_zscan arginfo_class_RedisArray_hscan
ZEND_METHOD(RedisArray, __call);
ZEND_METHOD(RedisArray, __construct);
ZEND_METHOD(RedisArray, _continuum);
ZEND_METHOD(RedisArray, _distributor);
ZEND_METHOD(RedisArray, _function);
ZEND_METHOD(RedisArray, _hosts);
ZEND_METHOD(RedisArray, _instance);
ZEND_METHOD(RedisArray, _rehash);
ZEND_METHOD(RedisArray, _target);
ZEND_METHOD(RedisArray, bgsave);
ZEND_METHOD(RedisArray, del);
ZEND_METHOD(RedisArray, discard);
ZEND_METHOD(RedisArray, exec);
ZEND_METHOD(RedisArray, flushall);
ZEND_METHOD(RedisArray, flushdb);
ZEND_METHOD(RedisArray, getOption);
ZEND_METHOD(RedisArray, hscan);
ZEND_METHOD(RedisArray, info);
ZEND_METHOD(RedisArray, keys);
ZEND_METHOD(RedisArray, mget);
ZEND_METHOD(RedisArray, mset);
ZEND_METHOD(RedisArray, multi);
ZEND_METHOD(RedisArray, ping);
ZEND_METHOD(RedisArray, save);
ZEND_METHOD(RedisArray, scan);
ZEND_METHOD(RedisArray, select);
ZEND_METHOD(RedisArray, setOption);
ZEND_METHOD(RedisArray, sscan);
ZEND_METHOD(RedisArray, unlink);
ZEND_METHOD(RedisArray, unwatch);
ZEND_METHOD(RedisArray, zscan);
static const zend_function_entry class_RedisArray_methods[] = {
ZEND_ME(RedisArray, __call, arginfo_class_RedisArray___call, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, __construct, arginfo_class_RedisArray___construct, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, _continuum, arginfo_class_RedisArray__continuum, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, _distributor, arginfo_class_RedisArray__distributor, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, _function, arginfo_class_RedisArray__function, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, _hosts, arginfo_class_RedisArray__hosts, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, _instance, arginfo_class_RedisArray__instance, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, _rehash, arginfo_class_RedisArray__rehash, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, _target, arginfo_class_RedisArray__target, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, bgsave, arginfo_class_RedisArray_bgsave, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, del, arginfo_class_RedisArray_del, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, discard, arginfo_class_RedisArray_discard, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, exec, arginfo_class_RedisArray_exec, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, flushall, arginfo_class_RedisArray_flushall, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, flushdb, arginfo_class_RedisArray_flushdb, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, getOption, arginfo_class_RedisArray_getOption, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, hscan, arginfo_class_RedisArray_hscan, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, info, arginfo_class_RedisArray_info, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, keys, arginfo_class_RedisArray_keys, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, mget, arginfo_class_RedisArray_mget, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, mset, arginfo_class_RedisArray_mset, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, multi, arginfo_class_RedisArray_multi, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, ping, arginfo_class_RedisArray_ping, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, save, arginfo_class_RedisArray_save, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, scan, arginfo_class_RedisArray_scan, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, select, arginfo_class_RedisArray_select, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, setOption, arginfo_class_RedisArray_setOption, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, sscan, arginfo_class_RedisArray_sscan, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, unlink, arginfo_class_RedisArray_unlink, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, unwatch, arginfo_class_RedisArray_unwatch, ZEND_ACC_PUBLIC)
ZEND_ME(RedisArray, zscan, arginfo_class_RedisArray_zscan, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
static zend_class_entry *register_class_RedisArray(void)
{
zend_class_entry ce, *class_entry;
INIT_CLASS_ENTRY(ce, "RedisArray", class_RedisArray_methods);
class_entry = zend_register_internal_class_ex(&ce, NULL);
return class_entry;
}