Prefer using iterator put_current instead of a get put method

This commit is contained in:
Clément Renault 2020-10-30 11:13:45 +01:00
parent e63fdf2b22
commit a30206a665
No known key found for this signature in database
GPG Key ID: 92ADA4E935E71FA4

View File

@ -108,13 +108,17 @@ fn merge_into_lmdb_database(
}, },
WriteMethod::GetMergePut => { WriteMethod::GetMergePut => {
while let Some((k, v)) = in_iter.next()? { while let Some((k, v)) = in_iter.next()? {
match database.get::<_, ByteSlice, ByteSlice>(wtxn, k)? { let mut iter = database.prefix_iter_mut::<_, ByteSlice, ByteSlice>(wtxn, k)?;
Some(old_val) => { match iter.next().transpose()? {
Some((key, old_val)) if key == k => {
let vals = vec![Cow::Borrowed(old_val), Cow::Borrowed(v)]; let vals = vec![Cow::Borrowed(old_val), Cow::Borrowed(v)];
let val = merge(k, &vals).expect("merge failed"); let val = merge(k, &vals).expect("merge failed");
database.put::<_, ByteSlice, ByteSlice>(wtxn, k, &val)? iter.put_current(k, &val)?;
},
_ => {
drop(iter);
database.put::<_, ByteSlice, ByteSlice>(wtxn, k, v)?;
}, },
None => database.put::<_, ByteSlice, ByteSlice>(wtxn, k, v)?,
} }
} }
}, },
@ -145,13 +149,17 @@ fn write_into_lmdb_database(
}, },
WriteMethod::GetMergePut => { WriteMethod::GetMergePut => {
while let Some((k, v)) = reader.next()? { while let Some((k, v)) = reader.next()? {
match database.get::<_, ByteSlice, ByteSlice>(wtxn, k)? { let mut iter = database.prefix_iter_mut::<_, ByteSlice, ByteSlice>(wtxn, k)?;
Some(old_val) => { match iter.next().transpose()? {
Some((key, old_val)) if key == k => {
let vals = vec![Cow::Borrowed(old_val), Cow::Borrowed(v)]; let vals = vec![Cow::Borrowed(old_val), Cow::Borrowed(v)];
let val = merge(k, &vals).expect("merge failed"); let val = merge(k, &vals).expect("merge failed");
database.put::<_, ByteSlice, ByteSlice>(wtxn, k, &val)? iter.put_current(k, &val)?;
},
_ => {
drop(iter);
database.put::<_, ByteSlice, ByteSlice>(wtxn, k, v)?;
}, },
None => database.put::<_, ByteSlice, ByteSlice>(wtxn, k, v)?,
} }
} }
} }