Lindenii Project Forge
Login

hare-lmdb

Hare bindings for LMDB
Commit info
ID
e209eab673e0f1418e9d1b283311917275dba10f
Author
Runxi Yu <me@runxiyu.org>
Author date
Sat, 15 Mar 2025 22:42:37 +0800
Committer
Runxi Yu <me@runxiyu.org>
Committer date
Sat, 15 Mar 2025 22:43:11 +0800
Actions
Add strerror
use fmt;
use io;
use lmdb_ffi = lmdb::ffi;
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)");
		fmt::fprintln(os::stderr, "need two arguments (db dir, key)")!;
		return;
	};

	match (real()) {
	case void => void;
	case let e: lmdb::error =>
		fmt::fprintln(os::stderr, lmdb::strerror(e))!;
	case let e: io::error =>
		fmt::fprintln(os::stderr, io::strerror(e))!;
	};
};

export fn real() (void | lmdb::error | io::error) = {
	const key = lmdb::val{
		mv_size = len(strings::toutf8(os::args[2])),
		mv_data = c::unterminatedstr(os::args[2]): *opaque,
	};

	let env = lmdb::env_create()!;
	let env = lmdb::env_create()?;

	lmdb::env_open(env, os::args[1], 0, 0o644)!;
	lmdb::env_open(env, os::args[1], 0, 0o644)?;

	let txn = lmdb::txn_begin(env, 0)!;
	let txn = lmdb::txn_begin(env, 0)?;

	let dbi = lmdb::dbi_open(txn, null, lmdb_ffi::CREATE)!;
	let dbi = lmdb::dbi_open(txn, null, lmdb_ffi::CREATE)?;

	let val = lmdb::get(dbi, &key)!;
	let val = lmdb::get(dbi, &key)?;

	let data = lmdb::val_u8s(&val);

	io::write(os::stdout, data)!;
	io::write(os::stdout, data)?;

	lmdb::txn_abort(txn)!;
	lmdb::txn_abort(txn)?;
};
use fmt;
use io;
use lmdb;
use lmdb_ffi = lmdb::ffi;
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)");
		fmt::fprintln(os::stderr, "need two arguments (db dir, key)")!;
		return;
	};

	match (real()) {
	case void => void;
	case let e: lmdb::error =>
		fmt::fprintln(os::stderr, lmdb::strerror(e))!;
	case let e: io::error =>
		fmt::fprintln(os::stderr, io::strerror(e))!;
	};
};

export fn real() (void | lmdb::error | io::error) = {
	const key = lmdb::val {
		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::u8s_val(v);

	let env = lmdb::env_create()!;
	let env = lmdb::env_create()?;

	lmdb::env_open(env, os::args[1], 0, 0o644)!;
	lmdb::env_open(env, os::args[1], 0, 0o644)?;

	let txn = lmdb::txn_begin(env, 0)!;
	let txn = lmdb::txn_begin(env, 0)?;

	let dbi = lmdb::dbi_open(txn, null, lmdb_ffi::CREATE)!;
	let dbi = lmdb::dbi_open(txn, null, lmdb_ffi::CREATE)?;

	let val = lmdb::put(dbi, &key, &val, 0)!;
	let val = lmdb::put(dbi, &key, &val, 0)?;

	lmdb::txn_commit(txn)!;
	lmdb::txn_commit(txn)?;
};
use lmdb::ffi;
use types::c;

// Any error returned by LMDB.
export type error = !int;

// Create a human-readable error message from an [[error]].
export fn strerror(err: error) str = {
	return c::tostr_unsafe(ffi::strerror(err: int));
};
use types::c;

export @symbol("mdb_strerror") fn strerror(err: int) *c::char;