Lindenii Project Forge
Login

hare-lmdb

Hare bindings for LMDB
Commit info
ID
66a49fc7704abda8866c6be4ad5186e3dc1d4538
Author
Runxi Yu <me@runxiyu.org>
Author date
Fri, 14 Mar 2025 00:54:45 +0800
Committer
Runxi Yu <me@runxiyu.org>
Committer date
Fri, 14 Mar 2025 00:54:45 +0800
Actions
Make the example use stdio properly
use fmt;
use io;
use lmdb;
use strings;
use types;
use types::c;
use os;

export fn main() void = {
	if (len(os::args) != 3) {
		abort("need two arguments (db dir, key)");
	};

	const key = lmdb::val{
		mv_size = 13,
		mv_data = c::unterminatedstr("this is a key"): *opaque,
		mv_size = len(strings::toutf8(os::args[2])),
		mv_data = c::unterminatedstr(os::args[2]): *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");
	let path = c::fromstr(os::args[1]);
	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 io;
use lmdb;
use strings;
use types;
use types::c;
use os;

export fn main() void = {
	if (len(os::args) != 3) {
		abort("need two arguments (db dir, key)");
	};

	const key = lmdb::val{
		mv_size = 13,
		mv_data = c::unterminatedstr("this is a key"): *opaque,
		mv_size = len(strings::toutf8(os::args[2])),
		mv_data = c::unterminatedstr(os::args[2]): *opaque,
	};
	
	let v = io::drain(os::stdin)!;
	defer free(v);

	const val = lmdb::val{
		mv_size = 15,
		mv_data = c::unterminatedstr("this is a value"): *opaque,
		mv_size = len(v),
		mv_data = (*(&v: *types::slice)).data: *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");
	let path = c::fromstr(os::args[1]);
	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");
	};
};