• 欢迎大家分享资料!前往留言板评论即可!

SQLite源码分析1 整体架构

合宙 模组资料网 2年前 (2021-05-15) 544次浏览 0个评论 扫描二维码
文章目录[隐藏]

SQLite源码分析1 整体架构


简介

https://www.sqlite.org
SQLite是一个轻量数据库,应用广泛。一个数据库一个文件。

  • self contained
    依赖少。可整合成一个c文件(https://www.sqlite.org/amalgamation.html)。
    只依赖十个左右的标准C库函数。

  • Serverless
    无服务。没有C/S结构、进程间网络间通讯,只在一个进程里跑。

  • Zero-Configuration
    不需要配置,直接可使用。

  • Transactional
    符合ACID原则。各种崩溃都不会影响操作的原子性或损毁文件。


整体架构

https://www.sqlite.org/arch.html

SQLite源码分析1 整体架构

  • Tokenizer分词器
    把sql语句解成一个个token,传给paser进行语法解析。类似编译器那一套东西。

  • Parser语法分析器
    https://www.sqlite.org/lemon.html
    根据定义好的sql语法,解析token串。
    规则在parse.y

  • Code Generator
    https://www.sqlite.org/opcode.html
    处理语法树,生成bytecode。
    包含一批类似delete.c,insert.c的代码,处理各种sql语句,转换成合适的bytecode。

  • Bytecode Engine
    bytecode用一个虚拟机来执行。代码为vdbe.c。

  • B树
    数据库的核心数据结构。每个表、每个index都有一棵B树。

  • Page Cache页缓存
    除了页缓存的基础功能。还实现原子操作、回滚等功能。

  • OS Interface
    os接口层,实现跨平台。
    https://www.sqlite.org/vfs.html

  • Utilities
    其他辅助功能。比如内存分配、字符串-数字转换、unicode处理等等。

  • Test Code
    测试流程


命令行功能结构

linux下输入sqlite3 test_db,进入sqlite命令行,自动打开test_db这个数据库文件。
并接受用户输入的sql语句。

看源代码shell.c的main函数如何实现这一流程。

main()
    做各种初始化和配置,包括main_init。

    处理参数。

    sqlite3_initialize()

    sqlite3_appendvfs_init()

    open_db() // 打开数据库
        SHELL_OPEN_NORMAL
        sqlite3_open_v2()(main.c)
            openDatabase()
                sqliteInt.h包含各种内部接口的定义。
                比如全局配置,Sqlite3Config。

                createCollation()

    打印欢迎信息 “SQLite version ...”

    process_input() // 死循环处理命令行的输入
        one_input_line() // 解出一行sql语句

        runOneSqlLine() // 运行一条sql语句
            shell_exec()
                sqlite3_prepare_v2
                sqlite3LockAndPrepare
                sqlite3Prepare() // Compile the UTF-8 encoded SQL statement zSql into a statement handle

                        sqlite3RunParser()(tokenize.c)
                            sqlite3Parser() // 这里开始语法解析。sqlite3Parser在parse.y里定义。

    各种free

    结束

总结

了解了SQLite的整体架构和命令行流程


参考

https://www.sqlite.org/arch.html
https://www.zhihu.com/question/22819578


转载请注明原文链接:SQLite源码分析1 整体架构
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址