Skip to content

Rust 嵌入式 API

打开 Engine

rust
use unionid::Engine;

let mut memory = Engine::memory();
let mut durable = Engine::open_redb("data/app.redb")?;
let mut read_only = Engine::open_redb_read_only("data/app.redb")?;

Engine 是本地 API、CLI 和服务的共享入口。每次 execute 是原子脚本;生产应用应检查 QueryResponse.error,而不是只读取 rows。

Prepared 参数与 serde

rust
use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use unionid::{Engine, Value};

#[derive(Serialize, Deserialize)]
enum State {
    Pending,
    Running { worker: String, attempt: i64 },
}

#[derive(Serialize, Deserialize)]
struct Task {
    id: i64,
    title: String,
    state: State,
}

let mut db = Engine::open_redb("data/app.redb")?;
let task = Task {
    id: 1,
    title: "ship docs".into(),
    state: State::Pending,
};
let prepared = db.prepare("insert tasks $row\nreturning")?;
let response = db.execute_prepared(
    &prepared,
    BTreeMap::from([("row".into(), Value::from_serde(&task)?)]),
);
let rows: Vec<Task> = response.typed_rows()?;

Rust struct/enum/Option/tuple/Vec 与命名 ADT 对应,内部 nominal ID 不泄漏到 serde representation。不要手工拼接用户输入;prepared binding 会在扫描前确定完整参数类型。

生产标量

使用 unionid::scalars::{Uuid, Bytes, Date, Timestamp, Duration, Decimal} 保留类型身份。protocol v2 才能无损携带这些标量;decimal 解析时必须提供 precision/scale。

并发服务

ConcurrentEngine 提供最多 8 个一致并发读快照,读在 writer lock 外执行,写入与 maintenance 串行。使用 deadline、shutdown 和指标观察 active/queued read/write;不要在 observer callback 中做阻塞工作。

应用数据边界

将需要恢复的摘要与正文都持久化。一次数据库请求内提交业务数据和应用 revision,成功后再更新内存状态。schema revision、maintenance sequence、cursor 与业务 revision 是不同身份。数据库不负责缓存失效、WebSocket、订阅或用户鉴权。

Last updated:

Released under the MIT License.