put method

Future<void> put(
  1. Pointer<MDB_txn> txn,
  2. String key,
  3. List<int> value, {
  4. String? dbName,
  5. LMDBFlagSet? flags,
})

Stores a raw byte value in the database.

Parameters:

  • txn - Active transaction
  • key - String key under which to store the value
  • value - Raw bytes to store
  • dbName - Optional named database. If not provided, the default database will be used.
  • flags - Optional operation flags

Example:

final txn = await db.txnStart();
try {
  await db.put(txn, 'key', [1, 2, 3, 4]);
  await db.txnCommit(txn);
} catch (e) {
  await db.txnAbort(txn);
  rethrow;
}

Throws StateError if database is not initialized Throws LMDBException if operation fails

Implementation

Future<void> put(
  Pointer<MDB_txn> txn,
  String key,
  List<int> value, {
  String? dbName,
  LMDBFlagSet? flags,
}) async {
  if (!isInitialized) throw StateError(_errDbNotInitialized);

  final dbi = await _getDatabase(txn, name: dbName, flags: flags);
  final keyPtr = key.toNativeUtf8();
  final valuePtr = calloc<Uint8>(value.length);

  try {
    final valueList = valuePtr.asTypedList(value.length);
    valueList.setAll(0, value);

    return _withAllocated<void, MDB_val>((keyVal) {
      return _withAllocated<void, MDB_val>((dataVal) {
        keyVal.ref.mv_size = keyPtr.length;
        keyVal.ref.mv_data = keyPtr.cast();

        dataVal.ref.mv_size = value.length;
        dataVal.ref.mv_data = valuePtr.cast();

        final result = _lib.mdb_put(
          txn,
          dbi,
          keyVal,
          dataVal,
          flags?.value ?? 0,
        );

        if (result != 0) {
          throw LMDBException('Failed to put data', result);
        }
      }, calloc<MDB_val>());
    }, calloc<MDB_val>());
  } finally {
    calloc.free(keyPtr);
    calloc.free(valuePtr);
  }
}