From e209eab673e0f1418e9d1b283311917275dba10f Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sat, 15 Mar 2025 22:42:37 +0800 Subject: [PATCH] Add strerror --- example/get.ha | 27 +++++++++++++++++++-------- example/put.ha | 25 ++++++++++++++++++------- lmdb/error.ha | 8 ++++++++ lmdb/ffi/strerror.ha | 3 +++ diff --git a/example/get.ha b/example/get.ha index e3ba91d6f8c3b42caf74c5215e47a8a9f99a18cd..f1281ac34f5bf7a5fdea7bbbf91f414da1d9187b 100644 --- a/example/get.ha +++ b/example/get.ha @@ -9,27 +9,38 @@ 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)?; }; diff --git a/example/put.ha b/example/put.ha index 6eeef1acd4d4ac17a63b76a64db73c16af788eaa..945eefe058df9557e74dd9f36c3f1a3ee41214a5 100644 --- a/example/put.ha +++ b/example/put.ha @@ -9,9 +9,20 @@ 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, @@ -22,15 +33,15 @@ 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)?; }; diff --git a/lmdb/error.ha b/lmdb/error.ha index 0709465d138c94fd556c3001c42daa793635c191..dda8f132759af97e803ff42f6e5b574cb168fc2d 100644 --- a/lmdb/error.ha +++ b/lmdb/error.ha @@ -1,2 +1,10 @@ +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)); +}; diff --git a/lmdb/ffi/strerror.ha b/lmdb/ffi/strerror.ha new file mode 100644 index 0000000000000000000000000000000000000000..39a187b8e22eb8ba3339acd451b5419417eb1eaf --- /dev/null +++ b/lmdb/ffi/strerror.ha @@ -0,0 +1,3 @@ +use types::c; + +export @symbol("mdb_strerror") fn strerror(err: int) *c::char; -- 2.48.1