From 44a437178d8e3839895e36deda9b324586185cad Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 10 Aug 2025 08:54:19 +0800 Subject: [PATCH] Support nomem --- example/get.ha | 4 +++- example/put.ha | 6 ++++-- lmdb/dbi.ha | 4 ++-- lmdb/env.ha | 4 ++-- diff --git a/example/get.ha b/example/get.ha index f1281ac34f5bf7a5fdea7bbbf91f414da1d9187b..bbe69b0428972e62bce937ab0508adae2eadc5e2 100644 --- a/example/get.ha +++ b/example/get.ha @@ -19,10 +19,12 @@ case let e: lmdb::error => fmt::fprintln(os::stderr, lmdb::strerror(e))!; case let e: io::error => fmt::fprintln(os::stderr, io::strerror(e))!; + case nomem => + fmt::fprintln(os::stderr, "OOM")!; }; }; -export fn real() (void | lmdb::error | io::error) = { +export fn real() (void | lmdb::error | io::error | nomem) = { const key = lmdb::val{ mv_size = len(strings::toutf8(os::args[2])), mv_data = c::unterminatedstr(os::args[2]): *opaque, diff --git a/example/put.ha b/example/put.ha index 945eefe058df9557e74dd9f36c3f1a3ee41214a5..0ddbef2fe2821b880b95275c1178aff46f0ad00f 100644 --- a/example/put.ha +++ b/example/put.ha @@ -19,15 +19,17 @@ case let e: lmdb::error => fmt::fprintln(os::stderr, lmdb::strerror(e))!; case let e: io::error => fmt::fprintln(os::stderr, io::strerror(e))!; + case nomem => + fmt::fprintln(os::stderr, "OOM")!; }; }; -export fn real() (void | lmdb::error | io::error) = { +export fn real() (void | lmdb::error | io::error | nomem) = { 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); diff --git a/lmdb/dbi.ha b/lmdb/dbi.ha index fccca7e7b7d78f5db0baca7cb36e1635dd85a7e6..6ec0c5c1cb7cd197a7102dfcd1ae39e5097efc15 100644 --- a/lmdb/dbi.ha +++ b/lmdb/dbi.ha @@ -10,9 +10,9 @@ dbi: ffi::dbi, }; // Opens a database from a transaction. -export fn dbi_open(txn: *txn, name: nullable *str, flags: uint) (dbi | error) = { +export fn dbi_open(txn: *txn, name: nullable *str, flags: uint) (dbi | error | nomem) = { const n: nullable *c::char = match (name) { - case *str => yield c::fromstr(*(name as *str)); + case *str => yield c::fromstr(*(name as *str))?; case null => yield null; }; defer free(n); diff --git a/lmdb/env.ha b/lmdb/env.ha index 122c1eb932b56d0dbbd239678a27639afe6ad8d1..9c3f4b8b8788d0b238794e02ab6fd3ba4c9ae181 100644 --- a/lmdb/env.ha +++ b/lmdb/env.ha @@ -25,8 +25,8 @@ ffi::env_close(env: *ffi::env); }; // Associates an [[env]] with a on-disk environment. -export fn env_open(env: *env, path: str, flag: uint, mode: u32) (void | error) = { - const p = c::fromstr(path); +export fn env_open(env: *env, path: str, flag: uint, mode: u32) (void | error | nomem) = { + const p = c::fromstr(path)?; defer free(p); const rc = ffi::env_open(env: *ffi::env, p, flag, mode): error; -- 2.48.1