Привет,
Если вы дадите prefix_iterator
более длинный префикс, чем тот, который вы указали в параметрах ( set_prefix_extractor
).
Вы не получаете сообщение об ошибке, и он не игнорирует остальную часть префикса, он ведет себя как префикс вместе с From.
как это:
set_prefix_extractor(len)
myp = &[1u8; len+1];
prefix(myp[..len]) + From(myp)
И реальный рабочий пример:
let prefix_extractor = rocksdb::SliceTransform::create_fixed_prefix(1);
let mut opts = Options::default();
opts.create_if_missing(true);
opts.set_prefix_extractor(prefix_extractor);
let db = DB::open(&opts, &tempdir).unwrap();
db.put(&[0,0,0,0], &[0,0,0,0]).unwrap();
db.put(&[0,0,0,1], &[0,0,0,1]).unwrap();
db.put(&[0,1,0,1], &[0,1,0,1]).unwrap();
db.put(&[0,1,1,1], &[0,1,1,1]).unwrap();
db.put(&[0,1,2,1], &[0,1,2,1]).unwrap();
db.put(&[2,0,0,0], &[2,0,0,0]).unwrap();
db.put(&[2,2,2,2], &[2,2,2,2]).unwrap();
let me = db.prefix_iterator(&[0,1,0]);
for (key, value) in me {
println!("Saw {:?} {:?}", key, value);
}
Это напечатает следующие результаты:
Saw [0, 1, 0, 1] [0, 1, 0, 1]
Saw [0, 1, 1, 1] [0, 1, 1, 1]
Saw [0, 1, 2, 1] [0, 1, 2, 1]
Таким образом, первый байт ведет себя как настоящий префикс (дает точное совпадение), но остальные не являются ни префиксом, ни игнорируются, они используются как «От» (вы можете видеть, что это игнорирует все, что начинается с [0,0 ], но включает в себя байты большего размера, например [0,2])
Это желаемое поведение или ошибка?
Я подозреваю, что наблюдаемое вами поведение связано с тем, как реализована основная библиотека. Я не уверен, что это намеренно или «неопределенное поведение».
@elichai Хорошо закрыть или вы думаете, что это проблема с привязкой к языку?
хм, я вообще-то не проверял, существует ли он в коде C ++, так что idk.
Возможно, я скоро проверю, когда у меня будет время (не разработчик C ++)
@iSynaptic Не уверен, заслуживает ли это отдельного
put
функции write_batch не содержат try!
но они возвращают результат.
Это предназначено? Зачем?
https://github.com/rust-rocksdb/rust-rocksdb/blob/master/src/db.rs#L1147
@elichai Я думаю, что это предполагаемое поведение, поскольку нет никаких шансов на ошибку в деталях реализации. В будущем мы сможем изменить эту внутреннюю реализацию без изменения пользовательского API.
@elichai Теперь я согласен с тем, что prefix_iterator
ведет себя странно, но так, как задумано. В № 254 я добавил тест, который проверяет поведение и включает комментарий, объясняющий поведение (цитируется ниже). Судя по поведению, которое, как мне кажется, вы хотите, вам, вероятно, следует использовать обычный итератор и предоставить свой собственный ReadOptions
. Это включено в # 253.
Объяснение :
db.prefix_iterator
устанавливает базовые параметры для поиска первого ключа, который соответствует всемуprefix
. Оттуда итератор будет продолжать читать пары до тех пор, пока префикс, извлеченный изkey
совпадает с префиксом, извлеченным изprefix
.
@vitvakatu @aleksuss Я думаю, нам нужно взглянуть на все функции, которые