berkeley-db - 将 Rust 与 Berkeley DB 连接起来

标签 berkeley-db ffi rust

我有一个现有的 C++ 程序,它使用 Berkeley DB 作为存储后端。我想用 Rust 重写它。有没有办法在 Rust 中编写外部函数接口(interface)以使用 Berkeley DB?我找到了教程 Rust Foreign Function Interface , 但对于 BDB 中使用的复杂 C 结构来说,这个例子似乎太简单了;例如,打开一个数据库 我需要声明一个 DB 结构并调用 DB->open()。但是我不知道如何使用教程中显示的示例来执行此操作。

有人可以帮忙吗?

最佳答案

好吧,通过查看 BDB 的 C API,我发现它由 C 结构组成,元素指针指向函数。教程中没有解释(这很奇怪),但 Rust 目前支持 pointers to foreign functions . Rust reference manual中也提到了它.

您可以大致根据 db.h 中定义的结构创建所有必需的结构,并且由于 Rust 和 C 结构内存布局相同,您可以将这些结构传入/传出库并期望正确的指针出现在它们中。

例如,您的 DB->open() 调用可能如下所示:

struct DB {
    open: extern "C" fn()
}

let db = ...  // Get DB from somewhere
(db.open)()   // Parentheses around db.open are needed to disambiguate field access

然而,这确实应该包装在某种基于 impl 的接口(interface)中,因为调用外部函数是不安全的操作,并且您不希望您的用户将 unsafe 围绕所有数据库交互。

关于berkeley-db - 将 Rust 与 Berkeley DB 连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18094976/

相关文章:

java - 在 Berkeley DB JE 中进行比较和交换?

java - 编程决定 java 或 .Net,db 或无 db

php - 你如何将 Rust 中的整数转换为 C 中的 char*

performance - 从 Haskell 中的 monadic 流中榨取更多性能

windows - 尝试在 Windows 上编译时出错

rust - Option<&T> 如何实现复制

c - 非法标志在使用 C 的 berkeley DB 中指定错误

c - 将值传递给 C 中的函数

java - Hello hello prolog 和 weka 集成

rust - 如何在 Rust 中比较切片和向量?