10个版本

使用旧的Rust 2015

0.9.0 2018年5月2日
0.8.9 2018年5月2日
0.8.6 2017年11月14日
0.8.1 2017年10月26日

#1793 in 数据库接口


2 个crate中使用 (via rusqlcipher)

MIT 许可证

8MB
192K SLoC

C 174K SLoC // 0.1% comments Rust 18K SLoC // 0.0% comments

Rusqlcipher

Travis Build Status AppVeyor Build Status dependency status Latest Version

Rusqlcipher是使用SQLCipher的Rust的便捷包装器。它试图提供一个类似于rust-postgres的接口。查看完整的API文档

extern crate rusqlcipher;
extern crate time;

use time::Timespec;
use rusqlcipher::Connection;

#[derive(Debug)]
struct Person {
    id: i32,
    name: String,
    time_created: Timespec,
    data: Option<Vec<u8>>
}

fn main() {
    let conn = Connection::open_in_memory().unwrap();

    conn.execute("CREATE TABLE person (
                  id              INTEGER PRIMARY KEY,
                  name            TEXT NOT NULL,
                  time_created    TEXT NOT NULL,
                  data            BLOB
                  )", &[]).unwrap();
    let me = Person {
        id: 0,
        name: "Steven".to_string(),
        time_created: time::get_time(),
        data: None
    };
    conn.execute("INSERT INTO person (name, time_created, data)
                  VALUES (?1, ?2, ?3)",
                 &[&me.name, &me.time_created, &me.data]).unwrap();

    let mut stmt = conn.prepare("SELECT id, name, time_created, data FROM person").unwrap();
    let person_iter = stmt.query_map(&[], |row| {
        Person {
            id: row.get(0),
            name: row.get(1),
            time_created: row.get(2),
            data: row.get(3)
        }
    }).unwrap();

    for person in person_iter {
        println!("Found person {:?}", person.unwrap());
    }
}

SQLCipher

本作品基于rusqliteSQLCipher。此包已预编译SQLCipher以使用OpenSSL 1.1.0或更高版本,并替换了libsqlcipher-sys/sqlite3/中的以下三个文件:sqlite3.c,sqlite3.h,sqlite3ext.h。有关编译openssl的信息,请参阅openssl-sys。SQLCipher已修改为使用HMAC-SHA256而不是默认的HMAC-SHA1。

支持的SQLite版本

基础rusqlcipher包支持SQLite 3.6.8或更高版本。如果您需要支持较旧版本,请提交问题。一些Cargo功能需要较新的SQLite版本;请参阅下面的详细信息。

可选功能

Rusqlite提供了一些位于Cargo功能之后的功能。它们是

  • load_extension 允许加载基于动态库的SQLite3扩展。
  • backup 允许使用SQLite的在线备份API。注意:此功能需要SQLite 3.6.11或更高版本。
  • functions 允许您将Rust闭包加载到SQLite连接中以在查询中使用。注意:此功能需要SQLite 3.7.3或更高版本。
  • trace 允许挂钩到SQLite的跟踪和性能分析API。注意:此功能需要SQLite 3.6.23或更高版本。
  • blob 提供了 std::io::{Read, Write, Seek} 对 SQL BLOB 的访问。注意:此功能需要 SQLite 3.7.4 或更高版本。
  • limits 允许您设置和检索 SQLite 每个连接的限制。
  • chrono 实现了来自 chrono crate 的各种类型的 FromSqlToSql
  • serde_json 实现了来自 serde_json crateValue 类型的 FromSqlToSql
  • bundled 使用捆绑版本的 sqlite3。对于链接到 sqlite3 比较复杂的情况,如 Windows,这是一个不错的选择。
  • sqlcipher 寻找 SQLCipher 库进行链接,而不是 SQLite。此功能与 bundled 是互斥的。

关于构建 rusqlcipher 和 libsqlcipher-sys 的说明

libsqlcipher-sys 是一个独立的 crate,它为 SQLite 的 C API 提供了 Rust 声明。默认情况下,libsqlcipher-sys 尝试使用 pkg-config 在您的系统上查找已存在的 SQLite 库,或者对于 MSVC ABI 构建使用 Vcpkg 安装。 rusqlcipher 还依赖于 OpenSSL 1.1.0 或更高版本。

您可以通过多种方式调整此行为

  • 如果您使用 bundled 功能,libsqlcipher-sys 将使用 gcc crate 从源代码编译 SQLite 并链接到它。此源代码嵌入在 libsqlcipher-sys crate 中,目前是 SQLite 3.15.2(截至 rusqlcipher 0.10.1 / libsqlcipher-sys 0.7.1)。这可能是解决构建问题的最简单方法。您可以在 Cargo.toml 文件中添加以下内容来启用此功能
    [dependencies.rusqlcipher]
    version = "0.11.0"
    features = ["bundled"]
    
  • 您可以将 SQLITE3_LIB_DIR 设置为指向包含 SQLite 库的目录。
  • 安装 sqlite3 开发包通常就足够了,但 pkg-configvcpkg 的构建助手有一些额外的配置选项。使用 vcpkg 的默认情况下是动态链接。vcpkg install sqlite3:x64-windows 将安装所需的库。

绑定生成

我们使用 bindgen 从 SQLite 的 C 头文件生成 Rust 声明。 bindgen 建议 将此作为使用此库的库的构建过程的一部分运行。我们尝试过这样做(rusqlcipher 0.10.0,具体来说),但它有一些不便之处

  • libsqlcipher-sys(以及因此 rusqlcipher)的构建时间显著增加。
  • 运行 bindgen 需要 Clang 的相对较新版本,而许多系统默认没有安装。
  • 运行 bindgen 还需要 SQLite 头文件存在。

截至 rusqlcipher 0.1.0,我们通过提供SQLite多个版本的预生成绑定来避免在构建时运行 bindgen。在编译 rusqlcipher 时,我们使用您选择的Cargo功能来选择支持您所选择功能的最低SQLite版本。如果您直接使用 libsqlcipher-sys,您可以使用相同的特性来选择所需的预生成绑定

  • min_sqlite_version_3_6_8 - SQLite 3.6.8绑定(这是默认值)
  • min_sqlite_version_3_6_11 - SQLite 3.6.11绑定
  • min_sqlite_version_3_6_23 - SQLite 3.6.23绑定
  • min_sqlite_version_3_7_3 - SQLite 3.7.3绑定
  • min_sqlite_version_3_7_4 - SQLite 3.7.4绑定

如果您使用 bundled 功能,您将获得SQLite捆绑版本的预生成绑定。如果您需要其他特定版本的预生成绑定,请提交一个问题。如果您想在构建时运行 bindgen 来生成自己的绑定,请使用 buildtime_bindgen Cargo功能。

作者

Michael Lodder,[email protected]

原始作者

John Gallagher,[email protected]

许可证

Rusqlcipher可在Apache Version 2许可证下使用。有关更多信息,请参阅LICENSE文件。Rusqlite可在MIT许可证下使用。有关更多信息,请参阅ORIGLICENSE文件。

依赖项