Lindenii Project Forge
Login

hare-lmdb

Hare bindings for LMDB
Commit info
ID
62e4cd4ad883a1f8d8c1f3b1d8dc64b95e2566a8
Author
Runxi Yu <me@runxiyu.org>
Author date
Fri, 14 Mar 2025 00:42:43 +0800
Committer
Runxi Yu <me@runxiyu.org>
Committer date
Fri, 14 Mar 2025 00:42:43 +0800
Actions
Add an example
/get
/put
/test.mdb
use fmt;
use io;
use lmdb;
use types;
use types::c;
use os;

export fn main() void = {
	const key = lmdb::val{
		mv_size = 13,
		mv_data = c::unterminatedstr("this is a key"): *opaque,
	};
	let val: lmdb::val = lmdb::val{
		mv_size = 0,
		mv_data = null,
	};

	let env: nullable *lmdb::env = null;
	let rc: int = lmdb::env_create(&env);
	if (rc != 0) {
		fmt::printf("error: {}\n", rc)!;
		abort("failed to create env");
	};
	let env: *lmdb::env = env as *lmdb::env;

	let path = c::fromstr("./test.mdb");
	defer free(path);
	rc = lmdb::env_open(env, path, 0, 0o644);
	if (rc != 0) {
		fmt::printf("error: {}\n", rc)!;
		abort("failed to open env");
	};

	let txn: nullable *lmdb::txn = null;
	rc = lmdb::txn_begin(env, null, 0, &txn);
	if (rc != 0) {
		fmt::printf("error: {}\n", rc)!;
		abort("failed to create txn");
	};
	let txn: *lmdb::txn = txn as *lmdb::txn;

	let dbi: lmdb::dbi = 0;
	rc = lmdb::dbi_open(txn, null, lmdb::CREATE, &dbi);
	if (rc != 0) {
		fmt::printf("error: {}\n", rc)!;
		abort("failed to create dbi");
	};

	rc = lmdb::get(txn, dbi, &key, &val);
	if (rc != 0) {
		fmt::printf("error: {}\n", rc)!;
		abort("failed to get");
	};

	rc = lmdb::txn_abort(txn);
	if (rc != 0) {
		fmt::printf("error: {}\n", rc)!;
		abort("failed to abort");
	};

	let data: []u8 = *(&(types::slice {
		data = val.mv_data,
		length = val.mv_size,
		capacity = val.mv_size,
	}): *[]u8);

	io::write(os::stdout, data)!;
};
use fmt;
use lmdb;
use types::c;

export fn main() void = {
	const key = lmdb::val{
		mv_size = 13,
		mv_data = c::unterminatedstr("this is a key"): *opaque,
	};
	const val = lmdb::val{
		mv_size = 15,
		mv_data = c::unterminatedstr("this is a value"): *opaque,
	};

	let env: nullable *lmdb::env = null;
	let rc: int = lmdb::env_create(&env);
	if (rc != 0) {
		fmt::printf("error: {}\n", rc)!;
		abort("failed to create env");
	};
	let env: *lmdb::env = env as *lmdb::env;

	let path = c::fromstr("./test.mdb");
	defer free(path);
	rc = lmdb::env_open(env, path, 0, 0o644);
	if (rc != 0) {
		fmt::printf("error: {}\n", rc)!;
		abort("failed to open env");
	};

	let txn: nullable *lmdb::txn = null;
	rc = lmdb::txn_begin(env, null, 0, &txn);
	if (rc != 0) {
		fmt::printf("error: {}\n", rc)!;
		abort("failed to create txn");
	};
	let txn: *lmdb::txn = txn as *lmdb::txn;

	let dbi: lmdb::dbi = 0;
	rc = lmdb::dbi_open(txn, null, lmdb::CREATE, &dbi);
	if (rc != 0) {
		fmt::printf("error: {}\n", rc)!;
		abort("failed to create dbi");
	};

	rc = lmdb::put(txn, dbi, &key, &val, 0);
	if (rc != 0) {
		fmt::printf("error: {}\n", rc)!;
		abort("failed to put");
	};

	rc = lmdb::txn_commit(txn);
	if (rc != 0) {
		fmt::printf("error: {}\n", rc)!;
		abort("failed to commit");
	};
};