pub const NODUPDATA: Flags;
Expand description

Enter the new key/data pair only if it does not already appear in the database. This flag may only be specified if the database was opened with DUPSORT. The function will return KEYEXIST if the key/data pair already appears in the database.

Example

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();
  access.put(&db, "Fruit", "Apple", lmdb::put::Flags::empty()).unwrap();
  access.put(&db, "Fruit", "Orange", lmdb::put::Flags::empty()).unwrap();
  // Duplicate, but that's OK by default
  access.put(&db, "Fruit", "Apple", lmdb::put::Flags::empty()).unwrap();
  // `NODUPDATA` blocks adding an identical item
  assert!(access.put(&db, "Fruit", "Apple", lmdb::put::NODUPDATA).is_err());
  // But doesn't affect pairs not already present
  access.put(&db, "Fruit", "Durian", lmdb::put::NODUPDATA).unwrap();
}
txn.commit().unwrap();

When used on a cursor, the cursor is positioned at the conflicting key/value pair if this results in a KEYEXIST error.

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();
  access.put(&db, "Fruit", "Apple", lmdb::put::Flags::empty()).unwrap();
  access.put(&db, "Fruit", "Orange", lmdb::put::Flags::empty()).unwrap();
  access.put(&db, "Fruit", "Durian", lmdb::put::Flags::empty()).unwrap();

  let mut cursor = txn.cursor(&db).unwrap();
  assert_eq!(Err(lmdb::Error::Code(lmdb::error::KEYEXIST)),
             cursor.put(&mut access, "Fruit", "Durian",
                        lmdb::put::NODUPDATA));
  assert_eq!(("Fruit", "Durian"), cursor.get_current(&access).unwrap());
}
txn.commit().unwrap();