mdbx-test: поддержка rnd/rand/random для опций --keylen и --datalen.

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2024-02-20 13:45:12 +03:00
parent 164d112507
commit 544c6bc1e4
3 changed files with 44 additions and 22 deletions

View File

@ -145,6 +145,16 @@ bool parse_option(int argc, char *const argv[], int &narg, const char *option,
return true; return true;
} }
if (strcmp(value_cstr, "rnd") == 0 || strcmp(value_cstr, "rand") == 0 ||
strcmp(value_cstr, "random") == 0) {
value = minval;
if (maxval > minval)
value += (prng32() + UINT64_C(44263400549519813)) % (maxval - minval);
if (scale == intkey)
value &= ~3u;
return true;
}
char *suffix = nullptr; char *suffix = nullptr;
errno = 0; errno = 0;
unsigned long long raw = strtoull(value_cstr, &suffix, 0); unsigned long long raw = strtoull(value_cstr, &suffix, 0);
@ -159,7 +169,7 @@ bool parse_option(int argc, char *const argv[], int &narg, const char *option,
uint64_t multiplier = 1; uint64_t multiplier = 1;
if (suffix && *suffix) { if (suffix && *suffix) {
if (scale == no_scale) if (scale == no_scale || scale == intkey)
failure("Option '--%s' doesn't accepts suffixes, so '%s' is unexpected\n", failure("Option '--%s' doesn't accepts suffixes, so '%s' is unexpected\n",
option, suffix); option, suffix);
if (strcmp(suffix, "K") == 0 || strcasecmp(suffix, "Kilo") == 0) if (strcmp(suffix, "K") == 0 || strcasecmp(suffix, "Kilo") == 0)
@ -203,6 +213,8 @@ bool parse_option(int argc, char *const argv[], int &narg, const char *option,
if (value < minval) if (value < minval)
failure("The minimal value for option '--%s' is %" PRIu64 "\n", option, failure("The minimal value for option '--%s' is %" PRIu64 "\n", option,
minval); minval);
if (scale == intkey)
value &= ~3u;
return true; return true;
} }

View File

@ -63,7 +63,7 @@ const char *keygencase2str(const keygen_case);
namespace config { namespace config {
enum scale_mode { no_scale, decimal, binary, duration }; enum scale_mode { no_scale, decimal, binary, duration, intkey };
bool parse_option(int argc, char *const argv[], int &narg, const char *option, bool parse_option(int argc, char *const argv[], int &narg, const char *option,
const char **value, const char *default_value = nullptr); const char **value, const char *default_value = nullptr);

View File

@ -468,49 +468,59 @@ int main(int argc, char *const argv[]) {
keycase_setup(value, params); keycase_setup(value, params);
continue; continue;
} }
if (config::parse_option(argc, argv, narg, "keylen.min", params.keylen_min, if (config::parse_option(
config::no_scale, params.mdbx_keylen_min(), argc, argv, narg, "keylen.min", params.keylen_min,
params.mdbx_keylen_max())) { (params.table_flags & MDBX_INTEGERKEY) ? config::intkey
: config::no_scale,
params.mdbx_keylen_min(), params.mdbx_keylen_max())) {
if ((params.table_flags & MDBX_INTEGERKEY) || if ((params.table_flags & MDBX_INTEGERKEY) ||
params.keylen_max < params.keylen_min) params.keylen_max < params.keylen_min)
params.keylen_max = params.keylen_min; params.keylen_max = params.keylen_min;
continue; continue;
} }
if (config::parse_option(argc, argv, narg, "keylen.max", params.keylen_max, if (config::parse_option(
config::no_scale, params.mdbx_keylen_min(), argc, argv, narg, "keylen.max", params.keylen_max,
params.mdbx_keylen_max())) { (params.table_flags & MDBX_INTEGERKEY) ? config::intkey
: config::no_scale,
params.mdbx_keylen_min(), params.mdbx_keylen_max())) {
if ((params.table_flags & MDBX_INTEGERKEY) || if ((params.table_flags & MDBX_INTEGERKEY) ||
params.keylen_min > params.keylen_max) params.keylen_min > params.keylen_max)
params.keylen_min = params.keylen_max; params.keylen_min = params.keylen_max;
continue; continue;
} }
if (config::parse_option(argc, argv, narg, "keylen", params.keylen_min, if (config::parse_option(
config::no_scale, params.mdbx_keylen_min(), argc, argv, narg, "keylen", params.keylen_min,
params.mdbx_keylen_max())) { (params.table_flags & MDBX_INTEGERKEY) ? config::intkey
: config::no_scale,
params.mdbx_keylen_min(), params.mdbx_keylen_max())) {
params.keylen_max = params.keylen_min; params.keylen_max = params.keylen_min;
continue; continue;
} }
if (config::parse_option(argc, argv, narg, "datalen.min", if (config::parse_option(
params.datalen_min, config::no_scale, argc, argv, narg, "datalen.min", params.datalen_min,
params.mdbx_datalen_min(), (params.table_flags & MDBX_INTEGERDUP) ? config::intkey
params.mdbx_datalen_max())) { : config::no_scale,
params.mdbx_datalen_min(), params.mdbx_datalen_max())) {
if ((params.table_flags & (MDBX_INTEGERDUP | MDBX_DUPFIXED)) || if ((params.table_flags & (MDBX_INTEGERDUP | MDBX_DUPFIXED)) ||
params.datalen_max < params.datalen_min) params.datalen_max < params.datalen_min)
params.datalen_max = params.datalen_min; params.datalen_max = params.datalen_min;
continue; continue;
} }
if (config::parse_option(argc, argv, narg, "datalen.max", if (config::parse_option(
params.datalen_max, config::no_scale, argc, argv, narg, "datalen.max", params.datalen_max,
params.mdbx_datalen_min(), (params.table_flags & MDBX_INTEGERDUP) ? config::intkey
params.mdbx_datalen_max())) { : config::no_scale,
params.mdbx_datalen_min(), params.mdbx_datalen_max())) {
if ((params.table_flags & (MDBX_INTEGERDUP | MDBX_DUPFIXED)) || if ((params.table_flags & (MDBX_INTEGERDUP | MDBX_DUPFIXED)) ||
params.datalen_min > params.datalen_max) params.datalen_min > params.datalen_max)
params.datalen_min = params.datalen_max; params.datalen_min = params.datalen_max;
continue; continue;
} }
if (config::parse_option(argc, argv, narg, "datalen", params.datalen_min, if (config::parse_option(
config::no_scale, params.mdbx_datalen_min(), argc, argv, narg, "datalen", params.datalen_min,
params.mdbx_datalen_max())) { (params.table_flags & MDBX_INTEGERDUP) ? config::intkey
: config::no_scale,
params.mdbx_datalen_min(), params.mdbx_datalen_max())) {
params.datalen_max = params.datalen_min; params.datalen_max = params.datalen_min;
continue; continue;
} }