#lmdb #zero-copy #b-tree #write-file

lmdb-zero

一个几乎安全的、接近零成本的、功能齐全的、毫不掩饰的非抽象LMDB包装器

11 个版本

使用旧的 Rust 2015

0.4.4 2018 年 4 月 21 日
0.4.2 2018 年 3 月 17 日
0.4.1 2017 年 9 月 1 日
0.4.0 2017 年 2 月 25 日
0.3.0 2016 年 10 月 24 日

#573数据库接口

Download history 1514/week @ 2024-03-14 1665/week @ 2024-03-21 1381/week @ 2024-03-28 949/week @ 2024-04-04 1455/week @ 2024-04-11 1589/week @ 2024-04-18 1162/week @ 2024-04-25 1301/week @ 2024-05-02 1206/week @ 2024-05-09 1284/week @ 2024-05-16 1185/week @ 2024-05-23 1290/week @ 2024-05-30 778/week @ 2024-06-06 1061/week @ 2024-06-13 1390/week @ 2024-06-20 971/week @ 2024-06-27

4,336 每月下载量
用于 110 个 Crates (30 个直接使用)

MIT/Apache

250KB
2.5K SLoC

lmdb-zero

Build Status

lmdb-zero 是一个接近零成本的LMDB包装器,旨在允许使用LMDB提供的全部功能,同时保持编写安全程序相对容易。

lmdb-zero 尽可能地是原始API的1:1映射,主要提供RAII构造和集成到Rust的借用检查器中,以确保安全性。

文档

特性

  • 零拷贝API。读取将引用返回到内存映射文件。支持使用 MDB_RESERVE 在文件中分配空间并直接写入。

  • 游标直接映射到LMDB提供的相同操作,但以类型安全的方式进行。

  • 嵌套事务。

  • 完全集成到借用检查器中。读取引用将被检查以确保它们不会在其事务结束后持续存在或与同一事务中的写入重叠。

  • 游标和读取事务可以被重置和重用。

状态

API 已完成并且相当稳定,并且相信在Rust的不安全规则实际上定义的情况下是可靠的。

虽然该Crates在ARM7上通过测试,但尚未在具有强对齐约束的架构上彻底测试。虽然转换API默认检查正确对齐,但可能会出现类似 #27060 的问题,并且当然可能在此处处理对齐时存在错误。

变更日志

0.4.4:新增 EnvironmentDatabase 方法,以支持与原生C/C++代码的互操作。将 Database::dbi() 重命名为 as_raw()。旧名称仍然可用,但已弃用。

0.4.3:修复在 Cursor::get_multiple() 中,如果当前键恰好有一个项目时发生的恐慌。现在从Crates根重新导出 LmdbResultExt,以便更好地可见。

0.4.2:修复在只读环境中无法打开数据库。修复由于 Unaligned 而产生的未来不兼容警告。

0.4.1:测试已更新以在Rust 1.20上运行。更新 bitflags 依赖项。这两者都不会对外部代码产生影响。

0.4.0:一些小的破坏性变更。现在可以删除并重新获取 ConstAccessorWriteAccessor。大多数类型现在支持额外的所有权/借用模式,这允许进行动态生命周期管理和其他可能性。升级到 liblmdb-sys 0.2.2 和 bitflags 0.8.0。修复了文档。

0.3.1:元数据更新以反映crate所有权的变更。本版本没有进行软件更改。

0.3.0:API的破坏性变更,请参阅下文部分。对于大多数用例,迁移应很轻松。由于添加了 #[inline],性能略有提升。

0.2.2ResetTransaction 现在实际上是公开的,这使得API的这部分更易于访问。添加了关于生命周期的文档。

0.2.1:修复在传递数据库名称给 mdb_dbi_open 时的使用后释放问题。修复在事务提交失败后调用 mdb_txn_abort 的问题。#1

0.2.0:从 lmdb-sys 切换到较新的 liblmdb-sys

0.1.0:初始版本。

0.4.0中的破坏性变更

以前一些函数接受 &SomeType 参数,现在接受 Into<Supercow<SomeType>>。对于大多数现有代码,这没有影响,但如果旧代码依赖于隐式 Deref 调用(例如,通过 lazy_static!)来产生正确的引用类型,则可能会出现问题。如果这导致问题,需要显式编写解引用。例如,如果您的代码最初有 lmdb::Database::open(&ENV, ...),其中 ENV 通过 lazy_static! 声明,则需要将其更改为 lmdb::Database::open(&*ENV, ...)

ConstAccessorWriteAccessor 必须现在严格晚于它们的交易。目前没有明显的实际问题,但如果出现这种情况,必须重新组织代码以确保在交易之前删除访问器。请注意,现在可以删除访问器并在以后重新获取它。

0.3.0中的破坏性变更

lmdb::Error 已完全重写。它现在是一个枚举,其中lmdb-zero错误与本地LMDB错误清晰分离。《code>ValRejected 现在包括错误消息。

FromLmdbBytes.from_lmdb_bytes() 现在返回 Result<&Self, String>,而不是 Option。这主要是为了使对齐问题不那么微妙,并直接引导人们了解如何解决问题,但也可能使其他事情更清晰。

大多数未经过测试且有些可疑的 lax_alignment 功能已被删除。LmdbRaw 现在始终强制执行对齐要求。希望对未对齐的值进行操作的客户端代码(不能使用 Unaligned#[repr(packed)] 解决方案)需要提供自己的 FromLmdbBytes 实现。

具有对齐要求的原始类型(例如,i32u64)不再是 LmdbRaw,因为这使得编写依赖于意外正确对齐值的代码变得过于容易。现在客户端代码 必须 在读取时将它们包装在 Unaligned 中,或者如果它有其他需求,则提供自己的单元结构。请注意,这些类型及其数组仍然是 AsLmdbBytes

遗憾的是,由于上述原因,Wrapping<u8>Wrapping<i8> 已不再是 LmdbRawLmdbOrdKey,而是仅 LmdbRawIfUnalignedLmdbOrdKeyIfUnaligned。在这些中包装 Unalinged 在大多数情况下将无需开销。

贡献

除非你明确声明,否则任何有意提交以包含在你工作的贡献,如 Apache-2.0 许可证中定义的,应如上双许可,不得附加任何额外条款或条件。

依赖项

~655KB
~16K SLoC