mirror of
https://github.com/php-win-ext/phpredis.git
synced 2026-03-24 09:02:07 +01:00
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
190 lines
8.5 KiB
C
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;
|
|
}
|