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)
8MB
192K SLoC
Rusqlcipher
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
本作品基于rusqlite
和SQLCipher
。此包已预编译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 的各种类型的FromSql
和ToSql
。serde_json
实现了来自serde_json
crate 的Value
类型的FromSql
和ToSql
。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-config 和 vcpkg 的构建助手有一些额外的配置选项。使用 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文件。