5个版本 (重大变更)

0.5.0 2022年5月9日
0.4.0 2022年4月22日
0.3.0 2022年4月8日
0.2.0 2022年4月6日
0.1.0 2022年4月1日

#1287数据库接口

每月21次 下载

AGPL-3.0-or-later

50KB
1K SLoC

binlog

Test crates.io API docs

一个用于创建和管理任意二进制数据日志的Rust库。目前用于收集传感器数据。但它在需要以几乎(但不严格)追加方式存储时序数据的情况下应该很有用。

日志的底层存储可以通过一些特性进行插件化。Binlog通过sqlite、redis和内存内置实现。

用法

从Rust

一个小示例

use binlog::{Entry, Error, Range, RangeableStore, SqliteStore, Store};
use std::borrow::Cow;
use string_cache::Atom;

/// Demonstrates the sqlite store, with results in `example.db`. You may want to delete that before
/// running this to see the results of this on an empty database.
fn main() -> Result<(), Error> {
    // Create a new datastore with sqlite backing. The result will be stored in example.db, with
    // default compression options. In-memory is also possible via
    // `binlog::MemoryStore::default()`.
    let store = SqliteStore::new("example.db", None)?;

    // Add 10 entries.
    for i in 1..11u8 {
        let entry = Entry::new_with_timestamp(i as i64, Atom::from("sqlite_example"), vec![i]);
        store.push(Cow::Owned(entry))?;
    }

    // Queries are done via `range`. Here we grab entries with any timestamp and any name.
    let range = store.range(.., Option::<String>::None)?;
    // Count the number of entries.
    println!("initial count: {}", range.count()?);
    // We can also iterate on the entries.
    for entry in range.iter()? {
        println!("entry: {:?}", entry?);
    }

    // Remove the entries with 4 <= ts <= 6 and with the name `sqlite_example`.
    store.range(4..=6, Some(Atom::from("sqlite_example")))?.remove()?;

    // Now get the range of entries with 5 <= ts and with the name `sqlite_example`.
    let range = store.range(5.., Some(Atom::from("sqlite_example")))?;
    println!("count after range deletion: {}", range.count()?);
    for entry in range.iter()? {
        println!("entry: {:?}", entry?);
    }

    Ok(())
}

从Python

一个小示例

from binlog import binlog
store = binlog.SqliteStore("example.db")
store.push(binlog.Entry(1, "pytest_push", [1, 2, 3]))

存储

存储实现了Store特性,以及零个或多个可选扩展,具体取决于它们支持的功能。一些存储实现内置到binlog

仅内存

仅内存存储没有持久性手段,但提供了完整的日志功能。这也可以用于对其他实现进行模糊测试。

Redis

Redis实现可以通过redis-store功能启用。底层使用redis流。它支持订阅,但不支持范围。

Sqlite

Sqlite实现可以通过sqlite-store功能启用。它支持范围,但不支持订阅。

测试

单元测试

可以通过make test运行测试。这也会在CI中运行。

基准测试

可以通过make bench运行基准测试。

模糊测试

有一个模糊测试工具,确保sqlite和内存数据存储操作相同。通过make fuzz运行它。

检查

可以通过make check运行代码检查和格式化检查。CI中也会运行等效的检查。

依赖

~0.5–14MB
~185K SLoC