#macro #framework #debugging

light-magic

轻量级、快速且易于使用的持久内存数据库实现

10 个版本 (5 个破坏性更新)

0.6.0 2024 年 7 月 23 日
0.5.4 2024 年 6 月 26 日
0.4.0 2024 年 6 月 15 日
0.3.3 2024 年 6 月 8 日
0.1.0 2024 年 5 月 27 日

#406异步

Download history 150/week @ 2024-05-25 309/week @ 2024-06-01 254/week @ 2024-06-08 711/week @ 2024-06-15 201/week @ 2024-06-22 9/week @ 2024-06-29 107/week @ 2024-07-20 15/week @ 2024-07-27

每月 122 次下载

MIT 许可证

19KB
280

light-magic

crates.io crates.io docs.rs

轻量级、快速且易于使用的 持久 内存数据库 实现。

功能

请注意,此数据库针对读取操作进行了高度优化。使用 open 时写入数据库相对较慢,因为每个写入操作都涉及将数据写入磁盘。这些写入是原子性的,确保系统崩溃时不会丢失数据。

  • 持久数据存储:数据可以通过 open 自动且持久地保存到格式化的 JSON 文件中,或者可以通过 open_in_memory 在内存中操作。
  • 易于表格标记:利用 Rust 优美的类型系统、结构和特性。
  • 强大的数据访问函数:利用 searchjoin! 宏等函数进行高效的数据搜索和连接。
  • 高效存储:数据库使用自定义的 Table 数据类型,底层使用 std::collections 中的 BTreeMap 类型,以实现高效的存储和易于访问的表。
  • 并行访问支持:使用 Arc<AtomicDatabase<_>> 并行访问数据库。

...还有更多。查看 待办事项 了解更多计划中的功能!

安装

将此内容添加到您的 Cargo.toml

[dependencies]
light_magic = "0.5.4"

示例

axum 服务器中使用?请查看:[maud-magic-rs](https://github.com/nwrenger/maud-magic-rs)。否则,查看此通用示例

use light_magic::{
    atomic::DataStore,
    join,
    serde::{Deserialize, Serialize},
    table::{PrimaryKey, Table},
};

#[derive(Default, Debug, Serialize, Deserialize)]
struct Database {
    user: Table<User>,
    permission: Table<Permission>,
    criminal: Table<Criminal>,
    settings: Settings,
}

impl DataStore for Database {}

#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)]
struct User {
    id: usize,
    name: String,
    kind: String,
}

impl PrimaryKey for User {
    type PrimaryKeyType = usize;

    fn primary_key(&self) -> &Self::PrimaryKeyType {
        &self.id
    }
}

#[derive(Default, Debug, Clone, Serialize, Deserialize)]
struct Permission {
    user_name: String,
    level: Level,
}

impl PrimaryKey for Permission {
    type PrimaryKeyType = String;

    fn primary_key(&self) -> &Self::PrimaryKeyType {
        &self.user_name
    }
}

#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)]
enum Level {
    #[default]
    Admin,
}

#[derive(Default, Debug, Clone, Serialize, Deserialize)]
struct Criminal {
    user_name: String,
    entry: String,
}

impl PrimaryKey for Criminal {
    type PrimaryKeyType = String;

    fn primary_key(&self) -> &Self::PrimaryKeyType {
        &self.user_name
    }
}

#[derive(Default, Debug, Clone, Serialize, Deserialize, PartialEq)]
struct Settings {
    time: usize,
    password: String,
}

fn main() {
    let db = Database::open("./tests/test.json");

     db.write().user.add(User {
        id: 0,
        name: String::from("Nils"),
        kind: String::from("Young"),
    });
    println!("{:?}", db.read().user.get(&0));
    println!("{:?}", db.read().user.search(|user| { user.name.contains("Nils") }));

    db.write().permission.add(Permission {
        user_name: String::from("Nils"),
        level: Level::Admin,
    });
    println!("{:?}", db.read().permission.get(&String::from("Nils")));
    println!("{:?}", db.read().permission.search(|permission| { permission.level == Level::Admin }));

    db.write().criminal.add(Criminal {
        user_name: String::from("Nils"),
        entry: String::from("No records until this day! Keep ur eyes pealed!"),
    });
    println!("{:?}", db.read().criminal.get(&String::from("Nils")));
    println!("{:?}", db.read().criminal.search(|criminal| { criminal.entry.contains("No records") }));

    db.write().settings = Settings {
        time: 1718744090,
        password: String::from("password"),
    };
    println!("{:?}", db.read().settings);

    let joined = join!(db.read(), "Nils", user => name, permission => user_name, criminal => user_name);
    println!("{:?}", joined);
}

待办事项

目前无

依赖项

~1.6–2.6MB
~52K SLoC