From 62e4cd4ad883a1f8d8c1f3b1d8dc64b95e2566a8 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Fri, 14 Mar 2025 00:42:43 +0800 Subject: [PATCH] Add an example --- example/.gitignore | 3 +++ example/get.ha | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ example/put.ha | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..29fd592a2fdca303221b227d906bb8979cc15de8 --- /dev/null +++ b/example/.gitignore @@ -0,0 +1,3 @@ +/get +/put +/test.mdb diff --git a/example/get.ha b/example/get.ha new file mode 100644 index 0000000000000000000000000000000000000000..8db91673f483130f0a89c4e9d98050aee3b48a9b --- /dev/null +++ b/example/get.ha @@ -0,0 +1,68 @@ +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)!; +}; diff --git a/example/put.ha b/example/put.ha new file mode 100644 index 0000000000000000000000000000000000000000..7318bf2452fb9e31f195c7e5919e2ed23f22db00 --- /dev/null +++ b/example/put.ha @@ -0,0 +1,57 @@ +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"); + }; +}; -- 2.48.1