Constant ord_lmdb_zero::put::NOOVERWRITE
source · [−]pub const NOOVERWRITE: Flags;
Expand description
Enter the new key/data pair only if the key does not already
appear in the database. The function will return KEYEXIST
if
the key already appears in the database, even if the database
supports duplicates (DUPSORT
).
Examples
In a 1:1 database
let db = lmdb::Database::open(
&env, None, &lmdb::DatabaseOptions::defaults())
.unwrap();
let txn = lmdb::WriteTransaction::new(&env).unwrap();
{
let mut access = txn.access();
access.put(&db, "Fruit", "Apple", lmdb::put::Flags::empty()).unwrap();
// By default, collisions overwrite the old value
access.put(&db, "Fruit", "Orange", lmdb::put::Flags::empty()).unwrap();
assert_eq!("Orange", access.get::<str,str>(&db, "Fruit").unwrap());
// But `NOOVERWRITE` prevents that
assert!(access.put(&db, "Fruit", "Durian", lmdb::put::NOOVERWRITE).is_err());
assert_eq!("Orange", access.get::<str,str>(&db, "Fruit").unwrap());
}
txn.commit().unwrap();
In a DUPSORT
database
let db = lmdb::Database::open(
&env, Some("reversed"),
&lmdb::DatabaseOptions::create_multimap_unsized::<str,str>())
.unwrap();
let txn = lmdb::WriteTransaction::new(&env).unwrap();
{
let mut access = txn.access();
// Ordinarily, we can add multiple items per key
access.put(&db, "Fruit", "Apple", lmdb::put::Flags::empty()).unwrap();
access.put(&db, "Fruit", "Orange", lmdb::put::Flags::empty()).unwrap();
let mut cursor = txn.cursor(&db).unwrap();
cursor.seek_k::<str,str>(&access, "Fruit").unwrap();
assert_eq!(2, cursor.count().unwrap());
// But this can be prevented with `NOOVERWRITE`
access.put(&db, "Veggie", "Carrot", lmdb::put::NOOVERWRITE).unwrap();
assert!(access.put(&db, "Veggie", "Squash", lmdb::put::NOOVERWRITE).is_err());
cursor.seek_k::<str,str>(&access, "Veggie").unwrap();
assert_eq!(1, cursor.count().unwrap());
}
txn.commit().unwrap();