LumiDB 是一个简单的内存型数据库,支持特殊的查询 DSL 操作数据库,提供交互式命令行工具,支持动态链接库的插件拓展系统功能以完成需求。
本项目采用 CMake 构建系统,使用 Acutest 测试框架进行单元测试。
编译器需要支持 C++17 标准。
安装 Cmake 和 Clang++ 或 g++
mkdir -p build
cd build
cmake ..
make -j
make test
构建产物
build/lumidb
: LumiDB 命令行工具build/src/plugins/liblumidb-timer-plugin.so
: LumiDB 插件
需要安装 Visual Studio 2022 生成工具,勾选安装 Clang++.
打开 VS2022 Developer Command Prompt
mkdir -p build
cd build
cmake ..
make -j
编译产物位于 build/
文件夹,本压缩包也提供了预编译好的二进制文件,位于 binaries/
文件夹
由于我没有 Windows 环境,这里只提供了在 Ubuntu 22.04 上编译好的二进制文件。
直接运行 ./build/lumidb
即可进入 LumiDB 命令行工具。
- 数据库以及表的增删改查
- 支持 REPL,补全与语法高亮
- 支持 Query 语言,组合函数进行查询
- 支持注册自定义函数
- 支持插件
-
录入成绩
成绩录入分为两个步骤
首先,通过
create_table
与add_field
命令建表create_table("stu") | add_field("姓名", "string") | add_field("语文", "float?") | add_field("数学", "float?") | add_field("英语", "float?")
之后,通过
insert
命令插入数据,或者通过load_csv
命令从 CSV 文件中读取数据insert("stu") | add_row("张三", 80, 81, 85) insert("stu") | load_csv("./datas/students.csv")
-
查询成绩 - 查询科目最高分、最低分
使用聚合函数
max
和min
query("stu") | max("语文", "数学", "英语") query("stu") | min("语文", "数学", "英语")
-
查询成绩 - 以各科成绩对同学排序
使用函数
sort
query("stu") | sort("数学") | select("姓名", "数学")
-
查询成绩 - 各科目平均分
使用聚合函数
avg
query("stu") | avg("语文", "数学", "英语")
-
修改成绩
组合使用
update
,where
,set_value
修改姓名为 王五 的数学成绩为 60,英语成绩为 70
update("stu") | where("姓名", "=", "王五") | set_value("数学", 60) | set_value("英语", 70)
-
加载、卸载插件
使用
load_plugin
加载插件,unload_plugin
卸载插件,show_plugins
展示已加载插件列表load_plugin("./build/src/plugins/liblumi-timer-plugin.so") show_plugins
查看插件创建的函数
show_functions | where('type', '=', 'root') | limit(5)
插件注册了
find_missing_values
,add_timer
等函数 -
查询分数缺省的数据
使用函数
find_missing_values
find_missing_values("stu", "语文")
-
注册定时任务
使用函数
add_timer
,remove_timer
,show_timers
add_timer(time, query)
: 添加定时任务 第一个参数接收时间字符串,指定多少秒执行一次,第二个参数接收具体执行的命令remove_timer(id)
: 删除定时任务show_timers
: 展示所有的定时任务
add_timer("10s", "query('stu') | sort('姓名')")
等待 10s 后,任务执行
-
卸载插件
unload_plugin("1")
测试包括单元测试和集成测试
单元测试见 test/
集成测试见 e2e/
运行单元测试
make build-test
运行集成测试
make e2e
本系统的设计架构,实现细节,查询语句详细语法请参考 DESIGN.md。
使用的第三方库的相关文件已被包含在项目源代码文件中,位于 third-party/,不需要额外进行安装。
第三方库不包含关键业务逻辑的实现,只是一些辅助代码方便使用,比如命令行参数的解析,字符串的格式化,异常栈的打印。
- acutest: 单元测试
- fmtlib: 字符串格式化
- argumentum: 命令行参数解析
- backward-cpp: 异常栈帧打印
- tabulate: 表格格式化输出
- isocline: 跨平台版 readline