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次 下载
50KB
1K SLoC
binlog
一个用于创建和管理任意二进制数据日志的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