开源项目CuteSqlite开发笔记(二):SQLite的架构

在开发CuteSqlite图形客户端的时候,需要用到SQL的语法解释,来对SQL语句进行优化。找了很多的SQL语法解释器,都不是十分满意,只有翻开Sqlite的源码,看看SQLite对SQL语句的解释过程,本文是翻译的官方文档。

 官方介绍架构的文章:https://www.sqlite.org/arch.html

CuteSqlite源码:https://github.com/shinehanx/CuteSqlite.git

SQLite的架构

SQLite的架构图

Introduction 介绍

本文档描述了SQLite库的架构。这里的信息对于那些想要理解或修改SQLite内部工作原理的人很有用。

Overview 概述

SQLite的工作原理是将SQL文本编译成字节码,然后使用虚拟机运行该字节码。

sqlite3_tagre_v2()和相关接口充当将SQL文本转换为字节码的编译器。sqlite3_stmt对象是实现单个SQL语句的单个字节码程序的容器。sqlite3_step()接口将字节码程序传递到虚拟机中,并运行该程序,直到它完成,或形成一行要返回的结果,或遇到致命错误,或被中断。

Interface  接口

C语言接口的大部分内容都可以在源文件main.c、legacy.c和vdbeapi.c中找到,尽管有些例程分散在其他文件中,它们可以访问具有文件范围的数据结构。sqlite3_get_table()例程在table.c中实现。sqlite3_mprintf()例程位于printf.c中。sqlite3_complete()接口位于complete.c中。TCL接口由tclsqlite.c实现。

为了避免名称冲突,SQLite库中的所有外部符号开始都以前缀sqlite3开头。那些供外部使用的符号(换句话说,那些构成SQLite的API的符号)添加下划线,因此开始以sqlite3_开头。扩展API有时会在下划线之前添加扩展名;例如:sqlite3_rbu_或sqlite3_session_。

Tokenizer 分词器

当一个包含SQL语句的字符串要被求值时,它首先被发送到标记器。tokenizer将SQL文本分解为标记,并将这些标记一个接一个地交给解析器。tokenizer在文件tokenize.c中手工编码。

注意,在这个设计中,标记器调用解析器。熟悉YACC和BISON的人可能习惯于用相反的方式来做事情--让解析器调用标记器。不过,让标记器调用解析器会更好,因为它可以是线程安全的,而且运行得更快。

Parser 解析器

解析器根据上下文为标记分配语义。SQLite的解析器使用Lemon解析生成器生成(包含解释SQL语法,并生成C语言代码)。Lemon的工作与YACC/BISON相同,但它使用了不同的输入语法,这更不容易出错。Lemon还生成了一个可重入和线程安全的解析器。Lemon定义了非终结符析构函数(non-terminal destructor)的概念,这样当遇到语法错误时它就不会泄漏内存。驱动Lemon并定义SQLite理解的SQL语言的语法文件位于src/parse.y中。

因为Lemon是一个通常在开发机器上找不到的程序,所以Lemon的完整源代码(只有一个C文件)包含在SQLite发行版的"tool"目录中。(稍后在WINDOWS上使用GCC编译出lemon.exe,并解释src/parse.y成C语言代码)

Code Generator 代码生成器

在解析器将标记组装到解析树中之后,代码生成器运行以分析解析树并生成执行SQL语句的工作的字节码。准备好的语句对象是这个字节码的容器。代码生成器中有许多文件,包括:attach.c、auth.c、build.c、delete.c、expr.c、insert.c、pragma.c、select.c、deliver.c、update.c、vacuum.c、where.c、wherecode.c和whereexpr.c。在这些文件中,大多数严重的魔术发生。expr.c处理表达式的代码生成。where*.c处理SELECT、UPDATE和NULL语句上的WHERE子句的代码生成。文件attach.c、delete.c、insert.c、select.c、update.c和vacuum.c处理具有相同名称的SQL语句的代码生成。(这些文件的每一部分会调用expr.c和where.c中的例程。)所有其他SQL语句都是从build.c中编写的。auth.c文件实现了sqlite3_set_authorizer()的功能。

Bytecode Engine  字节码引擎

由代码生成器创建的字节码程序由虚拟机运行。

虚拟机本身完全包含在单个源文件vdbe.c中。vdbe.h头文件定义了虚拟机与SQLite库的其余部分之间的接口,vdbeInt.h定义了虚拟机本身私有的结构和接口。其他各种vdbe*.c文件是虚拟机的助手。vdbeaux.c文件包含虚拟机使用的实用程序和库的其余部分用来构建VM程序的接口模块。vdbeapi.c文件包含虚拟机的外部接口,例如sqlite3_bind_int()和sqlite3_step()。单个值(字符串、整数、浮点数和BLOB)存储在名为“Mem”的内部对象中,该对象由vdbem.c实现。

SQLite使用C语言例程的回调来实现SQL函数。即使是内置的SQL函数也是这样实现的。大多数内置的SQL函数(例如:abs()、count()、substr()等)都可以在func.c源文件中找到。日期和时间转换函数可以在date.c中找到。有些函数,如coalesce()和typeof(),直接由代码生成器实现为字节码。

B-Tree b树

SQLite数据库使用btree.c源文件中的B树,实现在磁盘上维护。单独的B树用于数据库中的每个表和每个索引。所有的B树都存储在同一个磁盘文件中。文件格式细节是稳定和明确定义的,并保证向前兼容。

B树子系统和SQLite库的其余部分的接口由头文件btree.h定义。

Page Cache 页面高速缓存

B树模块以固定大小的页面从磁盘请求信息。默认的page_size是4096字节,但可以是512到65536字节之间的2的任意幂。页面缓存负责阅读、写入和缓存这些页面。页面缓存还提供回滚和原子提交抽象,并负责数据库文件的锁定。B树驱动程序从页面缓存中请求特定的页面,并在想要修改页面或提交或回滚更改时通知页面缓存。页面缓存处理所有混乱的细节,以确保请求得到快速、安全和有效的处理。

主页面缓存实现在pager.c文件中。WAL模式逻辑在单独的wal.c中。内存缓存是由pcache.c和pcache1.c文件实现的。页面缓存子系统和SQLite其余部分之间的接口由头文件pager.h定义。

主页面缓存实现在pager.c文件中。WAL模式逻辑在单独的wal.c中。内存缓存是由pcache.c和pcache1.c文件实现的。页面缓存子系统和SQLite其余部分之间的接口由头文件pager.h定义。

OS Interface OS接口

为了提供跨操作系统的可移植性,SQLite使用了一个称为VFS的抽象对象。每个VFS都提供了打开、阅读、写入和关闭磁盘上文件的方法,以及其他特定于操作系统的任务,如查找当前时间或获取随机性以初始化内置的伪随机数生成器。SQLite目前为unix(在os_unix.c文件中)和Windows(在os_win.c文件中)提供了VFS。

Utilities 公共的工具函数

内存分配、无大小写字符串比较例程、可移植文本到数字转换例程和其他实用程序位于util.c中。解析器使用的符号表由hash. c中的哈希表维护。utf. c源文件包含Unicode转换子例程。SQLite在printf.c中有自己的printf()私有实现(带有一些扩展),在random.c中有自己的伪随机数生成器(PRNG)。

Test Code 测试代码

源代码树的“src/”文件夹中名称以test开始的文件仅用于测试,不包含在库的标准构建中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/218824.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

010 数据结构_红黑树

前言 本文将会向你介绍红黑树的概念、性质,以及如何手撕红黑树 1 文章重点 文本首先引入红黑树的概念和性质,性质非常重要对于后面的插入操作来说,文章的核心放在了插入部分,另外看插入部分之前记得看声名和节点的定义哦~ 2 引…

如何让销售技巧培训更有效、更落地

如何让销售技巧培训更有效、更落地 如今各行各业都面临着产品过剩,产品不好卖!如何更好的把产品卖出去,更好的创造业绩。除了产品本身要符合市场需要,产品性价比高外,销售人员的销售技巧就非常重要。优秀的销售人员能…

流媒体方案之FFmpeg——实现物联网视频监控项目

目录 前言 一、FFmpeg介绍 二、FFmpeg简易理解 三、FFmpeg的重要概念 四、软硬件准备 五、移植、运行FFmpeg 六、运行FFmpeg 前言 最近想做一个安防相关的项目,所以跟着韦东山老师的视频来学习视频监控方案的相关知识,韦东山老师讲的课非常好&…

数据分享 I 2022年淘宝村名单数据,shp/excel格式数据,共7700多条数据,已可视化处理

今天分享2022年淘宝村名单数据,shp/excel格式数据,共7700多条数据! 淘宝村认定条件为电商年销售额达1000万元及以上的行政村(不含居委会) ;村活跃网店数达100个及以上,或活跃网店数达家庭户数10%及以上,就…

C++ day52 最长递增子序列 最长连续递增子序列 最长重复子数组

题目1:300 最长递增子序列 题目链接:最长递增子序列 对题目的理解 找出整数数组中最长严格递增子序列的长度 动态规划 动规五部曲 1)dp数组及下标i的含义 dp[i]:以nums[i]为结尾的最长递增子序列的长度 递增比较的时候&am…

初探Maven

文章目录 一、Maven概述二、安装配置Maven(一)下载Maven(二)安装Maven(三)配置Maven 三、IDEA里配置Maven(一)版本情况说明(二)配置构建工具Maven 一、Maven概…

PyQt6 QGroupBox分组框控件

​锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计37条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话…

Python 调用企业微信群机器人发送消息及文件

Python 操作企业微信群机器人。 企业微信群创建机器人 : 安装 requests json : pip install requests pip install json发送消息(markdown) import requests import json# 企业微信机器人发送文字 def send_markdown (message, …

el-table分页时多选数据的保存和回显

大致思路: 把所有选择的数据全部存到一个大数组中,切页的时候匹配原数据利用ref节点的.toggleRowSelection方法进行回显 具体步骤: 1、勾选和全选时需要判断是选中还是取消,然后更新大数组数据。 2、分页获取新数据之后匹配当…

初学Python基础后,如何制定学习计划?

如果你是Python小白,学完基础语法是个了不起的成就,但是接下来应该干嘛呢?你应该学习哪些内容?你应该如何规划你的Python学习路线? 其实这些问题的答案都取决于你的个人目标和兴趣。你想要用Python做什么?…

TIA博途中快速修改变量值的方法和技巧

TIA博途中快速修改变量值的方法和技巧 如下图所示,正常情况下选中该变量,然后右击选择“修改”—然后选择修改为0或1, 快速调试技巧: 如下图所示,鼠标选中该变量上方的“FALSE”,直接双击,系统会提示是否进行切换该变量的值, 点击“是”即可切换变量的值, 如下图所示,…

142. 环形链表 II

142. 环形链表 II 原题链接:完成情况:解题思路:参考代码:错误经验吸取 原题链接: 142. 环形链表 II https://leetcode.cn/problems/linked-list-cycle-ii/description/ 完成情况: 解题思路:…

CSS、JS文件无法正确加载至页面问题与解决

目录 1. 问题出现 2. 分析与解决 3. 总结 1. 问题出现 自己在写项目是时候,想启动浏览器查询首页面index.jsp的显示效果 预期效果应该是下面这样的: 但是实际上是这样的: 意思也就是说可能是关于CSS、JS相关的引入方面出了问题&#xff…

qt使用wimlib-imagex,做windows系统备份还原

wimlib-imagex是个第三方工具,可对系统映像进行操作,下载地址: https://wimlib.net/downloads/index.html 程序主要用到以下这两个文件:libwim-15.dll和wimlib-imagex.exe wimlib-imagex.exe的调用命令参数,可以通过…

Win环境中安装Jenkins指南

目录 安装Java环境 下载并安装Jenkins Jenkins版本 启动Jenkins 如何删除Jenkins 安装Java环境 访问 Oracle官方网站 下载并安装JDK 安装完成后,设置系统环境变量 JAVA_HOME 到你的 JDK 安装路径,并将 %JAVA_HOME%\bin 添加到系统 PATH 中。 下载…

SAP中的新旧事务码

SAP中的新旧事务码 SAP随着新版本的发布,我们知道sap已经更新了很多的程序和TCODE。sap提供了很多新的TCODE来替换旧的TCODE,新TCODE有很多的新特性和新功能。在这个这种情况下,很多旧TCODE就会被废弃。我们如何查找这个替换呢? …

什么是国际语音呼叫中心?国际语音呼叫中心能干什么?

1.什么是国际语音呼叫中心? 国际语音呼叫中心是指利用语音技术提供咨询、客服、销售、市场调研等呼叫中心服务的一种解决方案。与传统的呼叫中心相比,国际语音呼叫中心采用了更加高效、智能的呼叫技术,通过应用智能语音识别技术、自然语言处…

图解通信原理(以太网通信及物理层工作原理)

偶尔看到一篇对phy与mac讲解清楚的优秀文章,因此记录下来,此文章转发自知乎图解通信原理(以太网通信及物理层工作原理) - 知乎 概述 以太网是一种计算机局域网通信技术,主要由介质访问层(MAC L2) 协议、物理层&#…

采购透明拼接屏,需要注意些什么

在采购透明拼接屏时,需要注意以下几点: 尺寸和分辨率:根据实际应用需求选择合适的尺寸和分辨率。如果用于商业展示,需要选择较大的屏幕尺寸和较高的分辨率,以提供更好的视觉效果和观看体验。 透明度:透明…

企业微信配置可信域名

首先去申请一个域名,然后将域名绑定到有公网ip的云服务器上,绑定到具体的网站;然后再企业微信,管理后台,点击具体的应用,进【网页授权及JS-SDK】;点击底部的【申请校验域名】点击下载文件&#…