From fe061d0507b260152d43d9c99b3f86b71115115b Mon Sep 17 00:00:00 2001 From: wangyunlai Date: Thu, 15 Jun 2023 14:17:13 +0800 Subject: [PATCH] Document (#197) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### What problem were solved in this pull request? Problem: 当前生成的github pages不太整洁方便,可以优化一下 ### What is changed and how it works? 改用mdbook生成文档,并整理文档目录,调整链接 --- .../{jekyll-gh-pages.yml => gh-pages.yml} | 38 +++-- .gitignore | 1 + CONTRIBUTING.md | 12 +- Doxyfile | 10 +- README.md | 28 ++-- docs/book.toml | 8 + docs/src/SUMMARY.md | 31 ++++ docs/src/design/introduction.md | 6 + docs/{ => src/design}/miniob-clog.md | 0 docs/{ => src/design}/miniob-sql-parser.md | 0 docs/{ => src/design}/miniob-transaction.md | 2 + docs/{ => src/dev-env}/dev_by_gitpod.md | 0 .../dev-env}/how-to-dev-using-docker.md | 0 ...ow_to_dev_in_docker_container_by_vscode.md | 0 .../how_to_dev_miniob_by_docker_on_windows.md | 0 .../dev-env}/how_to_dev_miniob_by_vscode.md | 0 .../images/dev_by_gitpod_build_init.png | Bin .../dev_by_gitpod_build_init_output.png | Bin .../images/dev_by_gitpod_build_others.png | Bin .../images/dev_by_gitpod_build_output.png | Bin .../dev_by_gitpod_build_run_build_task.png | Bin .../images/dev_by_gitpod_build_run_task.png | Bin .../images/dev_by_gitpod_dashboard.png | Bin .../images/dev_by_gitpod_debug_breakpoint.png | Bin .../images/dev_by_gitpod_debug_console.png | Bin .../dev_by_gitpod_debug_debugging_view.png | Bin .../images/dev_by_gitpod_debug_start.png | Bin .../dev_by_gitpod_debug_take_breakpoint.png | Bin .../images/dev_by_gitpod_debug_terminal.png | Bin .../images/dev_by_gitpod_fork_repo.png | Bin .../images/dev_by_gitpod_git_auth.png | Bin .../images/dev_by_gitpod_git_auth1.png | Bin .../images/dev_by_gitpod_git_commit.png | Bin .../dev_by_gitpod_git_edit_permissions.png | Bin .../images/dev_by_gitpod_git_operations.png | Bin ...dev_by_gitpod_git_pre_edit_permissions.png | Bin .../images/dev_by_gitpod_git_push_error.png | Bin .../dev_by_gitpod_gitpod_new_workspace.png | Bin .../dev-env}/images/dev_by_gitpod_ides.png | Bin .../images/dev_by_gitpod_miniob_workspace.png | Bin .../images/dev_by_gitpod_open_gitpod.png | Bin .../images/dev_by_gitpod_open_miniob.jpg | Bin .../images/dev_by_gitpod_vscode_homepage.png | Bin .../images/dev_by_gitpod_workspace.png | Bin .../dev-env}/images/vsc_add_new_ssh_host.png | Bin .../dev-env}/images/vsc_config_file.png | Bin .../dev-env}/images/vsc_container_started.png | Bin .../dev-env}/images/vsc_cpp_extensions.png | Bin docs/{ => src/dev-env}/images/vsc_debug.png | Bin .../dev-env}/images/vsc_kit_for_miniob.png | Bin .../dev-env}/images/vsc_open_folder.png | Bin docs/{ => src/dev-env}/images/vsc_pwd.png | Bin .../images/vsc_remote_ssh_connect_cmd.png | Bin .../images/vsc_remote_ssh_extension.png | Bin .../dev-env}/images/vsc_server_started.png | Bin .../dev-env}/images/vsc_ssh_connect.png | Bin .../images/vscode_C++_plugs_detail.png | Bin .../dev-env}/images/vscode_break_point.png | Bin .../dev-env}/images/vscode_build_ouput.png | Bin .../{ => src/dev-env}/images/vscode_cmake.png | Bin .../dev-env}/images/vscode_debug_miniob.png | Bin .../dev-env}/images/vscode_search_plugs.png | Bin .../windows-enable-disable-functions.png | Bin .../images/windows-enable-service.png | Bin .../dev-env}/images/windows-functions.png | Bin .../images/windows-search-service.png | Bin .../images/windows-terminal-mutli-shell.png | Bin .../dev-env}/images/windows-terminal.png | Bin docs/{ => src/dev-env}/images/windows-wsl.png | Bin docs/src/dev-env/introduction.md | 9 ++ docs/src/game/gitee-instructions.md | 145 ++++++++++++++++++ docs/src/game/images/add-members.png | Bin 0 -> 8483 bytes docs/src/game/images/create-repo.png | Bin 0 -> 62248 bytes docs/src/game/images/create-repo2.png | Bin 0 -> 38199 bytes docs/src/game/images/invite-users.png | Bin 0 -> 23840 bytes docs/src/game/images/reporter.png | Bin 0 -> 32317 bytes docs/src/game/introduction.md | 23 +++ .../game}/miniob-output-convention.md | 0 docs/{ => src/game}/miniob_topics.md | 0 docs/{ => src}/how_to_build.md | 2 +- ...miniob-introduction-running-the-client.png | Bin ...miniob-introduction-running-the-server.png | Bin .../images/miniob-introduction-sql-flow.png | Bin docs/{ => src}/lectures/copyright.md | 0 docs/{ => src}/lectures/images/1-1.png | Bin docs/{ => src}/lectures/images/1.3.1.3-1.png | Bin docs/{ => src}/lectures/images/1.3.1.3-2.png | Bin docs/{ => src}/lectures/images/2-1.png | Bin docs/{ => src}/lectures/images/2-2.png | Bin docs/{ => src}/lectures/images/2-3.png | Bin docs/{ => src}/lectures/images/2-4.png | Bin docs/{ => src}/lectures/images/2-5.png | Bin docs/{ => src}/lectures/images/2-6.png | Bin docs/{ => src}/lectures/images/2-7.png | Bin docs/{ => src}/lectures/images/2-8.png | Bin docs/{ => src}/lectures/images/3-1.png | Bin docs/{ => src}/lectures/images/3-2-a.png | Bin docs/{ => src}/lectures/images/3-2-b.png | Bin docs/{ => src}/lectures/images/3-2-c.png | Bin docs/{ => src}/lectures/images/3-3-a.png | Bin docs/{ => src}/lectures/images/3-3-b.png | Bin docs/{ => src}/lectures/images/3-3-c.png | Bin docs/{ => src}/lectures/images/3-4.png | Bin docs/{ => src}/lectures/images/3-5.png | Bin docs/{ => src}/lectures/images/3-6-a.png | Bin docs/{ => src}/lectures/images/3-6-b.png | Bin docs/{ => src}/lectures/images/3-7-a.png | Bin docs/{ => src}/lectures/images/3-7-b.png | Bin docs/{ => src}/lectures/images/3-7-c.png | Bin docs/{ => src}/lectures/images/4-1.png | Bin docs/{ => src}/lectures/images/4-2.png | Bin docs/{ => src}/lectures/images/4-3.png | Bin docs/{ => src}/lectures/images/4-4.png | Bin docs/{ => src}/lectures/images/4-5.png | Bin docs/{ => src}/lectures/images/4-6.png | Bin docs/{ => src}/lectures/images/5-1.png | Bin docs/{ => src}/lectures/images/5.2.1.1-1.png | Bin docs/{ => src}/lectures/images/5.2.1.1-2.png | Bin docs/{ => src}/lectures/images/5.2.1.1-3.png | Bin docs/{ => src}/lectures/images/5.2.1.1-4.png | Bin docs/{ => src}/lectures/images/5.2.2.1-1.png | Bin docs/{ => src}/lectures/images/5.3.1.1-4.png | Bin docs/{ => src}/lectures/images/6-1.png | Bin docs/{ => src}/lectures/images/6-2.png | Bin docs/{ => src}/lectures/images/6-3.png | Bin docs/{ => src}/lectures/images/6-4.png | Bin docs/{ => src}/lectures/index.md | 1 - docs/{ => src}/lectures/lecture-1.md | 0 docs/{ => src}/lectures/lecture-2.md | 0 docs/{ => src}/lectures/lecture-3.md | 0 docs/{ => src}/lectures/lecture-4.md | 0 docs/{ => src}/lectures/lecture-5.md | 0 docs/{ => src}/lectures/lecture-6.md | 0 docs/{ => src}/lectures/references.md | 0 docs/{ => src}/miniob-introduction.md | 0 src/observer/storage/clog/clog.h | 58 ++++--- src/observer/storage/record/record_manager.h | 95 +++++++----- src/observer/storage/trx/trx.h | 29 +++- 138 files changed, 388 insertions(+), 110 deletions(-) rename .github/workflows/{jekyll-gh-pages.yml => gh-pages.yml} (67%) create mode 100644 docs/book.toml create mode 100644 docs/src/SUMMARY.md create mode 100644 docs/src/design/introduction.md rename docs/{ => src/design}/miniob-clog.md (100%) rename docs/{ => src/design}/miniob-sql-parser.md (100%) rename docs/{ => src/design}/miniob-transaction.md (99%) rename docs/{ => src/dev-env}/dev_by_gitpod.md (100%) rename docs/{ => src/dev-env}/how-to-dev-using-docker.md (100%) rename docs/{ => src/dev-env}/how_to_dev_in_docker_container_by_vscode.md (100%) rename docs/{ => src/dev-env}/how_to_dev_miniob_by_docker_on_windows.md (100%) rename docs/{ => src/dev-env}/how_to_dev_miniob_by_vscode.md (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_build_init.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_build_init_output.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_build_others.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_build_output.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_build_run_build_task.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_build_run_task.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_dashboard.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_debug_breakpoint.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_debug_console.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_debug_debugging_view.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_debug_start.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_debug_take_breakpoint.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_debug_terminal.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_fork_repo.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_git_auth.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_git_auth1.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_git_commit.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_git_edit_permissions.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_git_operations.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_git_pre_edit_permissions.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_git_push_error.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_gitpod_new_workspace.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_ides.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_miniob_workspace.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_open_gitpod.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_open_miniob.jpg (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_vscode_homepage.png (100%) rename docs/{ => src/dev-env}/images/dev_by_gitpod_workspace.png (100%) rename docs/{ => src/dev-env}/images/vsc_add_new_ssh_host.png (100%) rename docs/{ => src/dev-env}/images/vsc_config_file.png (100%) rename docs/{ => src/dev-env}/images/vsc_container_started.png (100%) rename docs/{ => src/dev-env}/images/vsc_cpp_extensions.png (100%) rename docs/{ => src/dev-env}/images/vsc_debug.png (100%) rename docs/{ => src/dev-env}/images/vsc_kit_for_miniob.png (100%) rename docs/{ => src/dev-env}/images/vsc_open_folder.png (100%) rename docs/{ => src/dev-env}/images/vsc_pwd.png (100%) rename docs/{ => src/dev-env}/images/vsc_remote_ssh_connect_cmd.png (100%) rename docs/{ => src/dev-env}/images/vsc_remote_ssh_extension.png (100%) rename docs/{ => src/dev-env}/images/vsc_server_started.png (100%) rename docs/{ => src/dev-env}/images/vsc_ssh_connect.png (100%) rename docs/{ => src/dev-env}/images/vscode_C++_plugs_detail.png (100%) rename docs/{ => src/dev-env}/images/vscode_break_point.png (100%) rename docs/{ => src/dev-env}/images/vscode_build_ouput.png (100%) rename docs/{ => src/dev-env}/images/vscode_cmake.png (100%) rename docs/{ => src/dev-env}/images/vscode_debug_miniob.png (100%) rename docs/{ => src/dev-env}/images/vscode_search_plugs.png (100%) rename docs/{ => src/dev-env}/images/windows-enable-disable-functions.png (100%) rename docs/{ => src/dev-env}/images/windows-enable-service.png (100%) rename docs/{ => src/dev-env}/images/windows-functions.png (100%) rename docs/{ => src/dev-env}/images/windows-search-service.png (100%) rename docs/{ => src/dev-env}/images/windows-terminal-mutli-shell.png (100%) rename docs/{ => src/dev-env}/images/windows-terminal.png (100%) rename docs/{ => src/dev-env}/images/windows-wsl.png (100%) create mode 100644 docs/src/dev-env/introduction.md create mode 100644 docs/src/game/gitee-instructions.md create mode 100644 docs/src/game/images/add-members.png create mode 100644 docs/src/game/images/create-repo.png create mode 100644 docs/src/game/images/create-repo2.png create mode 100644 docs/src/game/images/invite-users.png create mode 100644 docs/src/game/images/reporter.png create mode 100644 docs/src/game/introduction.md rename docs/{ => src/game}/miniob-output-convention.md (100%) rename docs/{ => src/game}/miniob_topics.md (100%) rename docs/{ => src}/how_to_build.md (99%) rename docs/{ => src}/images/miniob-introduction-running-the-client.png (100%) rename docs/{ => src}/images/miniob-introduction-running-the-server.png (100%) rename docs/{ => src}/images/miniob-introduction-sql-flow.png (100%) rename docs/{ => src}/lectures/copyright.md (100%) rename docs/{ => src}/lectures/images/1-1.png (100%) rename docs/{ => src}/lectures/images/1.3.1.3-1.png (100%) rename docs/{ => src}/lectures/images/1.3.1.3-2.png (100%) rename docs/{ => src}/lectures/images/2-1.png (100%) rename docs/{ => src}/lectures/images/2-2.png (100%) rename docs/{ => src}/lectures/images/2-3.png (100%) rename docs/{ => src}/lectures/images/2-4.png (100%) rename docs/{ => src}/lectures/images/2-5.png (100%) rename docs/{ => src}/lectures/images/2-6.png (100%) rename docs/{ => src}/lectures/images/2-7.png (100%) rename docs/{ => src}/lectures/images/2-8.png (100%) rename docs/{ => src}/lectures/images/3-1.png (100%) rename docs/{ => src}/lectures/images/3-2-a.png (100%) rename docs/{ => src}/lectures/images/3-2-b.png (100%) rename docs/{ => src}/lectures/images/3-2-c.png (100%) rename docs/{ => src}/lectures/images/3-3-a.png (100%) rename docs/{ => src}/lectures/images/3-3-b.png (100%) rename docs/{ => src}/lectures/images/3-3-c.png (100%) rename docs/{ => src}/lectures/images/3-4.png (100%) rename docs/{ => src}/lectures/images/3-5.png (100%) rename docs/{ => src}/lectures/images/3-6-a.png (100%) rename docs/{ => src}/lectures/images/3-6-b.png (100%) rename docs/{ => src}/lectures/images/3-7-a.png (100%) rename docs/{ => src}/lectures/images/3-7-b.png (100%) rename docs/{ => src}/lectures/images/3-7-c.png (100%) rename docs/{ => src}/lectures/images/4-1.png (100%) rename docs/{ => src}/lectures/images/4-2.png (100%) rename docs/{ => src}/lectures/images/4-3.png (100%) rename docs/{ => src}/lectures/images/4-4.png (100%) rename docs/{ => src}/lectures/images/4-5.png (100%) rename docs/{ => src}/lectures/images/4-6.png (100%) rename docs/{ => src}/lectures/images/5-1.png (100%) rename docs/{ => src}/lectures/images/5.2.1.1-1.png (100%) rename docs/{ => src}/lectures/images/5.2.1.1-2.png (100%) rename docs/{ => src}/lectures/images/5.2.1.1-3.png (100%) rename docs/{ => src}/lectures/images/5.2.1.1-4.png (100%) rename docs/{ => src}/lectures/images/5.2.2.1-1.png (100%) rename docs/{ => src}/lectures/images/5.3.1.1-4.png (100%) rename docs/{ => src}/lectures/images/6-1.png (100%) rename docs/{ => src}/lectures/images/6-2.png (100%) rename docs/{ => src}/lectures/images/6-3.png (100%) rename docs/{ => src}/lectures/images/6-4.png (100%) rename docs/{ => src}/lectures/index.md (99%) rename docs/{ => src}/lectures/lecture-1.md (100%) rename docs/{ => src}/lectures/lecture-2.md (100%) rename docs/{ => src}/lectures/lecture-3.md (100%) rename docs/{ => src}/lectures/lecture-4.md (100%) rename docs/{ => src}/lectures/lecture-5.md (100%) rename docs/{ => src}/lectures/lecture-6.md (100%) rename docs/{ => src}/lectures/references.md (100%) rename docs/{ => src}/miniob-introduction.md (100%) diff --git a/.github/workflows/jekyll-gh-pages.yml b/.github/workflows/gh-pages.yml similarity index 67% rename from .github/workflows/jekyll-gh-pages.yml rename to .github/workflows/gh-pages.yml index 6f89db1..1152f83 100644 --- a/.github/workflows/jekyll-gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -1,5 +1,8 @@ -# Sample workflow for building and deploying a Jekyll site to GitHub Pages -name: Deploy Jekyll with GitHub Pages dependencies preinstalled +# Sample workflow for building and deploying a mdBook site to GitHub Pages +# +# To get started with mdBook see: https://rust-lang.github.io/mdBook/index.html +# +name: Deploy mdBook site to Pages on: # Runs on pushes targeting the default branch @@ -25,11 +28,23 @@ jobs: # Build job build: runs-on: ubuntu-latest + env: + MDBOOK_VERSION: 0.4.21 steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: false + - uses: actions/checkout@v3 + - name: Install mdBook + run: | + curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -y | sh + rustup update + cargo install --version ${MDBOOK_VERSION} mdbook + + - name: Setup Pages + id: pages + uses: actions/configure-pages@v3 + + - name: Build with mdBook + run: mdbook build + working-directory: ./docs - name: Doxygen Action uses: mattnotmitt/doxygen-action@v1.9.5 @@ -37,17 +52,10 @@ jobs: working-directory: . doxyfile-path: ./Doxyfile - - name: Setup Pages - uses: actions/configure-pages@v3 - - - name: Build with Jekyll - uses: actions/jekyll-build-pages@v1 - with: - source: ./ - destination: ./_site - - name: Upload artifact uses: actions/upload-pages-artifact@v1 + with: + path: docs/book # Deployment job deploy: diff --git a/.gitignore b/.gitignore index 13d2a66..6a9e42b 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,5 @@ compile_commands.json GRTAGS GPATH GTAGS +docs/book #*# diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2a3785b..55444d8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,17 +6,17 @@ OceanBase 社区热情欢迎每一位对数据库技术热爱的开发者,期 为了帮助开发者更好的上手并学习 miniob, 建议阅读: -1. [miniob 框架介绍](https://github.com/oceanbase/miniob/blob/main/docs/miniob-introduction.md) -2. [如何编译 miniob 源码](https://github.com/oceanbase/miniob/blob/main/docs/how_to_build.md) -3. [开发环境搭建(本地调试, 适用 Linux 和 Mac)](https://github.com/oceanbase/miniob/blob/main/docs/how_to_dev_miniob_by_vscode.md) -4. [开发环境搭建(远程调试, 适用于 Window, Linux 和 Mac)](https://github.com/oceanbase/miniob/blob/main/docs/how_to_dev_in_docker_container_by_vscode.md) -5. [miniob 词法语法解析开发与测试](docs/miniob-sql-parser.md) +1. [miniob 框架介绍](docs/src/miniob-introduction.md) +2. [如何编译 miniob 源码](docs/src/how_to_build.md) +3. [开发环境搭建(本地调试, 适用 Linux 和 Mac)](docs/src/dev-env/how_to_dev_miniob_by_vscode.md) +4. [开发环境搭建(远程调试, 适用于 Window, Linux 和 Mac)](docs/src/dev-env/how_to_dev_in_docker_container_by_vscode.md) +5. [miniob 文档汇总](docs/src/SUMMARY.md) 更多的文档, 可以参考 [docs](https://github.com/oceanbase/miniob/tree/main/docs), 为了帮助大家更好的学习数据库基础知识, OceanBase 社区提供了一系列教程, 建议学习: 1. [《从0到1数据库内核实战教程》 视频教程](https://open.oceanbase.com/activities/4921877?id=4921946) 2. [《从0到1数据库内核实战教程》 基础讲义](https://github.com/oceanbase/kernel-quickstart) -3. [《数据库管理系统实现》 华中科技大学实现教材](https://github.com/oceanbase/miniob/blob/main/docs/lectures/index.md) +3. [《数据库管理系统实现》 华中科技大学实现教材](docs/src/lectures/index.md) ## 如何找到一个合适issue diff --git a/Doxyfile b/Doxyfile index 1571c34..689d588 100644 --- a/Doxyfile +++ b/Doxyfile @@ -68,7 +68,7 @@ PROJECT_LOGO = # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = docs/doxy +OUTPUT_DIRECTORY = docs/book/design/doxy # If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 # sub-directories (in 2 levels) under the output directory of each output format @@ -120,7 +120,7 @@ OUTPUT_LANGUAGE = Chinese # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. -BRIEF_MEMBER_DESC = NO +BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description @@ -524,13 +524,13 @@ EXTRACT_ALL = NO # be included in the documentation. # The default value is: NO. -EXTRACT_PRIVATE = NO +EXTRACT_PRIVATE = YES # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. # The default value is: NO. -EXTRACT_PRIV_VIRTUAL = NO +EXTRACT_PRIV_VIRTUAL = YES # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. @@ -542,7 +542,7 @@ EXTRACT_PACKAGE = NO # included in the documentation. # The default value is: NO. -EXTRACT_STATIC = NO +EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, diff --git a/README.md b/README.md index 91acd90..1f4fae1 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,33 @@ -# miniob 概述 +# MiniOB 概述 -miniob 是 [OceanBase](https://github.com/oceanbase/oceanbase) 与华中科技大学联合开发的、面向"零"基础同学的数据库入门学习项目。 +MiniOB 是 [OceanBase](https://github.com/oceanbase/oceanbase) 与华中科技大学联合开发的、面向"零"基础同学的数据库入门学习项目。 -miniob 设计的目标是面向在校学生、数据库从业者、爱好者,或者对基础技术有兴趣的爱好者, 整体代码量少,易于上手并学习, 是一个系统性的数据库学习项目。miniob 设置了一系列由浅入深的题目,以帮助同学们"零"基础入门, 让同学们快速了解数据库并深入学习数据库内核,期望通过相关训练之后,能够熟练掌握数据库内核模块的功能与协同关系, 并能够在使用数据库时,设计出高效的 SQL 。miniob 为了更好的学习数据库实现原理, 对诸多模块都做了简化,比如不考虑并发操作, 安全特性, 复杂的事物管理等功能。 - -(注意:此代码仅供学习使用,请勿用于生产项目。) +MiniOB 设计的目标是面向在校学生、数据库从业者、爱好者,或者对基础技术有兴趣的爱好者, 整体代码量少,易于上手并学习, 是一个系统性的数据库学习项目。miniob 设置了一系列由浅入深的题目,以帮助同学们"零"基础入门, 让同学们快速了解数据库并深入学习数据库内核,期望通过相关训练之后,能够熟练掌握数据库内核模块的功能与协同关系, 并能够在使用数据库时,设计出高效的 SQL 。miniob 为了更好的学习数据库实现原理, 对诸多模块都做了简化,比如不考虑并发操作, 安全特性, 复杂的事物管理等功能。 ## 快速上手 为了帮助开发者更好的上手并学习 miniob, 建议阅读: 1. [miniob 框架介绍](docs/miniob-introduction.md) -2. [如何编译 miniob 源码](docs/how_to_build.md) +2. [如何编译 MiniOB 源码](docs/how_to_build.md) 3. [使用 GitPod 开发 MiniOB](docs/dev_by_gitpod.md) 4. [开发环境搭建(本地调试, 适用 Linux 和 Mac)](docs/how_to_dev_miniob_by_vscode.md) 5. [开发环境搭建(远程调试, 适用于 Window, Linux 和 Mac)](docs/how_to_dev_in_docker_container_by_vscode.md) -6. [miniob 词法语法解析开发与测试](docs/miniob-sql-parser.md) +6. [MiniOB 词法语法解析开发与测试](docs/miniob-sql-parser.md) 7. [doxygen 代码文档](docs/doxy/html/index.html) +或者直接看 [MiniOB GitHub Pages](https://oceanbase.github.io/miniob/). + 更多的文档, 可以参考 docs 目录下的文档, 为了帮助大家更好的学习数据库基础知识, OceanBase 社区提供了一系列教程, 建议学习: 1. [《从0到1数据库内核实战教程》 视频教程](https://open.oceanbase.com/activities/4921877?id=4921946) 2. [《从0到1数据库内核实战教程》 基础讲义](https://github.com/oceanbase/kernel-quickstart) -3. [《数据库管理系统实现》 华中科技大学实现教材](docs/lectures/index.md) +3. [《数据库管理系统实现》 华中科技大学实现教材](docs/src/lectures/index.md) ## 系统架构 -miniob 整体架构如下图所示: -![架构](docs/images/miniob-introduction-sql-flow.png) +MiniOB 整体架构如下图所示: +![架构](docs/src/images/miniob-introduction-sql-flow.png) 其中: @@ -62,11 +62,11 @@ OceanBase 初赛基于一套适合初学者实践的数据库实训平台 miniob ### 1. 大赛手把手入门教程 -[大赛入门教程](https://github.com/oceanbase/kernel-quickstart/blob/V1.0.0/zh-CN/1.database-system-overview/5.miniob-github-gitee-instructions.md) +[大赛入门教程](docs/src/game/gitee-instructions.md) ### 2. 大赛赛题 -[赛题介绍](docs/miniob_topics.md) +[赛题介绍](docs/src/game/miniob_topics.md) ### 3. 提交测试 @@ -74,7 +74,7 @@ OceanBase 初赛基于一套适合初学者实践的数据库实训平台 miniob 在提交前, 请参考并学习 [训练营使用说明](https://ask.oceanbase.com/t/topic/35600372) -客户端输出需要满足一定要求,如果你的测试结果不符合预期,请参考 [miniob 输出约定](docs/miniob-output-convention.md)。 +客户端输出需要满足一定要求,如果你的测试结果不符合预期,请参考 [miniob 输出约定](docs/src/game/miniob-output-convention.md)。 ### 4. 大赛FAQ @@ -94,7 +94,7 @@ OceanBase 社区热情欢迎每一位对数据库技术热爱的开发者,期 ## License -miniob 采用 [木兰宽松许可证,第2版](https://license.coscl.org.cn/MulanPSL2), 可以自由拷贝和使用源码, 当做修改或分发时, 请遵守 [木兰宽松许可证,第2版](https://license.coscl.org.cn/MulanPSL2). +MiniOB 采用 [木兰宽松许可证,第2版](https://license.coscl.org.cn/MulanPSL2), 可以自由拷贝和使用源码, 当做修改或分发时, 请遵守 [木兰宽松许可证,第2版](https://license.coscl.org.cn/MulanPSL2). ## 社区组织 diff --git a/docs/book.toml b/docs/book.toml new file mode 100644 index 0000000..d1e4481 --- /dev/null +++ b/docs/book.toml @@ -0,0 +1,8 @@ +[book] +language = "cn" +multilingual = false +src = "src" +title = "MiniOB" + +[output.html] +git-repository-url = "https://github.com/oceanbase/miniob" diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md new file mode 100644 index 0000000..cdf60d9 --- /dev/null +++ b/docs/src/SUMMARY.md @@ -0,0 +1,31 @@ +# Summary + +- [MiniOB 简介](./miniob-introduction.md) +- [如何编译](./how_to_build.md) +- [开发环境搭建](./dev-env/introduction.md) + - [使用 GitPod 开发 MiniOB](./dev-env/dev_by_gitpod.md) + - [开发环境搭建(本地调试, 适用 Linux 和 Mac)](./dev-env/how_to_dev_miniob_by_vscode.md) + - [开发环境搭建(远程调试, 适用于 Window, Linux 和 Mac)](./dev-env/how_to_dev_in_docker_container_by_vscode.md) + - [Windows 使用Docker开发MiniOB](./dev-env/how_to_dev_miniob_by_docker_on_windows.md) + - [使用Docker开发MiniOB](./dev-env/how-to-dev-using-docker.md) + +- [功能模块设计说明文档](./design/introduction.md) + - [事务](./design/miniob-transaction.md) + - [CLog](./design/miniob-clog.md) + - [SQL Parser](./design/miniob-sql-parser.md) + - [Doxy代码文档](./design/doxy/html/index.html) + +- [OceanBase 数据库大赛](./game/introduction.md) + - [提交测试需要满足的输出要求](./game/miniob-output-convention.md) + - [2021届大赛题目介绍](./game/miniob_topics.md) + - [大赛手把手入门教程](./game/gitee-instructions.md) + +- [数据库基础理论课程](./lectures/index.md) + - [第1章 数据库管理系统概述](./lectures/lecture-1.md) + - [第2章 数据库的存储结构](./lectures/lecture-2.md) + - [第3章 索引结构](./lectures/lecture-3.md) + - [第4章 查询处理](./lectures/lecture-4.md) + - [第5章 查询优化](./lectures/lecture-5.md) + - [第6章 事务处理](./lectures/lecture-6.md) + - [参考资料](./lectures/references.md) + - [版权声明](./lectures/copyright.md) \ No newline at end of file diff --git a/docs/src/design/introduction.md b/docs/src/design/introduction.md new file mode 100644 index 0000000..9e7aa66 --- /dev/null +++ b/docs/src/design/introduction.md @@ -0,0 +1,6 @@ +# 功能模块设计说明 + +- [事务](./miniob-transaction.md) +- [CLog](./miniob-clog.md) +- [SQL Parser](./miniob-sql-parser.md) +- [Doxy文档](./doxy/html/index.html) \ No newline at end of file diff --git a/docs/miniob-clog.md b/docs/src/design/miniob-clog.md similarity index 100% rename from docs/miniob-clog.md rename to docs/src/design/miniob-clog.md diff --git a/docs/miniob-sql-parser.md b/docs/src/design/miniob-sql-parser.md similarity index 100% rename from docs/miniob-sql-parser.md rename to docs/src/design/miniob-sql-parser.md diff --git a/docs/miniob-transaction.md b/docs/src/design/miniob-transaction.md similarity index 99% rename from docs/miniob-transaction.md rename to docs/src/design/miniob-transaction.md index f8c2efa..bbc8c40 100644 --- a/docs/miniob-transaction.md +++ b/docs/src/design/miniob-transaction.md @@ -30,6 +30,8 @@ cmake -DCONCURRENCY=ON .. ``` 然后在build目录执行 make。编译完成后启动 observer 服务端进程。 +> 也可以使用 bash build.sh -DCONCURRENCY=ON 来编译 + 可以在启动observer时,增加 `-t mvcc` 选项来开启MVCC,假设当前目录是build(或build_debug之类): ```bash diff --git a/docs/dev_by_gitpod.md b/docs/src/dev-env/dev_by_gitpod.md similarity index 100% rename from docs/dev_by_gitpod.md rename to docs/src/dev-env/dev_by_gitpod.md diff --git a/docs/how-to-dev-using-docker.md b/docs/src/dev-env/how-to-dev-using-docker.md similarity index 100% rename from docs/how-to-dev-using-docker.md rename to docs/src/dev-env/how-to-dev-using-docker.md diff --git a/docs/how_to_dev_in_docker_container_by_vscode.md b/docs/src/dev-env/how_to_dev_in_docker_container_by_vscode.md similarity index 100% rename from docs/how_to_dev_in_docker_container_by_vscode.md rename to docs/src/dev-env/how_to_dev_in_docker_container_by_vscode.md diff --git a/docs/how_to_dev_miniob_by_docker_on_windows.md b/docs/src/dev-env/how_to_dev_miniob_by_docker_on_windows.md similarity index 100% rename from docs/how_to_dev_miniob_by_docker_on_windows.md rename to docs/src/dev-env/how_to_dev_miniob_by_docker_on_windows.md diff --git a/docs/how_to_dev_miniob_by_vscode.md b/docs/src/dev-env/how_to_dev_miniob_by_vscode.md similarity index 100% rename from docs/how_to_dev_miniob_by_vscode.md rename to docs/src/dev-env/how_to_dev_miniob_by_vscode.md diff --git a/docs/images/dev_by_gitpod_build_init.png b/docs/src/dev-env/images/dev_by_gitpod_build_init.png similarity index 100% rename from docs/images/dev_by_gitpod_build_init.png rename to docs/src/dev-env/images/dev_by_gitpod_build_init.png diff --git a/docs/images/dev_by_gitpod_build_init_output.png b/docs/src/dev-env/images/dev_by_gitpod_build_init_output.png similarity index 100% rename from docs/images/dev_by_gitpod_build_init_output.png rename to docs/src/dev-env/images/dev_by_gitpod_build_init_output.png diff --git a/docs/images/dev_by_gitpod_build_others.png b/docs/src/dev-env/images/dev_by_gitpod_build_others.png similarity index 100% rename from docs/images/dev_by_gitpod_build_others.png rename to docs/src/dev-env/images/dev_by_gitpod_build_others.png diff --git a/docs/images/dev_by_gitpod_build_output.png b/docs/src/dev-env/images/dev_by_gitpod_build_output.png similarity index 100% rename from docs/images/dev_by_gitpod_build_output.png rename to docs/src/dev-env/images/dev_by_gitpod_build_output.png diff --git a/docs/images/dev_by_gitpod_build_run_build_task.png b/docs/src/dev-env/images/dev_by_gitpod_build_run_build_task.png similarity index 100% rename from docs/images/dev_by_gitpod_build_run_build_task.png rename to docs/src/dev-env/images/dev_by_gitpod_build_run_build_task.png diff --git a/docs/images/dev_by_gitpod_build_run_task.png b/docs/src/dev-env/images/dev_by_gitpod_build_run_task.png similarity index 100% rename from docs/images/dev_by_gitpod_build_run_task.png rename to docs/src/dev-env/images/dev_by_gitpod_build_run_task.png diff --git a/docs/images/dev_by_gitpod_dashboard.png b/docs/src/dev-env/images/dev_by_gitpod_dashboard.png similarity index 100% rename from docs/images/dev_by_gitpod_dashboard.png rename to docs/src/dev-env/images/dev_by_gitpod_dashboard.png diff --git a/docs/images/dev_by_gitpod_debug_breakpoint.png b/docs/src/dev-env/images/dev_by_gitpod_debug_breakpoint.png similarity index 100% rename from docs/images/dev_by_gitpod_debug_breakpoint.png rename to docs/src/dev-env/images/dev_by_gitpod_debug_breakpoint.png diff --git a/docs/images/dev_by_gitpod_debug_console.png b/docs/src/dev-env/images/dev_by_gitpod_debug_console.png similarity index 100% rename from docs/images/dev_by_gitpod_debug_console.png rename to docs/src/dev-env/images/dev_by_gitpod_debug_console.png diff --git a/docs/images/dev_by_gitpod_debug_debugging_view.png b/docs/src/dev-env/images/dev_by_gitpod_debug_debugging_view.png similarity index 100% rename from docs/images/dev_by_gitpod_debug_debugging_view.png rename to docs/src/dev-env/images/dev_by_gitpod_debug_debugging_view.png diff --git a/docs/images/dev_by_gitpod_debug_start.png b/docs/src/dev-env/images/dev_by_gitpod_debug_start.png similarity index 100% rename from docs/images/dev_by_gitpod_debug_start.png rename to docs/src/dev-env/images/dev_by_gitpod_debug_start.png diff --git a/docs/images/dev_by_gitpod_debug_take_breakpoint.png b/docs/src/dev-env/images/dev_by_gitpod_debug_take_breakpoint.png similarity index 100% rename from docs/images/dev_by_gitpod_debug_take_breakpoint.png rename to docs/src/dev-env/images/dev_by_gitpod_debug_take_breakpoint.png diff --git a/docs/images/dev_by_gitpod_debug_terminal.png b/docs/src/dev-env/images/dev_by_gitpod_debug_terminal.png similarity index 100% rename from docs/images/dev_by_gitpod_debug_terminal.png rename to docs/src/dev-env/images/dev_by_gitpod_debug_terminal.png diff --git a/docs/images/dev_by_gitpod_fork_repo.png b/docs/src/dev-env/images/dev_by_gitpod_fork_repo.png similarity index 100% rename from docs/images/dev_by_gitpod_fork_repo.png rename to docs/src/dev-env/images/dev_by_gitpod_fork_repo.png diff --git a/docs/images/dev_by_gitpod_git_auth.png b/docs/src/dev-env/images/dev_by_gitpod_git_auth.png similarity index 100% rename from docs/images/dev_by_gitpod_git_auth.png rename to docs/src/dev-env/images/dev_by_gitpod_git_auth.png diff --git a/docs/images/dev_by_gitpod_git_auth1.png b/docs/src/dev-env/images/dev_by_gitpod_git_auth1.png similarity index 100% rename from docs/images/dev_by_gitpod_git_auth1.png rename to docs/src/dev-env/images/dev_by_gitpod_git_auth1.png diff --git a/docs/images/dev_by_gitpod_git_commit.png b/docs/src/dev-env/images/dev_by_gitpod_git_commit.png similarity index 100% rename from docs/images/dev_by_gitpod_git_commit.png rename to docs/src/dev-env/images/dev_by_gitpod_git_commit.png diff --git a/docs/images/dev_by_gitpod_git_edit_permissions.png b/docs/src/dev-env/images/dev_by_gitpod_git_edit_permissions.png similarity index 100% rename from docs/images/dev_by_gitpod_git_edit_permissions.png rename to docs/src/dev-env/images/dev_by_gitpod_git_edit_permissions.png diff --git a/docs/images/dev_by_gitpod_git_operations.png b/docs/src/dev-env/images/dev_by_gitpod_git_operations.png similarity index 100% rename from docs/images/dev_by_gitpod_git_operations.png rename to docs/src/dev-env/images/dev_by_gitpod_git_operations.png diff --git a/docs/images/dev_by_gitpod_git_pre_edit_permissions.png b/docs/src/dev-env/images/dev_by_gitpod_git_pre_edit_permissions.png similarity index 100% rename from docs/images/dev_by_gitpod_git_pre_edit_permissions.png rename to docs/src/dev-env/images/dev_by_gitpod_git_pre_edit_permissions.png diff --git a/docs/images/dev_by_gitpod_git_push_error.png b/docs/src/dev-env/images/dev_by_gitpod_git_push_error.png similarity index 100% rename from docs/images/dev_by_gitpod_git_push_error.png rename to docs/src/dev-env/images/dev_by_gitpod_git_push_error.png diff --git a/docs/images/dev_by_gitpod_gitpod_new_workspace.png b/docs/src/dev-env/images/dev_by_gitpod_gitpod_new_workspace.png similarity index 100% rename from docs/images/dev_by_gitpod_gitpod_new_workspace.png rename to docs/src/dev-env/images/dev_by_gitpod_gitpod_new_workspace.png diff --git a/docs/images/dev_by_gitpod_ides.png b/docs/src/dev-env/images/dev_by_gitpod_ides.png similarity index 100% rename from docs/images/dev_by_gitpod_ides.png rename to docs/src/dev-env/images/dev_by_gitpod_ides.png diff --git a/docs/images/dev_by_gitpod_miniob_workspace.png b/docs/src/dev-env/images/dev_by_gitpod_miniob_workspace.png similarity index 100% rename from docs/images/dev_by_gitpod_miniob_workspace.png rename to docs/src/dev-env/images/dev_by_gitpod_miniob_workspace.png diff --git a/docs/images/dev_by_gitpod_open_gitpod.png b/docs/src/dev-env/images/dev_by_gitpod_open_gitpod.png similarity index 100% rename from docs/images/dev_by_gitpod_open_gitpod.png rename to docs/src/dev-env/images/dev_by_gitpod_open_gitpod.png diff --git a/docs/images/dev_by_gitpod_open_miniob.jpg b/docs/src/dev-env/images/dev_by_gitpod_open_miniob.jpg similarity index 100% rename from docs/images/dev_by_gitpod_open_miniob.jpg rename to docs/src/dev-env/images/dev_by_gitpod_open_miniob.jpg diff --git a/docs/images/dev_by_gitpod_vscode_homepage.png b/docs/src/dev-env/images/dev_by_gitpod_vscode_homepage.png similarity index 100% rename from docs/images/dev_by_gitpod_vscode_homepage.png rename to docs/src/dev-env/images/dev_by_gitpod_vscode_homepage.png diff --git a/docs/images/dev_by_gitpod_workspace.png b/docs/src/dev-env/images/dev_by_gitpod_workspace.png similarity index 100% rename from docs/images/dev_by_gitpod_workspace.png rename to docs/src/dev-env/images/dev_by_gitpod_workspace.png diff --git a/docs/images/vsc_add_new_ssh_host.png b/docs/src/dev-env/images/vsc_add_new_ssh_host.png similarity index 100% rename from docs/images/vsc_add_new_ssh_host.png rename to docs/src/dev-env/images/vsc_add_new_ssh_host.png diff --git a/docs/images/vsc_config_file.png b/docs/src/dev-env/images/vsc_config_file.png similarity index 100% rename from docs/images/vsc_config_file.png rename to docs/src/dev-env/images/vsc_config_file.png diff --git a/docs/images/vsc_container_started.png b/docs/src/dev-env/images/vsc_container_started.png similarity index 100% rename from docs/images/vsc_container_started.png rename to docs/src/dev-env/images/vsc_container_started.png diff --git a/docs/images/vsc_cpp_extensions.png b/docs/src/dev-env/images/vsc_cpp_extensions.png similarity index 100% rename from docs/images/vsc_cpp_extensions.png rename to docs/src/dev-env/images/vsc_cpp_extensions.png diff --git a/docs/images/vsc_debug.png b/docs/src/dev-env/images/vsc_debug.png similarity index 100% rename from docs/images/vsc_debug.png rename to docs/src/dev-env/images/vsc_debug.png diff --git a/docs/images/vsc_kit_for_miniob.png b/docs/src/dev-env/images/vsc_kit_for_miniob.png similarity index 100% rename from docs/images/vsc_kit_for_miniob.png rename to docs/src/dev-env/images/vsc_kit_for_miniob.png diff --git a/docs/images/vsc_open_folder.png b/docs/src/dev-env/images/vsc_open_folder.png similarity index 100% rename from docs/images/vsc_open_folder.png rename to docs/src/dev-env/images/vsc_open_folder.png diff --git a/docs/images/vsc_pwd.png b/docs/src/dev-env/images/vsc_pwd.png similarity index 100% rename from docs/images/vsc_pwd.png rename to docs/src/dev-env/images/vsc_pwd.png diff --git a/docs/images/vsc_remote_ssh_connect_cmd.png b/docs/src/dev-env/images/vsc_remote_ssh_connect_cmd.png similarity index 100% rename from docs/images/vsc_remote_ssh_connect_cmd.png rename to docs/src/dev-env/images/vsc_remote_ssh_connect_cmd.png diff --git a/docs/images/vsc_remote_ssh_extension.png b/docs/src/dev-env/images/vsc_remote_ssh_extension.png similarity index 100% rename from docs/images/vsc_remote_ssh_extension.png rename to docs/src/dev-env/images/vsc_remote_ssh_extension.png diff --git a/docs/images/vsc_server_started.png b/docs/src/dev-env/images/vsc_server_started.png similarity index 100% rename from docs/images/vsc_server_started.png rename to docs/src/dev-env/images/vsc_server_started.png diff --git a/docs/images/vsc_ssh_connect.png b/docs/src/dev-env/images/vsc_ssh_connect.png similarity index 100% rename from docs/images/vsc_ssh_connect.png rename to docs/src/dev-env/images/vsc_ssh_connect.png diff --git a/docs/images/vscode_C++_plugs_detail.png b/docs/src/dev-env/images/vscode_C++_plugs_detail.png similarity index 100% rename from docs/images/vscode_C++_plugs_detail.png rename to docs/src/dev-env/images/vscode_C++_plugs_detail.png diff --git a/docs/images/vscode_break_point.png b/docs/src/dev-env/images/vscode_break_point.png similarity index 100% rename from docs/images/vscode_break_point.png rename to docs/src/dev-env/images/vscode_break_point.png diff --git a/docs/images/vscode_build_ouput.png b/docs/src/dev-env/images/vscode_build_ouput.png similarity index 100% rename from docs/images/vscode_build_ouput.png rename to docs/src/dev-env/images/vscode_build_ouput.png diff --git a/docs/images/vscode_cmake.png b/docs/src/dev-env/images/vscode_cmake.png similarity index 100% rename from docs/images/vscode_cmake.png rename to docs/src/dev-env/images/vscode_cmake.png diff --git a/docs/images/vscode_debug_miniob.png b/docs/src/dev-env/images/vscode_debug_miniob.png similarity index 100% rename from docs/images/vscode_debug_miniob.png rename to docs/src/dev-env/images/vscode_debug_miniob.png diff --git a/docs/images/vscode_search_plugs.png b/docs/src/dev-env/images/vscode_search_plugs.png similarity index 100% rename from docs/images/vscode_search_plugs.png rename to docs/src/dev-env/images/vscode_search_plugs.png diff --git a/docs/images/windows-enable-disable-functions.png b/docs/src/dev-env/images/windows-enable-disable-functions.png similarity index 100% rename from docs/images/windows-enable-disable-functions.png rename to docs/src/dev-env/images/windows-enable-disable-functions.png diff --git a/docs/images/windows-enable-service.png b/docs/src/dev-env/images/windows-enable-service.png similarity index 100% rename from docs/images/windows-enable-service.png rename to docs/src/dev-env/images/windows-enable-service.png diff --git a/docs/images/windows-functions.png b/docs/src/dev-env/images/windows-functions.png similarity index 100% rename from docs/images/windows-functions.png rename to docs/src/dev-env/images/windows-functions.png diff --git a/docs/images/windows-search-service.png b/docs/src/dev-env/images/windows-search-service.png similarity index 100% rename from docs/images/windows-search-service.png rename to docs/src/dev-env/images/windows-search-service.png diff --git a/docs/images/windows-terminal-mutli-shell.png b/docs/src/dev-env/images/windows-terminal-mutli-shell.png similarity index 100% rename from docs/images/windows-terminal-mutli-shell.png rename to docs/src/dev-env/images/windows-terminal-mutli-shell.png diff --git a/docs/images/windows-terminal.png b/docs/src/dev-env/images/windows-terminal.png similarity index 100% rename from docs/images/windows-terminal.png rename to docs/src/dev-env/images/windows-terminal.png diff --git a/docs/images/windows-wsl.png b/docs/src/dev-env/images/windows-wsl.png similarity index 100% rename from docs/images/windows-wsl.png rename to docs/src/dev-env/images/windows-wsl.png diff --git a/docs/src/dev-env/introduction.md b/docs/src/dev-env/introduction.md new file mode 100644 index 0000000..7234fc4 --- /dev/null +++ b/docs/src/dev-env/introduction.md @@ -0,0 +1,9 @@ +# 搭建开发环境 + +MiniOB 当前可以在Linux/MacOS上编译,所以开发环境最好是Linux或者MacOS。Windows上可以使用WSL2,或者使用Docker。这里有几个文档,大家可以参考并选择自己的开发环境。另外,很多同学喜欢使用visual studio code开发,MiniOB 中也将vscode的一些配置文件放在了仓库中,比如 .vscode/tasks.json 和 .vscode/launch.json,可以参考使用。 + +- [使用 GitPod 开发 MiniOB](dev_by_gitpod.md) +- [开发环境搭建(本地调试, 适用 Linux 和 Mac)](how_to_dev_miniob_by_vscode.md) +- [开发环境搭建(远程调试, 适用于 Window, Linux 和 Mac)](how_to_dev_in_docker_container_by_vscode.md) +- [Windows 使用Docker开发MiniOB](how_to_dev_miniob_by_docker_on_windows.md) +- [使用Docker开发MiniOB](how-to-dev-using-docker.md) \ No newline at end of file diff --git a/docs/src/game/gitee-instructions.md b/docs/src/game/gitee-instructions.md new file mode 100644 index 0000000..f6f284e --- /dev/null +++ b/docs/src/game/gitee-instructions.md @@ -0,0 +1,145 @@ +# 1.4 MiniOB Gitee 使用说明 + +实战 MiniOB 编程需要在 Gitee 上创建自己的 private 仓库,在开发完成后,将代码提交到自己的仓库中,然后在训练营中进行测试。 + +MiniOB 仓库地址: + +训练营地址: + +本文将以 Gitee 为例介绍如何在训练营中进行提测以及常用的 Git 操作命令。 + +## Gitee 提测流程 + +前提条件:已注册 Gitee 账号,Gitee 官网地址:。 + +- 创建私有仓库 + + 1. 登录 Gitee 平台,选择 **新建仓库**。 + + ![新建仓库](images/create-repo.png) + + 2. 输入仓库信息,单击 **创建**。设置为私有仓库后其他人无法查看到你的代码。 + + ![新建仓库](images/create-repo2.png) + +- 下载代码 + + ```bash + # 将代码拉到本地 + git clone https://github.com/oceanbase/miniob -b miniob_test + ``` + +
+

说明

+

若网络状态不好,也可以直接在 GitHub 上下载代码压缩包,下载时需要先选择 miniob_test 分支。

+
+ +- 将 MiniOB 代码 push 到自己的仓库 + + ```bash + # 进入到 miniob 目录,删除 .git 目录,清除已有的 git 信息 + cd miniob + rm -rf .git + + # 重新初始化 git 信息,并将代码提交到自己的仓库 + git init + git add . + git commit -m 'init' # 提交所有代码到本地仓库 + + # 将代码推送到远程仓库 + git remote add origin https://gitee.com/xxx/miniob.git # 注意替换命令中的 息为自己的库信息 + git branch -M main + git push -u origin main + ``` + +- 赋权官方测试账号 + + 对于私有仓库,默认情况下其他人看不到,同样 OceanBase 测试后台也无法拉取到代码,这时想要提交测试,需要先给 OceanBase 的官方测试账号增加一个权限。 + + 官方测试账号为:`oceanbase-ce-game-test` + + 首先在网页上打开自己的仓库,然后按照如下顺序操作即可。如果有疑问,也可以在 [OceanBase 社区论坛](https://ask.oceanbase.com/)或钉钉群(33254054)提问。 + + 1. 选择 **管理 > 仓库成员管理 > 观察者** 。 + + ![管理](images/reporter.png) + + 2. 选择 **直接添加**,搜索官方测试账号。 + + ![邀请用户](images/invite-users.png) + + 3. 添加完成后,单击 **提交**。 + + ![添加成员](images/add-members.png) + +## 日常 Git 开发命令 + +- 查看当前分支 + + ```bash + git branch # 查看本地分支 + + git branch -a # 查看所有分支,包括远程分支 + ``` + +- 创建分支 + + ```bash + git checkout -b 'your branch name' + + git branch -d 'your branch name' # 删除一个分支 + ``` + +- 切换分支 + + ```bash + git checkout 'branch name' + ``` + +- 提交代码 + + ```bash + # 添加想要提交的文件或文件夹 + git add 'the files or directories you want to commit' + # 这一步也可以用 git add . 添加当前目录 + + # 提交到本地仓库 + # -m 中是提交代码的消息,建议写有意义的信息,方便后面查找 + git commit -m 'commit message' + ``` + +- 推送代码到远程仓库 + + ```bash + git push + # 可以将多次提交,一次性 push 到远程仓库 + ``` + +- 合并代码 + + ```bash + # 假设当前处于分支 develop 下 + git merge feature/update + # 会将 feature/update 分支的修改,merge 到 develop 分支 + ``` + +- 临时修改另一个分支的代码 + + ```bash + # 有时候,正在开发一个新功能时,突然来了一个紧急 BUG,这时候需要切换到另一个分 去开发 + # 这时可以先把当前的代码提交上去,然后切换分支。 + # 或者也可以这样: + git stash # 将当前的修改保存起来 + + git checkout main # 切换到主分支,或者修复 BUG 的分支 + + git checkout -b fix/xxx # 创建一个新分支,用于修复问题 + + # 修改完成后,merge 到 main 分支 + # 然后,继续我们的功能开发 + + git checkout feature/update # 假设我们最开始就是在这个分支上 + git stash pop + + # stash 还有很多好玩的功能,大家可以探索一下 + ``` diff --git a/docs/src/game/images/add-members.png b/docs/src/game/images/add-members.png new file mode 100644 index 0000000000000000000000000000000000000000..81ec544be22bb9246e6adcf1db535629b52c424d GIT binary patch literal 8483 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 G^8W#}Lwg7S literal 0 HcmV?d00001 diff --git a/docs/src/game/images/create-repo.png b/docs/src/game/images/create-repo.png new file mode 100644 index 0000000000000000000000000000000000000000..02f6fb14c63932d59a51eef7333d94797346699d GIT binary patch literal 62248 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 UH&Wr5CeSnnPgg&ebxsLQ0A7oESO5S3 literal 0 HcmV?d00001 diff --git a/docs/src/game/images/invite-users.png b/docs/src/game/images/invite-users.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5b1996f18acfed165d6a1499b4612917b67b06 GIT binary patch literal 23840 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

Zmvpr<55@>jB?l>&(Gelcr`OkY=BQ7Z@^)In- zNDX4A{-jrb5J`cH&h$DlB@SmS#GV~@Fl+%S@qkE(f51e&(13UbRQ!cFqZCJwFq3Q3 zg#W_^(-SGJ3%?ty$As8C#VO5JGgetF?RNvI_5)h@YcYT4%}lMk002FyL~a6<1mCnO z@5t1!Vc*-|u)vf;!KEhYgTd5G*7Hp%zW}?-`}s+j7!z3<0DaN{Hp63k!eros@NX{x zSPTT17)29Z=;dqZZQuyAHOa^G8*171_Bp+Ig?tsF7m0B2jEFb?Z{foK^7{O50~$8s zNCy1F5(6A`&+$k^vbmidxE>&>UAJBy4(00qrgh!jG+?m9>BAB)`&Os~jokTEHoO;L ze?15dO9<0=e~)jYlgL71m=$mDWd8sp{~OucnGjmaO`97-%OYaMC*N7g*!^ z`xRoQ0pfX}GXQzERw%@uwA!=Maojy)`tSwRDv|fue?{>qvWvI2oUM&*PnI84Suppc zV2-kx4Fq036y*Mtc}&|Ed7vT7N`T9B^iZhNsz)2IVtwapXE$sy3^Si+AFns6YVee0 z|M71w@d{?a^G>O4qekG}8Q4fVDO*vuMfyb3yVOjZ$wR~-m$6J$ZaEK6ZI2j1mKX=gYxVa(i*5$Q&o@IEr&sSA7Bw&Wj zt6Lin!u)1wIJe~OTO&6%HYmjeT;>-GlAXn0&z)`5+7doi4nz%U$XJi>+VoMqd0vK{ znjJ`a-?P)H=G#}q=SvN&q7e~MHcJ$0Y=a{au1M=i(9(Fz9CB#xNhseT!~+CdEowXj zioqp}&`7(T%qxHp9^sa@JTLxWM?bdVl=*ORgO^F+tyn7lIEPOFl~+-C8WvOHbM!II zN`2$Obp)I%NyNd%Ez@obQNL|kaU4H;%Q+TU%_4$an7nK@m{YI@4sYezzf@mEn)e@I1P#px^1n4JIi9Kv)F;mGK8)>svDGqOVs zqR7wyc0@ETAS%R~b_&(dij2NEc&@b=ztyLJ_{p7)4BGG#Vv+-3@l(hWw_nQmLpnD9 z1ui~WDA=>UEkyYHw}eq-kE3va+<-!`P%f;g<~Sapt)z%d-~cQygeHDOR>ON~d*{eTGlS&!!a nA>o0rJ^HX45VE|YJUMUAxkcF7eYF96BvDpSe^&DJRnUI|k798N literal 0 HcmV?d00001 diff --git a/docs/src/game/introduction.md b/docs/src/game/introduction.md new file mode 100644 index 0000000..0713d63 --- /dev/null +++ b/docs/src/game/introduction.md @@ -0,0 +1,23 @@ +# OceanBase 数据库大赛 + +2022 OceanBase 数据库大赛是由中国计算机学会(CCF)数据库专业委员会指导,OceanBase 与蚂蚁技术研究院学术合作团队联合举办的数据库内核实战赛事。本次大赛主要面向全国爱好数据库的高校学生,以“竞技、交流、成长”为宗旨,搭建基于赛事的技术交流平台,促进高校创新人才培养机制,不仅帮助学生从0开始系统化学习数据库理论知识,提升学生数据库实践能力,更能帮助学生走向企业积累经验,促进国内数据库人才的发展,碰撞出创新的火花。 + +更多详情, 请参考 [OceanBase 大赛](https://open.oceanbase.com/competition/index) + +在开始参加大赛或者训练营之前,需要创建自己的代码仓库,这里有一个gitee的使用说明: +[大赛手把手入门教程](./gitee-instructions.md) + +作为参考,这里有第一届数据库大赛的题目介绍: +[第一届数据库大赛题目介绍](./miniob_topics.md) + +在参赛前,除了学习基础的理论知识,还可以使用OceanBase提供的训练营,来快速上手: +[训练营](https://open.oceanbase.com/train?questionId=200001) + +训练营的使用方法比较简单,不过这里也有一个小手册: +[训练营使用手册](https://ask.oceanbase.com/t/topic/35600372) + +注意,在训练营开始前,需要注意自己的程序输出需要满足一定的要求,请参考: +[提交测试需要满足的输出要求](./miniob-output-convention.md) + +我们也收集了一些常见问题,可以参考: +[常见问题](https://ask.oceanbase.com/t/topic/35601465) diff --git a/docs/miniob-output-convention.md b/docs/src/game/miniob-output-convention.md similarity index 100% rename from docs/miniob-output-convention.md rename to docs/src/game/miniob-output-convention.md diff --git a/docs/miniob_topics.md b/docs/src/game/miniob_topics.md similarity index 100% rename from docs/miniob_topics.md rename to docs/src/game/miniob_topics.md diff --git a/docs/how_to_build.md b/docs/src/how_to_build.md similarity index 99% rename from docs/how_to_build.md rename to docs/src/how_to_build.md index 1eb2c75..5e8eb93 100644 --- a/docs/how_to_build.md +++ b/docs/src/how_to_build.md @@ -1,4 +1,4 @@ -# How to build +# 如何编译 0. base diff --git a/docs/images/miniob-introduction-running-the-client.png b/docs/src/images/miniob-introduction-running-the-client.png similarity index 100% rename from docs/images/miniob-introduction-running-the-client.png rename to docs/src/images/miniob-introduction-running-the-client.png diff --git a/docs/images/miniob-introduction-running-the-server.png b/docs/src/images/miniob-introduction-running-the-server.png similarity index 100% rename from docs/images/miniob-introduction-running-the-server.png rename to docs/src/images/miniob-introduction-running-the-server.png diff --git a/docs/images/miniob-introduction-sql-flow.png b/docs/src/images/miniob-introduction-sql-flow.png similarity index 100% rename from docs/images/miniob-introduction-sql-flow.png rename to docs/src/images/miniob-introduction-sql-flow.png diff --git a/docs/lectures/copyright.md b/docs/src/lectures/copyright.md similarity index 100% rename from docs/lectures/copyright.md rename to docs/src/lectures/copyright.md diff --git a/docs/lectures/images/1-1.png b/docs/src/lectures/images/1-1.png similarity index 100% rename from docs/lectures/images/1-1.png rename to docs/src/lectures/images/1-1.png diff --git a/docs/lectures/images/1.3.1.3-1.png b/docs/src/lectures/images/1.3.1.3-1.png similarity index 100% rename from docs/lectures/images/1.3.1.3-1.png rename to docs/src/lectures/images/1.3.1.3-1.png diff --git a/docs/lectures/images/1.3.1.3-2.png b/docs/src/lectures/images/1.3.1.3-2.png similarity index 100% rename from docs/lectures/images/1.3.1.3-2.png rename to docs/src/lectures/images/1.3.1.3-2.png diff --git a/docs/lectures/images/2-1.png b/docs/src/lectures/images/2-1.png similarity index 100% rename from docs/lectures/images/2-1.png rename to docs/src/lectures/images/2-1.png diff --git a/docs/lectures/images/2-2.png b/docs/src/lectures/images/2-2.png similarity index 100% rename from docs/lectures/images/2-2.png rename to docs/src/lectures/images/2-2.png diff --git a/docs/lectures/images/2-3.png b/docs/src/lectures/images/2-3.png similarity index 100% rename from docs/lectures/images/2-3.png rename to docs/src/lectures/images/2-3.png diff --git a/docs/lectures/images/2-4.png b/docs/src/lectures/images/2-4.png similarity index 100% rename from docs/lectures/images/2-4.png rename to docs/src/lectures/images/2-4.png diff --git a/docs/lectures/images/2-5.png b/docs/src/lectures/images/2-5.png similarity index 100% rename from docs/lectures/images/2-5.png rename to docs/src/lectures/images/2-5.png diff --git a/docs/lectures/images/2-6.png b/docs/src/lectures/images/2-6.png similarity index 100% rename from docs/lectures/images/2-6.png rename to docs/src/lectures/images/2-6.png diff --git a/docs/lectures/images/2-7.png b/docs/src/lectures/images/2-7.png similarity index 100% rename from docs/lectures/images/2-7.png rename to docs/src/lectures/images/2-7.png diff --git a/docs/lectures/images/2-8.png b/docs/src/lectures/images/2-8.png similarity index 100% rename from docs/lectures/images/2-8.png rename to docs/src/lectures/images/2-8.png diff --git a/docs/lectures/images/3-1.png b/docs/src/lectures/images/3-1.png similarity index 100% rename from docs/lectures/images/3-1.png rename to docs/src/lectures/images/3-1.png diff --git a/docs/lectures/images/3-2-a.png b/docs/src/lectures/images/3-2-a.png similarity index 100% rename from docs/lectures/images/3-2-a.png rename to docs/src/lectures/images/3-2-a.png diff --git a/docs/lectures/images/3-2-b.png b/docs/src/lectures/images/3-2-b.png similarity index 100% rename from docs/lectures/images/3-2-b.png rename to docs/src/lectures/images/3-2-b.png diff --git a/docs/lectures/images/3-2-c.png b/docs/src/lectures/images/3-2-c.png similarity index 100% rename from docs/lectures/images/3-2-c.png rename to docs/src/lectures/images/3-2-c.png diff --git a/docs/lectures/images/3-3-a.png b/docs/src/lectures/images/3-3-a.png similarity index 100% rename from docs/lectures/images/3-3-a.png rename to docs/src/lectures/images/3-3-a.png diff --git a/docs/lectures/images/3-3-b.png b/docs/src/lectures/images/3-3-b.png similarity index 100% rename from docs/lectures/images/3-3-b.png rename to docs/src/lectures/images/3-3-b.png diff --git a/docs/lectures/images/3-3-c.png b/docs/src/lectures/images/3-3-c.png similarity index 100% rename from docs/lectures/images/3-3-c.png rename to docs/src/lectures/images/3-3-c.png diff --git a/docs/lectures/images/3-4.png b/docs/src/lectures/images/3-4.png similarity index 100% rename from docs/lectures/images/3-4.png rename to docs/src/lectures/images/3-4.png diff --git a/docs/lectures/images/3-5.png b/docs/src/lectures/images/3-5.png similarity index 100% rename from docs/lectures/images/3-5.png rename to docs/src/lectures/images/3-5.png diff --git a/docs/lectures/images/3-6-a.png b/docs/src/lectures/images/3-6-a.png similarity index 100% rename from docs/lectures/images/3-6-a.png rename to docs/src/lectures/images/3-6-a.png diff --git a/docs/lectures/images/3-6-b.png b/docs/src/lectures/images/3-6-b.png similarity index 100% rename from docs/lectures/images/3-6-b.png rename to docs/src/lectures/images/3-6-b.png diff --git a/docs/lectures/images/3-7-a.png b/docs/src/lectures/images/3-7-a.png similarity index 100% rename from docs/lectures/images/3-7-a.png rename to docs/src/lectures/images/3-7-a.png diff --git a/docs/lectures/images/3-7-b.png b/docs/src/lectures/images/3-7-b.png similarity index 100% rename from docs/lectures/images/3-7-b.png rename to docs/src/lectures/images/3-7-b.png diff --git a/docs/lectures/images/3-7-c.png b/docs/src/lectures/images/3-7-c.png similarity index 100% rename from docs/lectures/images/3-7-c.png rename to docs/src/lectures/images/3-7-c.png diff --git a/docs/lectures/images/4-1.png b/docs/src/lectures/images/4-1.png similarity index 100% rename from docs/lectures/images/4-1.png rename to docs/src/lectures/images/4-1.png diff --git a/docs/lectures/images/4-2.png b/docs/src/lectures/images/4-2.png similarity index 100% rename from docs/lectures/images/4-2.png rename to docs/src/lectures/images/4-2.png diff --git a/docs/lectures/images/4-3.png b/docs/src/lectures/images/4-3.png similarity index 100% rename from docs/lectures/images/4-3.png rename to docs/src/lectures/images/4-3.png diff --git a/docs/lectures/images/4-4.png b/docs/src/lectures/images/4-4.png similarity index 100% rename from docs/lectures/images/4-4.png rename to docs/src/lectures/images/4-4.png diff --git a/docs/lectures/images/4-5.png b/docs/src/lectures/images/4-5.png similarity index 100% rename from docs/lectures/images/4-5.png rename to docs/src/lectures/images/4-5.png diff --git a/docs/lectures/images/4-6.png b/docs/src/lectures/images/4-6.png similarity index 100% rename from docs/lectures/images/4-6.png rename to docs/src/lectures/images/4-6.png diff --git a/docs/lectures/images/5-1.png b/docs/src/lectures/images/5-1.png similarity index 100% rename from docs/lectures/images/5-1.png rename to docs/src/lectures/images/5-1.png diff --git a/docs/lectures/images/5.2.1.1-1.png b/docs/src/lectures/images/5.2.1.1-1.png similarity index 100% rename from docs/lectures/images/5.2.1.1-1.png rename to docs/src/lectures/images/5.2.1.1-1.png diff --git a/docs/lectures/images/5.2.1.1-2.png b/docs/src/lectures/images/5.2.1.1-2.png similarity index 100% rename from docs/lectures/images/5.2.1.1-2.png rename to docs/src/lectures/images/5.2.1.1-2.png diff --git a/docs/lectures/images/5.2.1.1-3.png b/docs/src/lectures/images/5.2.1.1-3.png similarity index 100% rename from docs/lectures/images/5.2.1.1-3.png rename to docs/src/lectures/images/5.2.1.1-3.png diff --git a/docs/lectures/images/5.2.1.1-4.png b/docs/src/lectures/images/5.2.1.1-4.png similarity index 100% rename from docs/lectures/images/5.2.1.1-4.png rename to docs/src/lectures/images/5.2.1.1-4.png diff --git a/docs/lectures/images/5.2.2.1-1.png b/docs/src/lectures/images/5.2.2.1-1.png similarity index 100% rename from docs/lectures/images/5.2.2.1-1.png rename to docs/src/lectures/images/5.2.2.1-1.png diff --git a/docs/lectures/images/5.3.1.1-4.png b/docs/src/lectures/images/5.3.1.1-4.png similarity index 100% rename from docs/lectures/images/5.3.1.1-4.png rename to docs/src/lectures/images/5.3.1.1-4.png diff --git a/docs/lectures/images/6-1.png b/docs/src/lectures/images/6-1.png similarity index 100% rename from docs/lectures/images/6-1.png rename to docs/src/lectures/images/6-1.png diff --git a/docs/lectures/images/6-2.png b/docs/src/lectures/images/6-2.png similarity index 100% rename from docs/lectures/images/6-2.png rename to docs/src/lectures/images/6-2.png diff --git a/docs/lectures/images/6-3.png b/docs/src/lectures/images/6-3.png similarity index 100% rename from docs/lectures/images/6-3.png rename to docs/src/lectures/images/6-3.png diff --git a/docs/lectures/images/6-4.png b/docs/src/lectures/images/6-4.png similarity index 100% rename from docs/lectures/images/6-4.png rename to docs/src/lectures/images/6-4.png diff --git a/docs/lectures/index.md b/docs/src/lectures/index.md similarity index 99% rename from docs/lectures/index.md rename to docs/src/lectures/index.md index 1147289..b150077 100644 --- a/docs/lectures/index.md +++ b/docs/src/lectures/index.md @@ -3,7 +3,6 @@ 作者 华中科技大学谢美意 左琼 - [第1章 数据库管理系统概述](lecture-1.md) [第2章 数据库的存储结构](lecture-2.md) diff --git a/docs/lectures/lecture-1.md b/docs/src/lectures/lecture-1.md similarity index 100% rename from docs/lectures/lecture-1.md rename to docs/src/lectures/lecture-1.md diff --git a/docs/lectures/lecture-2.md b/docs/src/lectures/lecture-2.md similarity index 100% rename from docs/lectures/lecture-2.md rename to docs/src/lectures/lecture-2.md diff --git a/docs/lectures/lecture-3.md b/docs/src/lectures/lecture-3.md similarity index 100% rename from docs/lectures/lecture-3.md rename to docs/src/lectures/lecture-3.md diff --git a/docs/lectures/lecture-4.md b/docs/src/lectures/lecture-4.md similarity index 100% rename from docs/lectures/lecture-4.md rename to docs/src/lectures/lecture-4.md diff --git a/docs/lectures/lecture-5.md b/docs/src/lectures/lecture-5.md similarity index 100% rename from docs/lectures/lecture-5.md rename to docs/src/lectures/lecture-5.md diff --git a/docs/lectures/lecture-6.md b/docs/src/lectures/lecture-6.md similarity index 100% rename from docs/lectures/lecture-6.md rename to docs/src/lectures/lecture-6.md diff --git a/docs/lectures/references.md b/docs/src/lectures/references.md similarity index 100% rename from docs/lectures/references.md rename to docs/src/lectures/references.md diff --git a/docs/miniob-introduction.md b/docs/src/miniob-introduction.md similarity index 100% rename from docs/miniob-introduction.md rename to docs/src/miniob-introduction.md diff --git a/src/observer/storage/clog/clog.h b/src/observer/storage/clog/clog.h index 0d0c100..7255f6f 100644 --- a/src/observer/storage/clog/clog.h +++ b/src/observer/storage/clog/clog.h @@ -34,8 +34,8 @@ class Db; /** * @defgroup CLog + * @brief CLog 就是 commit log。或者等价于redo log。 * @file clog.h - * @brief CLog 就是 commit log * @details 这个模块想要实现数据库事务中的D(durability),也就是持久化。 * 持久化是事务四大特性(ACID)中最复杂的模块,这里的实现简化了99.999%,仅在一些特定场景下才能 * 恢复数据库。 @@ -66,6 +66,7 @@ enum class CLogType /** * @brief clog type 转换成字符串 + * @ingroup CLog */ const char *clog_type_name(CLogType type); @@ -76,18 +77,20 @@ int32_t clog_type_to_integer(CLogType type); /** * @brief 数字转换成clog type + * @ingroup CLog */ CLogType clog_type_from_integer(int32_t value); /** * @brief CLog的记录头。每个日志都带有这个信息 + * @ingroup CLog */ struct CLogRecordHeader { - int32_t lsn_ = -1; /// log sequence number。当前没有使用 - int32_t trx_id_ = -1; /// 日志所属事务的编号 - int32_t type_ = clog_type_to_integer(CLogType::ERROR); /// 日志类型 - int32_t logrec_len_ = 0; /// record的长度,不包含header长度 + int32_t lsn_ = -1; ///< log sequence number。当前没有使用 + int32_t trx_id_ = -1; ///< 日志所属事务的编号 + int32_t type_ = clog_type_to_integer(CLogType::ERROR); ///< 日志类型 + int32_t logrec_len_ = 0; ///< record的长度,不包含header长度 bool operator==(const CLogRecordHeader &other) const { @@ -98,12 +101,13 @@ struct CLogRecordHeader }; /** + * @ingroup CLog * @brief MTR_COMMIT 日志的数据 - * 其它的类型的MTR日志都没有数据,只有COMMIT有。 + * @details 其它的类型的MTR日志都没有数据,只有COMMIT有。 */ struct CLogRecordCommitData { - int32_t commit_xid_ = -1; /// 事务提交的事务号 + int32_t commit_xid_ = -1; ///< 事务提交的事务号 bool operator == (const CLogRecordCommitData &other) const { @@ -115,15 +119,16 @@ struct CLogRecordCommitData /** * @brief 有具体数据修改的事务日志数据 + * @ingroup CLog * @details 这里记录的都是操作的记录,比如插入、删除一条数据。 */ struct CLogRecordData { - int32_t table_id_ = -1; /// 操作的表 - RID rid_; /// 操作的哪条记录 - int32_t data_len_ = 0; /// 记录的数据长度(因为header中也包含长度信息,这个长度可以不要) - int32_t data_offset_ = 0; /// 操作的数据在完整记录中的偏移量 - char * data_ = nullptr; /// 具体的数据,可能没有任何数据 + int32_t table_id_ = -1; ///< 操作的表 + RID rid_; ///< 操作的哪条记录 + int32_t data_len_ = 0; ///< 记录的数据长度(因为header中也包含长度信息,这个长度可以不要) + int32_t data_offset_ = 0; ///< 操作的数据在完整记录中的偏移量 + char * data_ = nullptr; ///< 具体的数据,可能没有任何数据 ~CLogRecordData(); @@ -138,11 +143,12 @@ struct CLogRecordData std::string to_string() const; - const static int32_t HEADER_SIZE; /// 指RecordData的头长度,即不包含data_的长度 + const static int32_t HEADER_SIZE; ///< 指RecordData的头长度,即不包含data_的长度 }; /** * @brief 表示一条日志记录 + * @ingroup CLog * @details 一条日志记录由一个日志头和具体的数据构成。 * 具体的数据根据日志类型不同,也是不同的类型。 */ @@ -215,14 +221,15 @@ public: std::string to_string() const; protected: - CLogRecordHeader header_; /// 日志头信息 + CLogRecordHeader header_; ///< 日志头信息 - CLogRecordData data_record_; /// 如果日志操作的是数据,此结构生效 - CLogRecordCommitData commit_record_; /// 如果是事务提交日志,此结构生效 + CLogRecordData data_record_; ///< 如果日志操作的是数据,此结构生效 + CLogRecordCommitData commit_record_; ///< 如果是事务提交日志,此结构生效 }; /** * @brief 缓存运行时产生的日志对象 + * @ingroup CLog * @details 当前的实现非常简单,没有采用其它数据库中常用的将日志序列化到二进制buffer, * 管理二进制buffer的方法。这里仅仅把日志记录下来,放到链表中。如果达到一定量的日志, * 或者日志数量超过某个阈值,就会调用flush_buffer将日志刷新到磁盘中。 @@ -256,13 +263,14 @@ private: RC write_log_record(CLogFile &log_file, CLogRecord *log_record); private: - common::Mutex lock_; /// 加锁支持多线程并发写入 - std::deque> log_records_; /// 当前等待刷数据的日志记录 - std::atomic_int32_t total_size_; /// 当前缓存中的日志记录的总大小 + common::Mutex lock_; ///< 加锁支持多线程并发写入 + std::deque> log_records_; ///< 当前等待刷数据的日志记录 + std::atomic_int32_t total_size_; ///< 当前缓存中的日志记录的总大小 }; /** * @brief 读写日志文件 + * @ingroup CLog * @details 这里的名字不太贴切,因为这个类希望管理所有日志文件,而不是特定的某个文件。不过当前 * 只有一个文件,并且文件名是固定的。 */ @@ -312,13 +320,14 @@ public: bool eof() const { return eof_; } protected: - std::string filename_; /// 日志文件名。总是init函数参数path路径下的clog文件 - int fd_ = -1; /// 操作的文件描述符 - bool eof_ = false; /// 是否已经读取到文件尾 + std::string filename_; ///< 日志文件名。总是init函数参数path路径下的clog文件 + int fd_ = -1; ///< 操作的文件描述符 + bool eof_ = false; ///< 是否已经读取到文件尾 }; /** * @brief 日志记录遍历器 + * @ingroup CLog * @details 使用时先执行初始化(init),然后多次调用next,直到valid返回false。 */ class CLogRecordIterator @@ -340,6 +349,7 @@ private: /** * @brief 日志管理器 + * @ingroup CLog * @details 一个日志管理器属于某一个DB(当前仅有一个DB sys)。 * 管理器负责写日志(运行时)、读日志与恢复(启动时) */ @@ -407,6 +417,6 @@ public: RC recover(Db *db); private: - CLogBuffer *log_buffer_ = nullptr; /// 日志缓存。新增日志时先放到内存,也就是这个buffer中 - CLogFile * log_file_ = nullptr; /// 管理日志,比如读写日志 + CLogBuffer *log_buffer_ = nullptr; ///< 日志缓存。新增日志时先放到内存,也就是这个buffer中 + CLogFile * log_file_ = nullptr; ///< 管理日志,比如读写日志 }; diff --git a/src/observer/storage/record/record_manager.h b/src/observer/storage/record/record_manager.h index 203c9b6..5dd5e1f 100644 --- a/src/observer/storage/record/record_manager.h +++ b/src/observer/storage/record/record_manager.h @@ -27,11 +27,10 @@ class Table; /** * @defgroup RecordManager - * @file record_manager.h - * * @brief 这里负责管理在一个文件上表记录(行)的组织/管理 + * @file record_manager.h * - * 表记录管理的内容包括如何在文件上存放、读取、检索。也就是记录的增删改查。 + * @details 表记录管理的内容包括如何在文件上存放、读取、检索。也就是记录的增删改查。 * 这里的文件都会被拆分成页面,每个页面都有一样的大小。更详细的信息可以参考BufferPool。 * 按照BufferPool的设计,第一个页面用来存放BufferPool本身的元数据,比如当前文件有多少页面、已经分配了多少页面、 * 每个页面的分配状态等。所以第一个页面对RecordManager来说没有作用。RecordManager 本身没有再单独拿一个页面 @@ -55,24 +54,24 @@ class Table; */ /** - * 数据文件,按照页面来组织,每一页都存放一些记录/数据行 - * 每一页都有一个这样的页头,虽然看起来浪费,但是现在就简单的这么做 + * @brief 数据文件,按照页面来组织,每一页都存放一些记录/数据行 + * @ingroup RecordManager + * @details 每一页都有一个这样的页头,虽然看起来浪费,但是现在就简单的这么做 * 从这个页头描述的信息来看,当前仅支持定长行/记录。如果要支持变长记录, * 或者超长(超出一页)的记录,这么做是不合适的。 */ struct PageHeader { - int32_t record_num; /// 当前页面记录的个数 - int32_t record_capacity; /// 最大记录个数 - int32_t record_real_size; // 每条记录的实际大小 - int32_t record_size; // 每条记录占用实际空间大小(可能对齐) - int32_t first_record_offset; // 第一条记录的偏移量 + int32_t record_num; ///< 当前页面记录的个数 + int32_t record_capacity; ///< 最大记录个数 + int32_t record_real_size; ///< 每条记录的实际大小 + int32_t record_size; ///< 每条记录占用实际空间大小(可能对齐) + int32_t first_record_offset; ///< 第一条记录的偏移量 }; /** - * @ingroup RecordManager - * * @brief 遍历一个页面中每条记录的iterator + * @ingroup RecordManager */ class RecordPageIterator { @@ -96,14 +95,14 @@ public: private: RecordPageHandler *record_page_handler_ = nullptr; PageNum page_num_ = BP_INVALID_PAGE_NUM; - common::Bitmap bitmap_; // bitmap 的相关信息可以参考 RecordPageHandler 的说明 - SlotNum next_slot_num_ = 0; // 当前遍历到了哪一个slot + common::Bitmap bitmap_; ///< bitmap 的相关信息可以参考 RecordPageHandler 的说明 + SlotNum next_slot_num_ = 0; ///< 当前遍历到了哪一个slot }; /** * @brief 负责处理一个页面中各种操作,比如插入记录、删除记录或者查找记录 - * - * 当前定长记录模式下每个页面的组织大概是这样的: + * @ingroup RecordManager + * @details 当前定长记录模式下每个页面的组织大概是这样的: * | PageHeader | record allocate bitmap | * |------------|------------------------| * | record1 | record2 | ..... | recordN | @@ -190,11 +189,11 @@ protected: } protected: - DiskBufferPool *disk_buffer_pool_ = nullptr; /// 当前操作的buffer pool(文件) - bool readonly_ = false; /// 当前的操作是否都是只读的 - Frame *frame_ = nullptr; /// 当前操作页面关联的frame(frame的更多概念可以参考buffer pool和frame) - PageHeader *page_header_ = nullptr; /// 当前页面上页面头 - char *bitmap_ = nullptr; /// 当前页面上record分配状态信息bitmap内存起始位置 + DiskBufferPool *disk_buffer_pool_ = nullptr; ///< 当前操作的buffer pool(文件) + bool readonly_ = false; ///< 当前的操作是否都是只读的 + Frame *frame_ = nullptr; ///< 当前操作页面关联的frame(frame的更多概念可以参考buffer pool和frame) + PageHeader *page_header_ = nullptr; ///< 当前页面上页面头 + char *bitmap_ = nullptr; ///< 当前页面上record分配状态信息bitmap内存起始位置 private: friend class RecordPageIterator; @@ -202,7 +201,8 @@ private: /** * @brief 管理整个文件中记录的增删改查 - * 整个文件的组织格式请参考该文件中最前面的注释 + * @ingroup RecordManager + * @details 整个文件的组织格式请参考该文件中最前面的注释 */ class RecordFileHandler { @@ -223,18 +223,18 @@ public: void close(); /** - * 从指定文件中删除标识符为rid的记录 + * @brief 从指定文件中删除标识符为rid的记录 */ RC delete_record(const RID *rid); /** - * 插入一个新的记录到指定文件中,data为指向新纪录内容的指针,返回该记录的标识符rid + * @brief 插入一个新的记录到指定文件中,data为指向新纪录内容的指针,返回该记录的标识符rid */ RC insert_record(const char *data, int record_size, RID *rid); RC recover_insert_record(const char *data, int record_size, const RID &rid); /** - * 获取指定文件中标识符为rid的记录内容到rec指向的记录结构中 + * @brief 获取指定文件中标识符为rid的记录内容到rec指向的记录结构中 * @param page_handler[in] * 访问记录时,会拿住一些资源不释放,比如页面锁,使用这个对象保存相关的资源,并在析构时会自动释放 * @param rid 想要获取的记录ID @@ -262,13 +262,14 @@ private: private: DiskBufferPool *disk_buffer_pool_ = nullptr; - std::unordered_set free_pages_; /// 没有填充满的页面集合 - common::Mutex lock_; /// 当编译时增加-DCONCURRENCY=ON 选项时,才会真正的支持并发 + std::unordered_set free_pages_; ///< 没有填充满的页面集合 + common::Mutex lock_; ///< 当编译时增加-DCONCURRENCY=ON 选项时,才会真正的支持并发 }; /** * @brief 遍历某个文件中所有记录 - * 遍历所有的页面,同时访问这些页面中所有的记录 + * @ingroup RecordManager + * @details 遍历所有的页面,同时访问这些页面中所有的记录 */ class RecordFileScanner { @@ -277,8 +278,8 @@ public: ~RecordFileScanner(); /** - * 打开一个文件扫描。 - * 如果条件不为空,则要对每条记录进行条件比较,只有满足所有条件的记录才被返回 + * @brief 打开一个文件扫描。 + * @details 如果条件不为空,则要对每条记录进行条件比较,只有满足所有条件的记录才被返回 * @param table 遍历的哪张表 * @param buffer_pool 访问的文件 * @param readonly 当前是否只读操作。访问数据时,需要对页面加锁。比如 @@ -288,27 +289,43 @@ public: RC open_scan(Table *table, DiskBufferPool &buffer_pool, Trx *trx, bool readonly, ConditionFilter *condition_filter); /** - * 关闭一个文件扫描,释放相应的资源 + * @brief 关闭一个文件扫描,释放相应的资源 */ RC close_scan(); + /** + * @brief 判断是否还有数据 + * @details 判断完成后调用next获取下一条数据 + */ bool has_next(); + + /** + * @brief 获取下一条记录 + * @details 获取下一条记录之前先调用has_next()判断是否还有数据 + */ RC next(Record &record); private: + /** + * @brief 获取下一条记录 + */ RC fetch_next_record(); + + /** + * @brief 获取一个页面内的下一条记录 + */ RC fetch_next_record_in_page(); private: // TODO 对于一个纯粹的record遍历器来说,不应该关心表和事务 - Table *table_ = nullptr; /// 当前遍历的是哪张表。这个字段仅供事务函数使用,如果设计合适,可以去掉 - DiskBufferPool *disk_buffer_pool_ = nullptr; /// 当前访问的文件 - Trx *trx_ = nullptr; /// 当前是哪个事务在遍历 - bool readonly_ = false; /// 遍历出来的数据,是否可能对它做修改 + Table *table_ = nullptr; ///< 当前遍历的是哪张表。这个字段仅供事务函数使用,如果设计合适,可以去掉 + DiskBufferPool *disk_buffer_pool_ = nullptr; ///< 当前访问的文件 + Trx *trx_ = nullptr; ///< 当前是哪个事务在遍历 + bool readonly_ = false; ///< 遍历出来的数据,是否可能对它做修改 - BufferPoolIterator bp_iterator_; /// 遍历buffer pool的所有页面 - ConditionFilter *condition_filter_ = nullptr; /// 过滤record + BufferPoolIterator bp_iterator_; ///< 遍历buffer pool的所有页面 + ConditionFilter *condition_filter_ = nullptr; ///< 过滤record RecordPageHandler record_page_handler_; - RecordPageIterator record_page_iterator_; /// 遍历某个页面上的所有record - Record next_record_; + RecordPageIterator record_page_iterator_; ///< 遍历某个页面上的所有record + Record next_record_; ///< 获取的记录放在这里缓存起来 }; diff --git a/src/observer/storage/trx/trx.h b/src/observer/storage/trx/trx.h index b83d7ea..e4408eb 100644 --- a/src/observer/storage/trx/trx.h +++ b/src/observer/storage/trx/trx.h @@ -26,8 +26,8 @@ See the Mulan PSL v2 for more details. */ #include "common/rc.h" /** - * @defgroup Transaction 事务模块 - * @brief 描述事务相关的代码 + * @defgroup Transaction + * @brief 事务相关的内容 */ class Db; @@ -37,11 +37,16 @@ class Trx; /** * @brief 描述一个操作,比如插入、删除行等 + * @ingroup Transaction * @details 通常包含一个操作的类型,以及操作的对象和具体的数据 */ class Operation { public: + /** + * @brief 操作的类型 + * @ingroup Transaction + */ enum class Type : int { INSERT, @@ -65,8 +70,9 @@ public: SlotNum slot_num() const { return slot_num_; } private: + ///< 操作的哪张表。这里直接使用表其实并不准确,因为表中的索引也可能有日志 Type type_; - /// 操作的哪张表。这里直接使用表其实并不准确,因为表中的索引也可能有日志 + Table * table_ = nullptr; PageNum page_num_; // TODO use RID instead of page num and slot num SlotNum slot_num_; @@ -91,13 +97,22 @@ public: } }; +/** + * @brief 事务管理器 + * @ingroup Transaction + */ class TrxKit { public: + /** + * @brief 事务管理器的类型 + * @ingroup Transaction + * @details 进程启动时根据事务管理器的类型来创建具体的对象 + */ enum Type { - VACUOUS, - MVCC, + VACUOUS, ///< 空的事务管理器,不做任何事情 + MVCC, ///< 支持MVCC的事务管理器 }; public: @@ -119,6 +134,10 @@ public: static TrxKit *instance(); }; +/** + * @brief 事务接口 + * @ingroup Transaction + */ class Trx { public: -- GitLab