#db #database-server #library #database-client #read-write #access-key

smol_db_common

用于在需要使用 smol_db 的包之间共享的通用库

8 个稳定版本

1.5.0-beta.12024年4月17日
1.5.0-beta.02024年4月16日
1.4.0 2024年1月26日
1.3.1 2023年10月19日
1.2.1 2023年8月26日

#941数据库接口


3 个 Crates 中使用 (2 直接使用)

GPL-3.0-only

99KB
2K SLoC

Image of program, small fat cat laying on a server computer

程序艺术由 Crisis 制作。

smol_db

为小型数据库设计的数据库客户端和服务器,只需快速设置和删除,读取和写入。这个数据库的目的是在适用的情况下在我的其他项目中使用,使其尽可能容易使用。数据库的结构很简单,就是一个哈希表。

该项目由 4 个子项目组成

  • smol_db_server:一个等待连接的服务器程序,在端口 8222 上提供服务。它还处理运行数据库所需的文件。
  • smol_db_client:一个库,可以用来与服务器程序接口。
  • smol_db_common:一个库,用于运行服务器。如果 smol_db_server 不够用,这个库包含了构建处理请求并处理它们的服务器所需的一切。
  • smol_db_viewer:一个示例程序,允许用户连接到 smol_db_server。程序可以连接、查看、创建、删除、读取和写入给定服务器上的数据库。
  • smol_db_dylib:一个 FFI 库(WIP),可以用作与 smol_db_server 的接口。

目前使用此数据库的程序

  • cr_tiler_rs 使用此数据库存储游戏服务的排行榜信息。
  • 如果您使用此数据库,请随时告诉我,我很乐意知道! :)

使用 smol_db 的原因

  • 您想使用更简洁的数据库程序
  • 您就是我,喜欢使用自己制作的软件
  • 您想使用一个没有特定绑定到操作系统服务的数据库程序,并且具有最小的设置要求
  • 您想为仓库做出贡献
  • 您认为程序艺术很可爱。 Crisis

显著特性

  • 设置服务器和其中的数据库都很容易(无需处理奇怪的路径问题或其他常见烦恼)
  • 简单的客户端库,易于程序集成
  • 大部分容易阅读的代码,便于添加其他功能
  • 用于快速查看/编辑数据库概览的客户端
  • 可选RSA-2048位数据包加密
  • 在与客户端交互后,数据库存储在内存中一段时间

安全性

smol_db并非设计成极其安全,大部分的使用场景存在于局域网中,那里安全需求不是那么必要。

尽管程序提供了可选的数据包加密,但我仍不建议将此程序用于任何高安全性的应用。

如果我有任何关于提高安全性的想法,我会在有时间时逐渐实现它们。访问密钥不以哈希或加密格式存储,因此不应假定存储时安全或可靠。

示例Docker-Compose条目

db:
    build: https://github.com/CoryRobertson/smol_db.git#main
    image: smol_db_server
    ports:
      - "8222:8222"
    container_name: "smol_db_server_instance1"
    restart: unless-stopped
    volumes:
      - "./smol_db:/data"

设置

要创建smol_db_server实例,可以使用上面的docker compose示例,或者从源代码构建服务器包并在服务器计算机上运行。在裸机或Docker容器上创建服务器实例后,只需使用smol_db_client库或通过smol_db_viewer连接到它。下面的图片展示了smol_db_viewer的外观和可用的屏幕。

客户端库示例用法

use smol_db_client::SmolDbClient;
fn main() {
    // server is assumed to be running on localhost on port 8222
    let mut client = SmolDbClient::new("localhost:8222").unwrap();
    let data = "super cool user data";
    
    let _ = client.set_access_key("readme_db_key".to_string()).unwrap();
    let _ = client.create_db("cool_db_name", DBSettings::default()).unwrap();
    let _ = client.write_db("cool_db_name", "cool_data_location", data).unwrap();

    match client.read_db("cool_db_name","cool_data_location") {
        SuccessReply(response_data) => {
            assert_eq!(&response_data, data);
        }
        SuccessNoData => {
            assert!(false);
        }
    }
}

图片

连接

Image of connecting to a database using the viewing application

设置客户端访问密钥

Image of setting the key of the client in the viewing application

创建数据库

Image of creating a database using the viewing application

查看数据库中的数据,并在数据库中编辑数据

Image of viewing the data on the database, and also writing to it, using the viewing application

更改数据库的设置

Image of changing the database settings using the viewing application

依赖项

~8MB
~146K SLoC