SQLite
文章平均质量分 88
偏test
这个作者很懒,什么都没留下…
展开
-
lemon源码分析
基本概念见上篇《lemon源码基本概念整理》1. follow集对于如下4条产生式 program ::= expr TK_SEM expr ::= expr TK_IMPL expr expr ::= TK_LPAREN expr TK_RPAREN expr ::= TK_NEG expr现在要求expr ::= TK_LPAREN expr TK_RPAREN*的follow集方法如下 exp原创 2021-03-07 19:16:15 · 737 阅读 · 0 评论 -
lemon源码基本概念整理
1 数据结构1.1 字符串存储定义一个x1a的全局变量,存放.y文件经过词法分析器分割出来的字符串struct s_x1 { int size; /* The number of available slots. */ /* Must be a power of 2 greater than or */ /* equal to 1 */ int count原创 2021-03-04 21:24:33 · 756 阅读 · 1 评论 -
SQLite源码学习(40) balance初步分析
主要分析balance_nonroot()函数里的代码1.iParentIdx和nxDiv的作用iParentIdx的来源是iIdx = pCur->aiIdx[iPage-1];在btree中查找叶子结点是从根结点开始一层层往下,iParentIdx就是查找到当前结点时,父结点对应第几个cell当孩子结点分裂成2半时,需要把一个cell移到父结点,这个cell对应的偏移地址由nxDiv决定,对应的代码如下 int nxDiv; /* Next di原创 2020-11-11 22:05:05 · 470 阅读 · 0 评论 -
SQLite源码学习(39) balance的一些准备工作
1.balacne的第一个判断条件if( pPage->nOverflow==0 && pPage->nFree<=nMin )pPage->nOverflow表示btree节点满了,需要分裂,pPage->nFree<=nMin原创 2020-11-08 13:19:02 · 403 阅读 · 0 评论 -
SQLite源码学习(38) 对表的一些处理
1.删除后进入balance()删除的记录在表的第2页,但是进入balance()函数后,为什么pCur->iPage是0?sqlite3BtreeFirst—>moveToRoot原创 2020-11-04 22:05:36 · 409 阅读 · 0 评论 -
SQLite源码学习(37) 页面格式
1.第一个cell的内容是怎么写进去的原创 2020-08-12 19:51:26 · 408 阅读 · 0 评论 -
SQLite源码学习(36) Btree杂记
1.在newDatabase函数中写入数据库头100字节时为什么不会把原来的覆盖掉关键代码如下: if( pBt->nPage>0 ){ return SQLITE_OK; }只有在数据库为空的时候才写入,不为空的时候直接返回了,不会往下执行。...原创 2020-08-09 13:46:46 · 533 阅读 · 0 评论 -
SQLite源代码编译调试
1.在msys上编译本文介绍的是windows平台,所以首先要安装msys2环境,这里就不细说了,具体可以参考下面这篇文章:https://blog.csdn.net/qiuzhiqian1990/article/details/56671839一开始要下载源代码,官网地址如下https://www.sqlite.org/download.html选择包含全部源文件的版本,11.93M的...原创 2020-03-08 17:39:39 · 2555 阅读 · 0 评论 -
SQLite3源码学习(26) Pager模块之日志管理
Pager模块作为作为一个事务管理器,需要保证事务提交的原子性,即写入数据要么完整写入,要么根本就没有写入,而不会出现只写到一半的情况。 但是磁盘的读写操作却不是原子的,有可能出现写到一半程序崩溃或断电而中断的情况。为此SQLite引入了日志回滚的机制保证事务的原子性。日志记录了事务在更新数据库文件之前的数据,如果此时发生异常中断,在下一次连接时会把日志里记录的原始数据还原回数据库文件。 关于原创 2018-05-04 10:40:22 · 1059 阅读 · 0 评论 -
SQLite3源码学习(24) Pager模块之事务锁的实现1
如果对SQLite事务的概念完全陌生,建议先阅读以下这篇文章来熟悉相关基础概念。SQLite的原子提交原理https://blog.csdn.net/javensun/article/details/8515690 SQLite支持多路并发的事务处理,这就需要一种机制来隔离一个事务相对于其他事务的影响。为了保证事务的隔离性,那么在并发的环境下,对于写数据库的操作就要串行化。而事务锁就是用来解...原创 2018-04-26 21:55:02 · 542 阅读 · 0 评论 -
SQLite3源码学习(27) Bitmap算法
1. 算法背景 假如有100个不重复的数存放在文件里,怎么确定某个数是否在这100个数中? 一般可以这样做,将这100个数读取到内存并存放在char a[100]的数组里,只需遍历这100个数即可。 那么假如有10亿个不重复的数呢,最大的数是2^32-1,这个时候显然内存存放不了那么多数,那么只能先将一部分数据读到内存,做完判断后再去读一部分数据,直...原创 2018-05-12 07:33:14 · 738 阅读 · 0 评论 -
SQLite中的Tcl测试脚本的一个bug
1.错误提示 在测试Pager模块时,把日志输出的宏PAGERTRACE打开时,发现再运行pager1.test时,出现如下错误E:\devc++\sqlite3\tclsqlite3\Debug\tclsqlite3.exe:expected boolean value but got "OPEN" while executing"if { [lindex $r 0] } { e...原创 2018-05-18 17:11:04 · 906 阅读 · 0 评论 -
SQLite3源码学习(25) Pager模块之事务锁的实现2
在上一篇文章中介绍了SQLite怎么用Linux中的记录锁来实现每一种类型的事务锁。但这只适合多进程间的互斥,不适合多线程,在Linux中每一个进程只能拥有一把锁,也就是说一个进程里的多个线程共用一把锁,这时会出现一个线程拥有共享锁,另一个线程再获取独占锁时并不会出现排斥,仅仅是把当前进程的锁改为独占锁,还有当一个线程占有锁的时候可能被另一个线程释放等等,这就破坏了数据库中多事务的隔离性。所以SQ...原创 2018-04-28 14:39:19 · 390 阅读 · 0 评论 -
SQLite3源码学习(31) WAL日志的锁机制
WAL的锁机制和回滚日志的文件锁有很大的不同。WAL的锁也分为共享锁和独占锁,但是根据锁在一个字节的8bit上掩码的位置不同又可以分为很多种 walLockShared(pWal, WAL_WRITE_LOCK):mask=(1<<1-1)<<WAL_WRITE_LOCK = 1<< 0 =1walLockShared(pWal, WAL_READ_LOCK...原创 2018-05-31 23:29:26 · 1225 阅读 · 2 评论 -
SQLite3源码学习(29) 用户事务和Savepoint
相关文章:SQLite3源码学习(26) Pager模块之日志管理SQLite3源码学习(27)Bitmap算法SQLite3源码学习(28) Pager模块之事务管理1.用户事务 在上一篇文章中主要介绍了读事务和写事务的基本流程,每执行一条SQL语句SQLite都会默认创建一个事务,执行完后会提交事务。如果有大批量的insert和update语句执行,那会不断地创建写事务和提交,这是一...原创 2018-05-29 09:29:36 · 1613 阅读 · 0 评论 -
SQLite3源码学习(28) Pager模块之事务管理
事务管理是Pager模块中最核心的要素,所有对数据库数据的读写操作都在事务中进行。一个数据库需要在多线程的使用环境下保持数据的一致性,虽然操作系统对磁盘的读写操作并不是原子,但是通过事务以及日志的回滚机制使每一个事务的执行都是原子的,所以即使出现系统崩溃或断电,数据库并不会因此而损坏。 在一个事务中,SQLite的Pager模块通过有机地结合文件锁,回滚日志和页缓存来实现...原创 2018-05-24 23:14:14 · 743 阅读 · 0 评论 -
SQLite3源码学习(32) WAL日志详细分析
在前面2篇文章讲了有关WAL日志相关的一些基础知识:SQLite3源码学习(31) WAL日志的锁机制SQLite3源码学习(30)WAL-Index文件中的hash表接下来分析一下在WAL日志模式下,整个事务的处理机制和流程1.原子提交事务管理最核心的特性就是满足原子提交特性,之前的回滚日志模式实现了这个特性,而WAL日志模式也实现了原子提交的特性。在WAL日志模式下有3个文件,分别是:1.数据...原创 2018-06-06 23:44:35 · 3534 阅读 · 1 评论 -
SQLite3源码学习(30) WAL-Index文件中的hash表
1. hash表格式 在SQLite提供了一种WAL(Write-Ahead Logging)的日志模式,不同于传统的日志模式,这种模式先把数据更新写到日志,当日志中的记录大到一定程度后再把日志中的记录刷新到数据库。 在这种日志模式中,读一页数据通常先在WAL日志中查找,如果找不到再从数据库读取。如果WAL日志文件特别大的时候,要在日志中查找某一页是否存在时是一个非常耗时的...原创 2018-05-31 19:15:04 · 788 阅读 · 0 评论 -
SQLite3源码学习(33) Pager模块中的相关问题和细节
1. getPageMMapgetPageMMap()函数是一个根据页号来获取文件数据页的函数,与之对应的是getPageNormal()函数。getPageNormal()需要通过read接口来向磁盘读数据页,而使用getPageMMap之前,需要调用CreateFileMappingW()让文件映射到内存,此时会返回一个句柄,再把句柄传入MapViewOfFile()从而取出内存地址放到pFd...原创 2018-06-11 10:37:38 · 633 阅读 · 0 评论 -
SQLite3源码学习(34) C语言命名规则和常用格式
1. 变量大部分结构体变量和局部变量都要加上前缀,后面是首字母大写的单词组合,大部分前缀具有通用意义,也有部分前缀是专用的。基本上在SQLite代码里大部分都是带前缀的变量。1.1通用前缀变量具有计算意义的整型变量要加前缀i,表示长度的变量加前缀sz,表示数量的加前缀n,指针变量加前缀p,数组或一片连续的地址空间要加a,判读是否的变量要加is,指针数组要加ap,字符串指针前要加z,二级指针要加pp...原创 2018-06-27 09:22:01 · 993 阅读 · 0 评论 -
Sqlite3源码学习(6)demovfs分析
demovfs是sqlite3里最简单的一个vfs实现,代码在demovfs.c里。这个文件里的函数就demoWrite()函数稍微复杂点,其他函数基本都很简单。 1.demovfs注册 Sqlitetest_demovfs_Init():注册register_demovfs和unregister_demovfs命令 register_demovfs():将demovfs注册到vfs链表中原创 2017-12-14 22:38:49 · 1344 阅读 · 0 评论 -
SQLite3源码学习(21) pcache1分析
学习本章之前要先复习以下2篇文章: SQLite3源码学习(9)Page Cache概述 SQLite3源码学习(10)testpcache分析 之前讲到page cache是一种可插入式的管理方式,在sqlite3GlobalConfig.pcache2里定义了对page cache管理的一系列方法接口,之前我们讲了最简单的一种接口testpcache,现在我们来分析一下默认的接口pach原创 2018-04-03 11:32:15 · 1132 阅读 · 0 评论 -
SQLite3源码学习(20) sqlite3VXPrintf分析
在上篇文章中我们讲了SQLite3中printf的基本框架,而其格式化字符串输出的核心是sqlite3VXPrintf()函数,本文就来详细分析sqlite3VXPrintf()函数的实现。由于支持的格式较多,所以只针对最常用的%d、%x、%f、%g做分析。 1.基本例子 下面举几个小例子,读者可以根据这几个例子来理解代码。 int a = 10; int b原创 2018-03-27 17:13:59 · 647 阅读 · 0 评论 -
SQLite3源码学习(9)Page Cache概述
Page cache是进程分配的内存空间,用来缓存数据页面。page cache的管理独立于操作系统,当一个线程打开一个数据库连接时就会建立一个page cache,对于一个进程中的多线程,它们可以有独立的cache也可以共享一个cahce,下图描述了page cache的结构: 在Pager初始化时为pPager->pPCache分配了空间,pPCache是PCache类型的结构体,其成员原创 2018-01-26 23:27:48 · 1907 阅读 · 0 评论 -
SQLite3源码学习(11)lookaside分析
1.概述 SQLite数据库连接会进行许多小的、短期的内存分配。当用sqlite3_prepare_v2()编译SQL语句时这种情况最常见。这些小的内存分配用来存储诸如表名和列名,解析树节点、单独的查询结果、B-Tree游标对象。这会导致频繁地调用malloc()和free(),用掉分配给SQLite的大部分CPU时间片。 SQLite引入lookaside来帮助减小分配内存的原创 2018-01-31 22:29:14 · 1183 阅读 · 0 评论 -
SQLite3源码学习(8)Pager模块概述及初始化
1.概述 当前端解析完SQL命令后,需要对数据库进行操作时,会通过B-Tree模块查找需要的页面,B-Tree维护着磁盘各页面之间的复杂关系,B-Tree不会直接读写磁盘,它会通过调用pager模块来获取所需的页面或修改页面,pager模块的作用可以说是B-Tree和磁盘读写的中间代理。 pager模块作为事务管理器,实现了数据库的ACID特性,从而支持并发控制和存储失败后的恢原创 2018-01-21 18:42:11 · 1464 阅读 · 0 评论 -
sqlite3源码学习(7) uri解析
uri全称(Uniform ResourceIdentifiers)即统一资源标识标识符,这是按一定规则组织的用来定位到具体资源的名称,有点类似于网址,关于uri的资料可以参考以下2篇文档: 官方的uri说明http://www.sqlite.org/uri.htmlUri详解之——Uri结构与代码提取http://blog.csdn.net/harvic88092原创 2017-12-24 10:15:02 · 1436 阅读 · 0 评论 -
sqlite学习笔记(4)使用TCL测试脚本
在sqlite3的源码目录下,有一个TEST文件夹,里面是tcl的测试脚本,对于代码里每个模块的学习,通过运行相应模块的tcl脚本,将有助于对代码的理解,本篇主要讲怎么搭建tcl的测试环境。 1.windows系统下的tcl平台 先下载下载activetcl 8.6.0.0b7 : http://dx.mqego.com/soft1/activetcl.zip 新建c工程,在源码环境搭建搭原创 2017-11-24 23:29:56 · 2442 阅读 · 0 评论 -
Sqlite3源码学习(5)OS的接口VFS
之前讲了那么多的环境搭建,现在终于可以学习源码了。官方有一篇讲解VFS的文档,对理解sqlite3的VFS有很大的帮助:http://www.sqlite.org/vfs.html 1.VFS简介 VFS也就是所谓的虚拟文件系统,因为sqlite3运行在不同的平台上会有不同的文件系统,VFS就是对不同的文件系统做一个统一的接口。 先来看一下一张图:原创 2017-12-03 15:51:25 · 4210 阅读 · 3 评论 -
sqlite学习笔记(2)源码环境搭建
sqlite学习笔记(2)源码环境搭建 sqlite3的源码有2种,一种是直接把所有代码合成一个sqite3.c文件,目前最新的版是 sqlite-amalgamation-3210000.zip ,另外一种是很多个源文件分开的。使用的时候建议使用第一种,直接把sqlite3.h和sqlite3.c加到工程里就可以了,但是看代码不好理解,而且eclipse对于太大的文件不能跳转或显示大纲,解原创 2017-11-03 23:17:12 · 1148 阅读 · 3 评论 -
sqlite学习笔记(3)用Doxygen辅助看代码
工欲善其事必先利其器,上一篇讲了用eclipse搭建源码环境,操作比较麻烦,图方便的可以下载我建好的工程。 由于sqlite3工程比较庞大,调用关系比较复杂,虽然eclipse有很强大的关键字搜索和函数调用关系搜索,但是看起来还是很累,现在借助Doxygen和GraphViz来生成函数调用关系图。 具体的基本操作步骤就不说了,可以参考以下链接,讲的很详细 http://blog.csdn.n原创 2017-11-10 22:02:22 · 804 阅读 · 0 评论 -
SQLite3源码学习(10)testpcache分析
testpcache是page cache的一个简单插件,用tcl调试时输入命令sqlite3_shutdown和sqlite3_config_alt_pcache 1就会把pcache1替换成testpcache。 testpcache由下列函数构成: static const sqlite3_pcache_methods2 testPcache = { 1, (vo原创 2018-01-28 14:44:56 · 495 阅读 · 0 评论 -
SQLite3源码学习(13) 底层内存分配器
SQLite的动态内存分配系统提供一个可选的底层内存分配器,在代码里是一个全局变量: sqlite3Config.m 其声明如下: sqlite3_mem_methods m; typedef struct sqlite3_mem_methods sqlite3_mem_methods; struct sqlite3_mem_methods { void *(*xMalloc)(i原创 2018-02-27 10:25:03 · 850 阅读 · 0 评论 -
SQLite3源码学习(14) 模拟静态变量
/* ** When SQLITE_OMIT_WSD is defined, it means that the target platform does ** not support Writable Static Data (WSD) such as global and static variables. ** All variables must either be on the s原创 2018-02-28 12:39:02 · 554 阅读 · 0 评论 -
SQLite3源码学习(19) printf的实现
在SQLite中并没有使用标准库的printf()函数,而是自己实现了printf的全部功能并针对不同的应用做了一层封装。所有相关代码在printf.c里,下面就来分析SQLite是如何实现自己的printf。 1.可变参数 可变参数是实现printf的基础,其声明格式如下: printf(const char *zFormat, ...) 在提取函数的参数时需要用到va_原创 2018-03-27 09:59:54 · 1648 阅读 · 0 评论 -
SQLite3源码学习(23) 链表的归并排序
一般数组排序采用快速排序最佳,但是在链表中2个元素的交换不是很方便,所以采用归并排序比较好,先把链表分割成一些已经排好序的子链表,最后再串起来就好了。在SQLite中对于脏页链表按照页号重新排序采用的就是归并排序。1.基本思路 子链表存放在一个临时数组里,这个数组定义为PgHdr *a[N_SORT_BUCKET]子链表是按照2的幂次方的大小依次存放,也就是说a[0]存放1个元素,a[1...原创 2018-04-08 23:48:36 · 372 阅读 · 0 评论 -
SQLite3源码学习(22) Page Cache分析
上一篇学习了pcache1的机制,这是pagecache管理的一个插件,在这基础上又封装了一层,主要是用来处理脏页(就是修改过的缓存页),如脏页的添加删除和回收利用等,这部分代码的实现在pcache.c里。1.数据结构在pcache中,通过PCache结构对象作为连接句柄,每个缓存页通过PgHdr来表示。在pagecache中,所有的脏页通过一个双向链表来连接在一起,其结构关系如下图所示: ...原创 2018-04-08 22:00:16 · 850 阅读 · 0 评论 -
SQLite3源码学习(15) 零-内存分配器buddy算法
1.概述 SQLite开发者称它为"memsys5",这个内存分配器的实现不依赖于malloc,实现在mem5.c里,使用时需要打开SQLITE_ENABLE_MEMSYS5编译选项,应用程序在启动时还要调用以下接口: sqlite3_config(SQLITE_CONFIG_HEAP, pBuf, szBuf, mnReq); 其中pBuf为初始内存,szBuf为初始内存大小,mnReq为原创 2018-03-03 20:45:06 · 845 阅读 · 0 评论 -
SQLite3源码学习(18) 互斥锁
互斥锁是为了保证在多线程时一些不可重入函数执行的串行化,有些函数如malloc等会操作一些共享数据,如果被重入了就会导致共享资源被破坏,从而出现逻辑错误,所以如果有多个线程对共享资源的访问就要加互斥锁。互斥锁部分的代码还是比较简单的,代码实现在mutex.c、mutex_w32.c、mutex_unix.c和mutex_noop.c这几个文件里,另外还有一个test_mutex.c文件做mutex...原创 2018-04-30 23:08:54 · 1673 阅读 · 0 评论 -
SQLite3源码学习(17) test_vfs的共享内存机制
VFS的IO接口里提供了文件的共享缓存机制,在test_vfs里内置了一个Shared memory模块用来模拟测试文件的共享缓存,而不是使用原来的VFS提供的接口。 1.结构定义 pFd结构 每一个数据库文件的连接都对应着一个连接句柄pFile,上层函数调用VFS接口时会传入pFile,在test_vfs里pFile会被强制转换为Testvf原创 2018-03-19 00:08:51 · 654 阅读 · 0 评论