Skip to content

Commit

Permalink
发布版本 v0.1_alpha (#24)
Browse files Browse the repository at this point in the history
* [+]增加记录接口的Mock (#1)

* 增加错误基类、简单的记录接口

* 增加.gitignore

* 完成记录的mock

* 增加记录接口的简易单元测试

* [+]增加表管理mock、更新部分配置 (#3)

* 增加错误基类、简单的记录接口

* 增加.gitignore

* 完成记录的mock

* 增加记录接口的简易单元测试

* 引入Slf4j、log4j、jbbp外部库

* [+]add table mock and unit test

* 增加Travis配置

* fix: transform java14 to java11

* 更新Gradle配置以允许Scan ToS

* 删除冗余Travis配置

* README增加Travis Badge

Co-authored-by: Kevin Axel Manjaro <kevinaxel@163.com>
Co-authored-by: Kevin Axel <41867249+KveinAxel@users.noreply.github.com>

* [+]完成各模块接口、Mock (#4)

* 增加错误基类、简单的记录接口

* 增加.gitignore

* 完成记录的mock

* 增加记录接口的简易单元测试

* 引入Slf4j、log4j、jbbp外部库

* [+]add table mock and unit test

* 增加Travis配置

* fix: transform java14 to java11

* 更新Gradle配置以允许Scan ToS

* 删除冗余Travis配置

* README增加Travis Badge

* 增加UTF-8 gradle配置

* 对于数据项管理的mock和测试部分

* 修改测试用例的文件名

* index mock

* 增加事务的Mock

* testPage

* index mock plus test

* 对于数据项管理的mock和测试部分的修改

* testPage1.01

* dataitem模块修改建议

* 修正编码风格

* 对于数据项管理的mock和测试部分

* 对于数据项管理的mock和测试部分

* Index审计、修改建议

* 增加JBBP的使用示例

* page模块审计、修改建议

* 删除table模块,更改record模块

* recovery模块审计

* transaction模块审计

* 对于日志恢复的接口和测试

* 完善事务模块接口

* testPage1.02

* testPage1.03

* 复审recovery,tx

* 格式化代码

* 更新README

Co-authored-by: Kevin Axel Manjaro <kevinaxel@163.com>
Co-authored-by: Kevin Axel <41867249+KveinAxel@users.noreply.github.com>
Co-authored-by: xiaoxineryi <529086017@qq.com>
Co-authored-by: DctorWei1314 <61504793+DctorWei1314@users.noreply.github.com>
Co-authored-by: Criterionist <1229089076@qq.com>
Co-authored-by: XuanLaoYee <1115810634@qq.com>

* [M]修正dataitem模块异常命名问题 (#5)

* 修改异常名称

* 修正编译失败

Co-authored-by: xiaoxineryi <529086017@qq.com>

* [M]dataitem、index接口调整,错误基类增加错误原因 (#6)

* 表创建、表头解析以及页头解析

* 索引审计修改

* RumbaseException增加错误原因

Co-authored-by: xiaoxineryi <529086017@qq.com>
Co-authored-by: DctorWei1314 <61504793+DctorWei1314@users.noreply.github.com>

* [M]改进transaction接口 (#7)

* 完善事务模块接口,增加事务模块测试用例

* 修正事务接口

Co-authored-by: Criterionist <1229089076@qq.com>

* [M]修正快照的接口问题 (#8)

* 修正事务接口

Co-authored-by: Criterionist <1229089076@qq.com>

* [+]完成数据项模块 (#9)

* 表创建、表头解析以及页头解析

* 文件创建和插入

* 修正编译问题

* 数据项的插入和查询完成

* 获取整页数据

* 完成头信息添加 以及更新操作

* 数据项增改查以及头部操作完成,添加并发插入测试

* 格式化代码,改进测试用例

* 增大测试用例数据量

Co-authored-by: xiaoxineryi <529086017@qq.com>

* [+]完成记录模块 (#10)

* 记录mvcc初步

* 修正测试用例问题

* 完成可见性判断

* 增加0、0xffffffff为超级事务,视为已提交

* 增加读已提交测试、util测试

* 增加可重复读测试

* 完善回滚错误、改善测试代码覆盖率

* 改进dataitem模块的错误处理

* 修改异常处理和checkUuidExist

* 改进uuid存在性判断逻辑

Co-authored-by: xiaoxineryi <529086017@qq.com>

* [+]完成事务模块 (#11)

* 实现事务管理器和事务上下文,完善测试类

* 完善事务实现

* 完善锁模块

* 改进测试用例

* Record测试用例加入事务相关,修正小bug

Co-authored-by: Criterionist <1229089076@qq.com>

* [+]完成页面管理模块 (#12)

* Completed a prototype

* add notes

* Initially completed

* 增加“页不足时自动添加新的物理页”功能

* 修复内存不足时抛出异常无上层处理情况

* double write

* undo double write

* 增加一些测试用例

* Fix errors when reading and writing files

* 修正测试用例的系列文件路径

* Fix errors when test all files

* 完善测试用例

* 更新travis配置

* 更新travis配置展示test过程

* 延长addlock测试延迟时间

Co-authored-by: XuanLaoYee <1115810634@qq.com>
Co-authored-by: Criterionist <1229089076@qq.com>

* [+]增加索引模块 (#13)

* 增加错误基类、简单的记录接口

* 增加.gitignore

* 完成记录的mock

* 增加记录接口的简易单元测试

* 引入Slf4j、log4j、jbbp外部库

* [+]add table mock and unit test

* 增加Travis配置

* fix: transform java14 to java11

* 更新Gradle配置以允许Scan ToS

* 删除冗余Travis配置

* README增加Travis Badge

* 增加UTF-8 gradle配置

* 对于数据项管理的mock和测试部分

* 修改测试用例的文件名

* index mock

* 增加事务的Mock

* testPage

* index mock plus test

* 对于数据项管理的mock和测试部分的修改

* testPage1.01

* dataitem模块修改建议

* 修正编码风格

* 对于数据项管理的mock和测试部分

* 对于数据项管理的mock和测试部分

* Index审计、修改建议

* 增加JBBP的使用示例

* page模块审计、修改建议

* 删除table模块,更改record模块

* recovery模块审计

* transaction模块审计

* 对于日志恢复的接口和测试

* 完善事务模块接口

* testPage1.02

* testPage1.03

* 复审recovery,tx

* 格式化代码

* 更新README

* 修改异常名称

* 修正编译失败

* 表创建、表头解析以及页头解析

* 索引审计修改

* RumbaseException增加错误原因

* 完善事务模块接口,增加事务模块测试用例

* 修正事务接口

* 修正事务接口

* 测试用例修改

* B+树索引,没有flush,没有锁,用synchronized并发也有小问题

* 改进测试用例

* synchronized修改

* 加了pin和unpin,听从lmx建议取消了root页作为成员

* 加了flush,完善了pin和unpin,添加了相对更为复杂的并发测试,由于mock的限制,flush和pin功能并不能得到良好的保证

* 修正、改进单元测试

* 缩小单元测试规模,解决文件冲突

Co-authored-by: Kevin Axel Manjaro <kevinaxel@163.com>
Co-authored-by: Kevin Axel <41867249+KveinAxel@users.noreply.github.com>
Co-authored-by: xiaoxineryi <529086017@qq.com>
Co-authored-by: DctorWei1314 <61504793+DctorWei1314@users.noreply.github.com>
Co-authored-by: Criterionist <1229089076@qq.com>
Co-authored-by: XuanLaoYee <1115810634@qq.com>

* [+]增加语句解析模块 (#14)

* 完成Select语句的语法树定义

* 完成Insert语句的语法树定义

* 完成Update语句的语法树定义

* 完成Delete语句的语法树定义

* 完成Create table语句的语法树定义

* 完成Create index语句的语法树定义

* 格式化代码

* 完成基本解析框架,实现Insert语句解析

* 实现CreateTable语句解析

* 实现CreateIndex语句解析

* 包移动

* 修正列名获取问题

* 完成表达式求值

* 完成Delete语句解析

* 完成Update语句解析

* 建表语句允许not null

* 完成Select语句解析

* 整理代码

* [+]页管理增加退出时回写 (#15)

* Add flush all files function

* Add test for flushing all files function

* Turn file operations into object attributes

* 修正测试用例重复运行错误

* Revert "Turn file operations into object attributes"

This reverts commit cc827db

* 改进一处日志输出

Co-authored-by: XuanLaoYee <1115810634@qq.com>

* [+]完成表管理模块 (#17)

* 将接口、mock改成普通类

* 将接口、mock改成普通类

* 使用访问者模式替代原先的switch匹配

* 去除visitor, 重构表管理

* 去除visitor, 重构表管理

* 重写jbbp解析方法,增加测试

* 增加表配置信息操作

* 增加表加载测试

* 增加系统表和测试

* 完成Select语句的语法树定义

* 完成Insert语句的语法树定义

* 完成Update语句的语法树定义

* 完成Delete语句的语法树定义

* 完成Create table语句的语法树定义

* 完成Create index语句的语法树定义

* 格式化代码

* 增加空字段,增加field的方法

* 增加query模块

* 更新测试用例的序列化格式

* 修复空值Condition

* 增加创建索引测试

* 更改测试文件路径

* 字符串解析增加单引号

* 增加增删改、创建表的执行测试

* 更改测试路径

* 增加select测试

* 修复delete测试

* 将mock换为RecordManager

* 完成todo/fixme

* 增加获取所有文件路径的api

Co-authored-by: Kevin Axel Manjaro <kevinaxel@163.com>

* [+]实现服务器模块 (#19)

* 将接口、mock改成普通类

* 将接口、mock改成普通类

* 使用访问者模式替代原先的switch匹配

* 去除visitor, 重构表管理

* 去除visitor, 重构表管理

* 重写jbbp解析方法,增加测试

* 增加表配置信息操作

* 增加表加载测试

* 增加系统表和测试

* 完成Select语句的语法树定义

* 完成Insert语句的语法树定义

* 完成Update语句的语法树定义

* 完成Delete语句的语法树定义

* 完成Create table语句的语法树定义

* 完成Create index语句的语法树定义

* 格式化代码

* 增加空字段,增加field的方法

* 增加query模块

* 更新测试用例的序列化格式

* 修复空值Condition

* 增加创建索引测试

* 更改测试文件路径

* 完成服务器程序基本框架

* 字符串解析增加单引号

* 完成echo服务器

* 增加增删改、创建表的执行测试

* 更改测试路径

* 实现访问者模式处理sql语句

* 改进select语句解析

* 完善语句解析的返回值,使用泛型

* 完成语句执行逻辑

* 增加select测试

* 修复delete测试

* 实现指令解析,完成当前所有指令运行的测试

* 将mock换为RecordManager

* 完成自动提交

* 完成todo/fixme

* 增加获取所有文件路径的api

* 修正测试文件路径

* 增加field加载时的索引重建

* 修复未抛出的异常

* 修正执行的系列错误

* 修正自动提交事务上下文更改的问题

* 修正ci重复进行测试

* 修复投影获得空列表的bug

* 修复列未空的插入请求

* 修正select输出格式

* 修复metadata写入bug

* unpin遗漏

* 增加CreateIndex时的表结构序列化

* 修复物理记录查找问题

* 修复错误@nonnull的问题

* 更新dummy

* 修正一系列select解析问题

* 修正between计算问题

* 增加插入列检查

* record提供路径名

* 更改文件目录

* 创建数据文件夹

* 增加flush、exec语句

* 修正null值错误处理

* 通过记录来保存数据字典

* flush错误处理

* 修正系列问题,增加recordapi

* 修正测试用例编译

* 修复metadata加载问题

* 修复metadata加载问题

* 修正一处forEach

* 修复列persist标志位

* metadata加载的空指针问题

* 修改测试用例

* 修正若干错误测试用例

* 修正表模块单元测试路径

* 统一单元测试文件路径

Co-authored-by: Kevin Axel Manjaro <kevinaxel@163.com>

* [M]修正事务模块死锁决断器的并发问题 (#16)

* 增加状态判断

* 完善测试用例,修正死锁测试

* 添加状态异常

* 修正事务测试

* 由于签名变更调整

* 增加对超级事务的特判

* 修正事务测试

* 修正死锁测试可能的延迟问题

* 为释放锁添加同步

* 增加若干调试输出

* 解决死锁监测的并发问题

* 使用并发度较低的方法解决了死锁问题

* 增加三线程死锁测试

* 测试结束时删除xid.log

* 暂时屏蔽3线程死锁

* 更改单元测试日志文件的位置

* 修正签名问题

Co-authored-by: Criterionist <1229089076@qq.com>

* [V]版本 v0.1_alpha

* Revert "[M]修正事务模块死锁决断器的并发问题 (#16)" (#22)

This reverts commit 2e72e1a.

* Revert "[V]版本 v0.1_alpha"

This reverts commit b1267a9

* [V]版本 v0.1_alpha

Co-authored-by: Kevin Axel Manjaro <kevinaxel@163.com>
Co-authored-by: Kevin Axel <41867249+KveinAxel@users.noreply.github.com>
Co-authored-by: xiaoxineryi <529086017@qq.com>
Co-authored-by: DctorWei1314 <61504793+DctorWei1314@users.noreply.github.com>
Co-authored-by: Criterionist <1229089076@qq.com>
Co-authored-by: XuanLaoYee <1115810634@qq.com>
  • Loading branch information
7 people authored Jan 17, 2021
1 parent 38602d0 commit b40b320
Show file tree
Hide file tree
Showing 155 changed files with 16,535 additions and 8 deletions.
35 changes: 35 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
testFile
test_gen_files

# IntelliJ IDEA
.idea
*.iws
*.iml
*.ipr
build/
.gradle

*.srctrl*
# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
7 changes: 7 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
language: java
jdk: oraclejdk11
dist: trusty
group: edge

script:
- ./gradlew build --scan -s
26 changes: 18 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,29 @@
# RumBase Java

Java构建的高性能SQL关系型数据库。
| master | dev |
| ------ | --- |
| [![Build Status](https://www.travis-ci.com/kaaass/rumbase_java.svg?token=7d6V7UKwzfD6augATNKx&branch=master)](https://www.travis-ci.com/kaaass/rumbase_java) | [![Build Status](https://www.travis-ci.com/kaaass/rumbase_java.svg?token=7d6V7UKwzfD6augATNKx&branch=dev)](https://www.travis-ci.com/kaaass/rumbase_java) |

Java构建的SQL关系型数据库。

本项目为吉林大学2018级数据库系统课程&系统软件综合实践(荣誉课)课程设计。

## 构建

1. 在 Release 页面下载源码或 clone 项目
2. 在项目目录执行 `./gradlew build`

## 分工

| **模块** | **内容** | **负责人** | **** |
| ----------------------- | -------------------- | ---------- | ------------ |
| Server Module | 服务器、会话管理 | @KAAAsS | server |
| Query Parse Module | SQL 语句解析 | @KAAAsS | parse |
| Query Execution Module | 查询执行、优化 | | query |
| Table Management Module | 系统内数据库、表管理 | | table |
| Indexing Module | 索引结构,使用 B+ 树 | | index |
| Query Execution Module | 查询执行、优化 | @KveinAxel | query |
| Table Management Module | 系统内数据库、表管理 | @KveinAxel | table |
| Indexing Module | 索引结构,使用 B+ 树 | @DoctorWei1314 | index |
| Record Module | 记录管理,实现 MVCC | @KAAAsS | record |
| Transaction Module | 实现事务的管理与 2PL | | transaction |
| Data Item Module | 数据项管理 | | dataitem |
| Recovery Log Module | 日志与恢复管理 | | recovery |
| Page Caching Module | 缓冲与页管理 | | page |
| Transaction Module | 实现事务的管理与 2PL | @criki | transaction |
| Data Item Module | 数据项管理 | @kaito | dataitem |
| Recovery Log Module | 日志与恢复管理 | @kaito | recovery |
| Page Caching Module | 缓冲与页管理 | @XuanLaoYee | page |
32 changes: 32 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ plugins {
id 'java'
}

tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}

group 'net.kaaass'
version '1.0-SNAPSHOT'

Expand All @@ -10,5 +14,33 @@ repositories {
}

dependencies {
// java-binary-block-parser
compile 'com.igormaznitsa:jbbp:2.0.2'
// Lombok
compileOnly 'org.projectlombok:lombok:1.18.16'
annotationProcessor 'org.projectlombok:lombok:1.18.16'
testCompileOnly 'org.projectlombok:lombok:1.18.16'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.16'
// Slf4j
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.30'
compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.30'
// JSQLParser
compile 'com.github.jsqlparser:jsqlparser:4.0'
// JUnit
testCompile group: 'junit', name: 'junit', version: '4.12'
}

// Agree --scan ToS
if (hasProperty('buildScan')) {
buildScan {
termsOfServiceUrl = 'https://gradle.com/terms-of-service'
termsOfServiceAgree = 'yes'
}
}

test {
testLogging {
events "passed", "skipped", "failed"
exceptionFormat "full"
}
}
28 changes: 28 additions & 0 deletions src/main/java/net/kaaass/rumbase/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package net.kaaass.rumbase;

import lombok.extern.slf4j.Slf4j;
import net.kaaass.rumbase.server.Server;

/**
* 入口类
*
* @author kaaass
*/
@Slf4j
public class Main {

public static void main(String[] args) {
log.info("Rumbase DBMS");
// 启动
log.info("Start preparing...");
Server.getInstance().prepare();
// 注册程序退出事件
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
log.info("Shutdown...");
Server.getInstance().shutdown();
}, "Shutdown-thread"));
// 运行
log.info("Starting server...");
Server.getInstance().run();
}
}
84 changes: 84 additions & 0 deletions src/main/java/net/kaaass/rumbase/dataitem/IItemStorage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package net.kaaass.rumbase.dataitem;

import net.kaaass.rumbase.dataitem.exception.PageCorruptedException;
import net.kaaass.rumbase.dataitem.exception.UUIDException;
import net.kaaass.rumbase.transaction.TransactionContext;

import java.util.List;

/**
* 数据项管理接口
*
* @author kaito
*/
public interface IItemStorage {
/**
* 插入数据项
*
* @param item 数据项
* @return 返回数据项的UUID
*/
long insertItem(TransactionContext txContext, byte[] item);

/**
* 插入一个有UUID的数据项,唯一使用的地方是日志恢复时使用
* <p>
* 如果数据项已经存在,就将数据更新在已存在的数据项所在空间上;
* 如果数据项不存在,则以此UUID插入数据项
* </p>
*
* @param item 数据项
* @param uuid 编号
*/
void insertItemWithUuid(TransactionContext txContext, byte[] item, long uuid);

/**
* 通过UUID查询数据项
*
* @param uuid 编号
* @return 数据项
* @throws UUIDException UUID找不到的异常
*/
byte[] queryItemByUuid(long uuid) throws UUIDException;


/**
* 列出页中所有的记录
*
* @param pageId 页号
* @return list的一堆数据项
*/
List<byte[]> listItemByPageId(int pageId);

/**
* 根据UUID更新数据项
*
* @param uuid 编号
* @param item 数据项
* @throws UUIDException 没有找到对应UUID的异常
*/
void updateItemByUuid(TransactionContext txContext, long uuid, byte[] item) throws UUIDException, PageCorruptedException;

/**
* 获得数据项存储的元数据(可以用于头)
*
* @return 元数据
*/
byte[] getMetadata();

/**
* 设置数据项存储的元数据(可以用于头)
*
* @param metadata 头信息
*/
void setMetadata(TransactionContext txContext, byte[] metadata) throws PageCorruptedException;

/**
* 清理多余的数据项,空间清理时使用。
*
* @param uuids 数据项UUID的编号列表
*/
void removeItems(List<Long> uuids);
}


59 changes: 59 additions & 0 deletions src/main/java/net/kaaass/rumbase/dataitem/ItemManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package net.kaaass.rumbase.dataitem;


import net.kaaass.rumbase.page.exception.FileException;
import net.kaaass.rumbase.page.exception.PageException;
import net.kaaass.rumbase.transaction.TransactionContext;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
* 数据项管理类
*
* @author kaito
*/

public class ItemManager {

static Map<String, IItemStorage> maps = new HashMap<>();

/**
* 通过文件名解析得到数据项管理器
*
* @param fileName 文件名
* @return 数据项管理器,用于管理数据项
*/
public static IItemStorage fromFile(String fileName) throws FileException, IOException, PageException {
if (maps.containsKey(fileName)) {
return maps.get(fileName);
} else {
IItemStorage iItemStorage = ItemStorage.ofFile(fileName);
maps.put(fileName, iItemStorage);
return iItemStorage;
}
}

/**
* 新建一个数据库,并且将上层提供的头信息写入。
*
* @param fileName 文件名
* @param metadata 上层提供的表头信息
* @param txContext 对应的事务名
* @return 数据项管理器
* @throws FileException 想新建的文件已经存在的异常
*/
public static IItemStorage createFile(TransactionContext txContext, String fileName, byte[] metadata) throws FileException, IOException, PageException {
// 如果文件已经存在,那么就抛出文件已存在异常
if (maps.containsKey(fileName)) {
throw new FileException(1);
} else {
// 若文件不存在,则创建文件。
IItemStorage iItemStorage = ItemStorage.ofNewFile(txContext, fileName, metadata);
maps.put(fileName, iItemStorage);
return iItemStorage;
}

}
}
Loading

0 comments on commit b40b320

Please sign in to comment.