27次发布
0.8.1 | 2024年5月28日 |
---|---|
0.7.4 | 2023年9月14日 |
0.7.0 | 2023年7月16日 |
0.6.0 | 2023年3月5日 |
0.5.0 | 2022年11月4日 |
#147 在 数据库接口
每月170次下载
71KB
1.5K SLoC
Airone
Airone是一个Rust库,提供简单的内存数据库,更新时写入到追加事务文件中,灵感来自Aral Balkan的JSDB。
简而言之,它充当一个Vec<T>
,但任何更改都会自动快速保存到文件中。
名称与“空气”或“一”无关,它仅来自意大利语单词“Airone”,意为“鹳”。因此,它必须按照[aiˈrone]
来读。
- 保存过程快
- 将所有数据保存在内存中以快速读取
此库将内存中的结构体列表持久化到磁盘。内存中数据的任何更改都会以快速的方式自动保存到磁盘,避免完整导出整个列表。
AironeDb对象类似于结构体的简单数组,但它们会自动在后台将任何更改保存到磁盘。以下是一个示例
let mut my_airone_array = AironeDb::<MyStruct>::new().unwrap();
my_airone_array.push( // <-- This command
MyStruct{field1: 5} // saves the new data to disk
); // automatically
my_airone_array
.get_mut(0).unwrap() // <-- Get a mutable proxy
// to the element at index 0
.set_field1(10); // <-- A setter method is generated automatically.
// The change is persisted to file.
println!("{}",
my_airone_array[0].field1 // you can access it by index
);
Rust到C库桥已被移除,改为纯C库版本,它更小,简化了procmacro的可维护性,并更容易将其包含在任何兼容C的项目中。您可以在https://gitlab.com/MassiminoilTrace/airone_c找到它。
使用场景
Airone是为以下所有适用情况开发的
- 无大数据:整个数据集应适合内存
- 数据集必须持久化到磁盘
- 在修改一些数据后,更改需要以快速的方式写入磁盘
- 我们可以减慢程序启动时间,而不会产生任何相关影响
- 无嵌套对象
以下是两个良好的使用场景示例
- 小型Web服务器:数据可能会快速更改,并且完全可以适应内存。启动可能较慢,只要服务器在运行时性能良好。我提供了一个使用airone和Rocket服务器的外部模板
- 一个离线GUI/TUI程序:由于Airone的只追加文件架构,您可以非常快速地存储数据修改,因此在保存过程中的界面冻结几乎不易察觉。这是一个非常基本的模板,它将Airone与Gtk3结合在一起。
这些限制对于某些使用场景可能是一个问题。现有的数据库添加了各种优化、缓存机制,并且非常复杂,以便能够处理如此大量的数据。
然而,当上述前提条件适用时,我们可以利用这些限制来简化源代码,使其更容易维护,并消除所有冗余软件。此外,限制对象嵌套使其与CSV风格文件兼容,确保您可以使用标准UNIX工具(如grep
和awk
)操作数据。
上下文
Airone旨在帮助小技术的生产,这是一种与硅谷模式相反的技术构建方式。小技术具有接近零的数据收集、免费和开源的结构,以实现良好的透明度,没有指数级扩展的渴望,没有在处理大量数据时跟踪人们行为的欲望,总的来说,它有一个目标是保持简单和人性化。
文档
最基本的使用示例如下
use airone::prelude::*;
#[derive(AironeDbDerive)]
struct Foo
{
pub field1: f64,
pub field2: String,
field3: Option<i32>
}
从这一点开始,您可以与类型为Foo的数据Vec进行交互,并自动将任何更改持久化到文件。
let mut db: AironeDb<Foo> = AironeDb::new()?;
// Add an element
db.push(
struct Foo{field1: 0.0, field2: "Abc".to_string(), field3: None}
);
db.get(0); // <-- returns a read only Option<&Foo>
let m = db.get_mut(0).unwrap() // <-- returns a convenient
.set_field1(0.5); // writable wrapper of Foo
// in an Option<T>
// Remove element at index 0
db.remove(0);
有关完整的使用说明和实现细节,请访问官方文档。
版权
这不是公有领域,请确保尊重许可条款。您可以在COPYING文件中找到许可文本。
版权 © 2022,2023,2024 Massimo Gismondi
本程序是免费软件:您可以在GNU Affero通用公共许可证的条款下重新分发和/或修改它,该许可证由自由软件基金会发布,无论是许可证的第3版,还是(根据您的选择)任何后续版本。
本程序的分发是希望它将是有用的,但没有任何保证;甚至没有关于其可销售性或适用于特定目的的暗示保证。有关详细信息,请参阅GNU通用公共许可证。
您应该已收到GNU Affero通用公共许可证的副本。如果没有,请参阅https://www.gnu.org/licenses/。
在此项目中使用的外部库
本项目使用了一些外部库,如Cargo.toml
文件中所述。
- AGPL-3.0-or-later: airone_derive
- MIT / Apache-2.0: proc-macro2, quote, syn
- (MIT / Apache-2.0) AND Unicode-DFS-2016: unicode-ident
本项目使用的是您可以在COPYING文件中找到的许可证。
依赖关系
~265–720KB
~17K SLoC