Compile SQLite3 from individual files
摘要:下载非Amalgamation SQLite3源码安装tcl, apt-get instal tcl解压mkdir buildcd build../configuremake#make sqlite3.c ###生成sqlite3.c, sqlite3ext.h, shell.c全部命令tar x...
阅读全文
SQLite学习(八) - 多个database文件事务的提交
摘要:SQLite允许一个database connection 通过ATTACH DATABASE命令连接到多个数据库。当一个事物需要更新多个database文件时,也要保证atomic commit 1. 每个database文件有各自的rollback journal文件 2. 创建master journal 文件,master journal文件名与database file文件名相同,再加上 “-mjHHHHHHHH" master journal文件中存放了每个rollback journal文件的路径 在做更改之前,master journal 需要被写到disk 3. 将
阅读全文
SQLite学习(七) - 虚拟机指令2
摘要:本文介绍SQLite虚拟机指令的版本是2.8.0. SQLite3 以及以后版本的虚拟机概念上是一样的。 但是一些操作码,操作数用法,个数有所改变,算法也有所不同。VDBE虚拟机语言,类似汇编语言,VDBE的每天指令由一个opcode 和3个operand组成(SQLite3以后有5个)。 下面看个例子来学习。1 INSERT SQLCREATE TABLE examp(one text, two int);INSERT INTO examp VALUES('Hello, World!',99);通过explain指令,我们可以得到这条INSERT SQL的VDBE指令$sql
阅读全文
SQLite学习(七) - 虚拟机指令1
摘要:为了执行SQL, SQLite首先解析分析SQL,生成一个由VM操作码组成的程序,类似汇编语言。SQLite虚拟机的实现代码在vdbe.c。 每个opcode的功能可以直接通过阅读源代码中的注释。SQLite每条指令的格式是: Opcode p1 p2 p3 p4p5一个opcode以及最多5个 operands(P1, P2 P3, P4, and P5),有些操作码使用所有的5个操作数,有的一个都不用,有的有1或2个。P1, P2, and P3 类型为 32-bit signed integers, 通常这些操作数指向寄存器P2 is always the jump destinatio
阅读全文
SQLite学习(三) - SQLite源代码文件结构2
摘要:SQLite结构以及代码1. Interface(main.c, legacy.c, and vdbeapi.c)对于开发人员开放的结构都实现在main.c, legacy.c, and vdbeapi.c。 其他一些比如sqlite3_get_table() - table.csqlite3_mprintf() - printf.c.sqlite3_complete() - tokenize.cTcl interface - tclsqlite.c2.Tokenizer(tokenize.c)当执行SQL,Interface将SQL传给Tokenizer,Tokenizer把原始的SQL字符
阅读全文
SQLite学习(六) - 如何实现原子提交
摘要:Atomic commit原子提交的实现1. 初始状态2. 请求一个read lockShared lock是加在OS buffer, 不是直接加在DISK上3. 然后从disk读取data到OS Buffer, 并存到User space中4. 请求一个reversed lock表示有更改数据库的意向, 真正的改动还 没有开始。reversed lock可以和多个shared lock共存,但是一个时间只能有一个reversed lock。即一个时间只能有一个进程或事物可以写数据库。5. 创建一个rollback journal文件将old数据写入rollback journal文件,还有更
阅读全文
SQLite学习(四) - 异步I/O的实现 sqlite3async.c
摘要:一般情况下,当我们的程序有I/O 操作需要写磁盘时,程序会等待I/O完成后才把程序控制还给用户。由于I/O是相对比较慢的,所以这有可能会成为性能瓶颈。 SQLite的异步I/O使用一个单独的线程完成I/O。 虽然这样没有减少系统资源的使用,但是控制权立刻返回给用户,更好的用户体验。1. 数据库ACID中的D使用异步I/O带来的一个问题就是失去了数据库的持久性(Durable) 特性。由于I/O在后台进行,你不知道什么时候I/O会完成。如果在I/O完成之前系统出现错误,后面的用户将看不到之前的改动。2. SQLIte的异步IO怎么工作的?(1) 创建一个VFS_Object(2) 用sqlite
阅读全文
SQLite学习(五) - SQLite的临时文件
摘要:SQLite现在使用7中临时文件Rollback journalsMaster journalsStatement journalsTEMP databasesMaterializations of views and subqueriesTransient indicesTransient databases used by VACUUM1. Rollback journals回滚日志文件,用于实现数据库的原子提交和回滚。此文件和数据库文件总是在同一个目录,并且有相同的文件名,但是在文件名中添加了一个-journal字符串。此文件一般在transaction开始时创建,transaction
阅读全文
SQLite学习(三) - SQLite源代码文件结构
摘要:SQLite Version3.3.6源代码文件结构文件名称大小byte备注APImain.c35414SQLite Library的大部分接口legacy.c3734sqlite3_exec的实现table.c5464the sqlite3_get_table() andsqlite3_free_table()的实现,它们是sqlite3_exec的包装preprare.c17983主要实现sqlite3_prepare()分词器部分(Tokenizer)tokenize.c14495分词器的实现语法分析器部分(Parser)parser.c116917分析器的实现,由Lemon实现pars
阅读全文
SQLite学习(二) - SQLite逻辑结构
摘要:SQLite主要由3个部分组成1、接口(Interface)接口由SQLite CAPI组成,也就是说不管是程序、脚本语言还是库文件,最终都是通过它与SQLite交互的(我们通常用得较多的ODBC/JDBC最后也会转化为相应CAPI的调用)。2、编译器(Compiler)在编译器中,分词器(Tokenizer)和分析器(Parser)对SQL进行语法检查,然后把它转化为底层能更方便处理的分层的数据结构---语法树,然后把语法树传给代码生成器(codegenerator)进行处理。而代码生成器根据它生成一种针对SQLite的汇编代码,最后由虚拟机(VirtualMachine)执行。3、虚拟机(
阅读全文
SQLite学习(一) - VS2008编译SQLite3070602
摘要:使用SQLite版本sqlite-3070602. 下载已经预编译处理过的版本sqlite-preprocessed-3071100.zip, 导入.h, .c文件, 直接编译会有一些错误,做如下改动就能编译通过1. 移除tclsqlite.c, tclsqlite.c用于生成基于TCL的API,如果需要编译,则需要另外下载tcl.h头文件;2. fts3*.c是全文索引的模块;打开菜单->Project->Settings->C/C++ -> Preprocessor definitions, 添加如下4个编译选项SQLITE_CORESQLITE_ENABLE_RT
阅读全文
SQLite学习(八) - SQLite C编程接口
摘要:SQLite C/C++ interface, sqlite3 functions
阅读全文