1 个不稳定版本
使用旧的Rust 2015
0.4.5 | 2022年3月12日 |
---|
#1611 在 数据库接口
250KB
2.5K SLoC
lmdb-zero
lmdb-zero是一个近乎零成本的LMDB包装器,旨在允许使用LMDB提供的全部功能,同时使其编写安全程序变得相对容易。
lmdb-zero
尽可能地与原始API 1:1映射,主要提供RAII构造和集成到Rust的借用检查器中以确保安全性。
特性
-
零拷贝API。读取返回内存映射文件的引用。支持使用
MDB_RESERVE
在文件中分配空间并直接写入。 -
游标直接映射到LMDB提供的相同操作,但以类型安全的方式。
-
嵌套事务。
-
与借用检查器的完全集成。读取引用会被检查,以确保它们不会超出它们的交易或与同一交易中的写入重叠。
-
游标和读取事务可以被重置和重用。
状态
API是完整且相当稳定的,并且相信只要Rust的不安全规则实际上定义了,那么它是合理的。
尽管在ARM7上测试通过,但这个crate尚未在具有强对齐约束的架构上彻底测试。虽然转换API默认检查正确的对齐,但可能会出现类似#27060的问题,并且当然可能在这里处理对齐时存在错误。
变更日志
0.4.4:新增Environment
和Database
方法,以启用与原生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: 出现了一些小的破坏性变更。现在可以丢弃并重新获取 ConstAccessor
和 WriteAccessor
。大多数类型现在支持额外的所有权和借用模式,这允许动态生命周期管理和其他可能性。升级到 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, ...)
。
ConstAccessor
和 WriteAccessor
必须现在严格地超出其事务的生命周期。目前没有明显的实际案例表明这会造成问题,但如果出现这种情况,代码必须重新排列以确保在事务之前丢弃访问器。请注意,现在可以丢弃访问器并在以后重新获取它。
0.3.0 中的破坏性变更
lmdb::Error
已完全重做。现在它是一个枚举,其中 lmdb-zero 错误与原生 LMDB 错误清晰地分开。现在 ValRejected
包含一个错误消息。
FromLmdbBytes.from_lmdb_bytes()
现在返回一个Result<&Self, String>
,而不是一个Option
。这主要是为了让对齐问题更加明显,并直接指向解决问题的建议,但也可能使其他事情更清晰。
大部分未经过测试且有些可疑的lax_alignment
功能已被删除。LmdbRaw
现在始终强制执行对齐要求。希望对未对齐的值进行操作(不能使用Unaligned
或#[repr(packed)]
解决方案)的客户端代码需要提供自己的FromLmdbBytes
实现。
具有对齐要求的原始类型(例如,i32
、u64
)不再是LmdbRaw
,因为这使编写依赖于意外正确对齐值的代码变得过于容易。客户端代码现在必须将它们包裹在Unaligned
中以直接读取,或者如果它有其他需求,则需要提供自己的单元结构。请注意,这些类型及其数组仍然是AsLmdbBytes
。
不幸的是,由于上述原因,Wrapping<u8>
和Wrapping<i8>
不再是LmdbRaw
或LmdbOrdKey
,而是只有LmdbRawIfUnaligned
和LmdbOrdKeyIfUnaligned
。在大多数情况下,将这些值包裹在Unalinged
中不会产生开销。
贡献
除非你明确表示,否则任何有意提交以供你包含在作品中的贡献,如Apache-2.0许可证中定义的,都应按上述方式双许可,不得附加任何其他条款或条件。
依赖关系
~700KB
~17K SLoC