#lmdb #b-tree #zero-copy

ord-lmdb-zero

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

1 个不稳定版本

使用旧的Rust 2015

0.4.5 2022年3月12日

#1611数据库接口

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的不安全规则实际上定义了,那么它是合理的。

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

变更日志

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

0.4.3:修复在Cursor::get_multiple()上发生panic的问题,如果当前键恰好有一个条目。现在从crate根重新导出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.2: ResetTransaction 现在实际上是公共的,这使得 API 的这部分更容易访问。添加了关于生命周期的文档。

0.2.1: 修复了将数据库名称传递给 mdb_dbi_open 时发生的 use-after-free 错误。修复了事务提交失败后调用 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 错误清晰地分开。现在 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许可证中定义的,都应按上述方式双许可,不得附加任何其他条款或条件。

依赖关系

~700KB
~17K SLoC