1.sqlite怎样利用查询结果来创建新表?码分
2.使用SQLite数据库加密敏感信息嵌入程序(3)
3.Python程序开发系列利用Peewee库创建SQLite数据库、建表并写入数据(案例+源码)
4.linux中sqlite数据库的码分简单使用
5.SQLite查询大型数据集优化之CursorWindow
6.独家食用指南系列|Android端SQLCipher的攻与防新编
sqlite怎样利用查询结果来创建新表?
当我们讨论sqlite时,如何利用查询结果创建新表是码分一个关键点。若要解答这一问题,码分我们需对sqlite的码分内部运作有深入理解。以《教父》中的码分iapp源码ui模版名言作为引子,表明了慷慨与个人情感的码分联系,这里我们则将慷慨理解为对知识的码分热爱与分享。在忙碌的码分生活中,徒步成为了一种放松方式,码分尽管心中仍有未解之症结,码分但户外的码分风景与人情带来了一丝慰藉。工作与生活并重,码分自我成长与进步是码分追求的目标。
在没有担任团队领导(TL)后,码分内心可能有失落感,但这也促使了对sqlite源码的探索。学习规划与安排工作,使思路更加条理化,这是一种自我提升的过程。同时,享受生活与做好工作并行不悖。
近期的更新较为缓慢,原因在于深入研究sqlite源码,理解其核心部分,例如VBE与树结构的组织。我们采用情景分析的方法,从创建表开始,梳理创建表的流程,进而理解VBE的运行流程和数据存储方式。sqlite在解析SQL语句时使用了名为lemon的解析器与生成器,这一细节在知乎上有详细介绍。
无需深入解析词法分析的细节,重要的是理解如何从输入的SQL语句跳转到功能实现,通过查看解析器的工作方式。让我们一起探索,从创建表的实现开始。
创建表的关键SQL语句是:
sql
CREATE TABLE PERSON(ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL);
选择这一语句是因为它能展示不同数据类型的处理,并保持简单。在处理输入时,函数process_input负责逐行处理,树莓派4源码直至完成语句。在函数执行过程中,我们关注到runOneSqlLine,这是将SQL语句翻译为sqlite3_stmt并执行的关键步骤。这一过程涉及sqlite3_prepare_v2、sqlite3LockAndPrepare、sqlite3Prepare、sqlite3RunParser、sqlite3Parser等函数。
解析SQL语句的核心在于一个名为yyParser的结构,它构建了一个符号表,用于标识SQL语句。搜索关键词“create table”导向了关键代码片段,揭示了创建表函数的调用过程。关注sqlite3StartTable与sqlite3EndTable,理解它们在创建新表记录中的作用。这些函数负责在内存中构建新的表表示,尤其在“CREATE”和“TABLE”出现时被调用。在创建表结束时,sqlite3EndTable()完成构建过程。
创建表的实现涉及函数调用和信息填充,确保新表记录正确初始化。理解这一过程是解答如何利用查询结果创建新表的关键。关注细节,如参数传递与函数逻辑,对于深入学习sqlite源码至关重要。
使用SQLite数据库加密敏感信息嵌入程序(3)
在前两篇文章中,我们探讨了如何使用工具和原生函数生成SQLite数据库,以及如何将生成的数据库作为资源嵌入到程序中使用。目标是实现程序运行时直接在内存中读取敏感信息,无需将资源保存到临时文件再获取信息的繁琐步骤。实现这一目标的关键在于SQLite的跨平台利器——虚拟文件系统(VFS)。
VFS是SQLite底层与操作系统交互的关键,它提供了一种抽象的文件系统接口,使得SQLite能够在不同操作系统上一致地工作。每当SQLite需要与操作系统通信时,它会调用VFS中的方法,VFS则调用具体的操作代码以满足请求。因此,将SQLite移植到新的通信公司网站源码操作系统仅需编写新的操作系统接口层,也就是“VFS”。
SQLite支持多个VFS,每个VFS都有唯一的名称,并且同一进程中的数据库连接可以同时使用不同的VFS。Windows版本自带多个内置VFS,其中“win”适用于大多数应用程序。VFS在SQLite源码中通过sqlite3_vfs对象结构定义。
要实现标准VFS,可以子类化三个对象:sqlite3_vfs(操作系统接口对象)、sqlite3_io_methods(操作系统接口文件虚拟方法对象)、sqlite3_file(操作系统文件对象)。实现时只需子类化sqlite3_vfs和sqlite3_io_methods,而sqlite3_file对象代表一个打开的文件。
sqlite3_file对象在打开文件时由sqlite3_vfs的xOpen方法构造,它跟踪文件状态,包含指向sqlite3_io_methods对象的指针,该指针仅适用于当前sqlite3_file对象。sqlite3_io_methods对象执行文件读写、大小查找、锁定与解锁、文件关闭等操作。
新构造的sqlite3_vfs通过sqlite3_vfs_register函数注册,sqlite3_file对象则从sqlite3_vfs的xOpen方法返回,指向一个sqlite3_io_methods对象实例。SQLite源码中定义了sqlite3_io_methods和sqlite3_file结构。
TBNSQLiteFile和TBNSQLiteVfs结构是Delphi版中用于实现SQLite文件和VFS的子类化接口。TBNSQLitFile结构扩展了sqlite3_file接口,增加了额外字段如实际路径、数据缓冲区和访问标志等。TBNSQLiteVfs结构实现自定义的sqlite3_vfs,构建了一个链表结构,用于管理VFS。
为了方便读取嵌入程序中的SQLite数据库,我们实现了一个名为TBNSQLitIoMethodUtils的类,作为sqlite3_io_methods的子类化实现。这个类主要实现了xRead和xFileSize方法,用于读取数据库文件数据。其他方法如xWrite等因为操作为只读性质,此处忽略实现,返回值为SQLITE_OK即可。美优图源码实现代码通过静态方法简化,以匹配SQLite原生函数调用方式。
总结,通过精心设计的VFS、文件对象和IO方法实现,我们能够高效、安全地将敏感信息存储在嵌入程序的SQLite数据库中,并在程序运行时直接在内存中读取,无需额外的文件操作步骤。接下来,我们将深入探讨如何实现TBNSQLiteVfsUtils类以进一步优化VFS功能。
Python程序开发系列利用Peewee库创建SQLite数据库、建表并写入数据(案例+源码)
本文将使用Python编程语言中的Peewee库来创建一个SQLite数据库、建立表格并写入数据。以下是详细步骤:
首先,理解Peewee库,这是一款轻量级的ORM(对象关系映射)库,简化了与关系型数据库的交互过程。Peewee支持多种数据库,包括SQLite、MySQL、PostgreSQL等。它的核心功能包括简化数据库操作,使其在Python中使用更加便捷和高效。
接着,我们关注SQLite数据库。SQLite是一种嵌入式的轻量级数据库管理系统,无需单独服务器进程,其数据文件存储于本地,适用于小型应用和移动应用。其优点包括占用资源少、支持多种操作系统等。以下关键特性展示了SQLite的优势:
接下来,我们实现数据库的创建、表设计、表创建和数据插入:
第一步,利用`SqliteDatabase`类在项目目录中创建SQLite数据库文件。
第二步,设计一个名为`Person`的表,包含`name`(字符类型)和`age`(整型)两个字段。流量卡hmtl源码
第三步,通过执行`create_table`函数建立上述设计的`Person`表。
第四步,将列表中的元素依次写入到`Person`表的`name`字段。
最后,小结:本文通过Peewee库成功创建了SQLite数据库,设计和构建了`Person`表,并将数据写入了表中。本文旨在通过简单的实例,展示如何使用Peewee和SQLite进行基本的数据库操作。如果你对数据算法、Python编程、数据分析、机器学习、深度学习等领域感兴趣,欢迎关注公众号“数据杂坛”,获取更多源码和数据集。如需深入学习和实践,推荐查看原文链接。希望本文能为你的编程之旅提供帮助。
linux中sqlite数据库的简单使用
一、数据库的安装
1. 网络安装:配置好网络源后,使用命令 sudo apt-get install sqlite3 安装。
2. 使用deb包安装:使用命令 sudo dpkg -i *.deb 安装三个deb包。
3. 使用源码包安装:首先解压文件 tar xzf sqlite-autoconf-.tar.gz,然后执行 ./configure,接着执行 make && make install。
二、SQLite命令
1. 创建数据库:执行命令 sqlite3 company.db。
2. 帮助:使用命令 .help。
3. 退出:使用命令 .quit。
4. 显示当前数据库文件:使用命令 .database。
5. 显示所有表名:使用命令 .tables。
6. 查看表结构:使用命令 .schema。
7. 控制显示格式:使用命令 .mode column 和 .header on。
三、SQLite数据类型
数据类型包括:null、integer、real、text、blob。
表结构包括:行(记录)、列(字段)、值(字段值)。
四、SQL命令
1. 创建表(主键):使用命令 create table table_name( column1 datatype primary key, column2 datatype, ... columnn datatype, );。
2. 删除表:使用命令 drop table table_name;。
3. 插入数据:指定列插入使用命令 insert into table_name (column1, column2, ...columnn) values (value1, value2, ...valuen);,所有列插入使用命令 insert into table_name values (value1,value2,value3,...valuen);。
4. 查询语句:查询所有使用命令 select * from table_name;,查询指定列使用命令 select column1, column2, ...columnn from table_name;,条件查找使用命令 select * from table_name where ...;。
5. 删除记录:使用命令 delete from table_name where condition;。
6. 修改记录:使用命令 update table_name set column1 = value1, column2 = value2,..., columnn = valuen where condition;。
五、Linux编程接口
1. 打开数据库:使用函数 sqlite3_open(char *path, sqlite3 **db);。
2. 关闭数据库:使用函数 sqlite3_close(sqlite3 *db);。
3. 执行SQL语句:使用函数 sqlite3_exec( sqlite3 *db, const char *sql, int (*callback)(void*,int,char**,char**), void *arg, char **errmsg );。
4. 不使用回调函数执行SQL语句:使用函数 sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int*nrow, int *ncolumn, char **errmsg);。
学习嵌入式物联网需要全面的知识,选择正确的学习路径至关重要。获取最新、全面的学习资料,可点击链接找小助理免费领取。
SQLite查询大型数据集优化之CursorWindow
《SQLite权威指南》曾提到,在3英寸到4英寸的屏幕上显示上千行数据是不现实的。然而,业务需求可能需要处理如此大规模的数据,这会导致查询大型数据集变得极其缓慢。若使用CursorAdapter,问题可能更加严重。让我们深入探讨这个问题的根源和解决方法。
1. 问题的起源:在查询包含条记录的数据库表时,只读取了条记录,耗时达到了秒。这导致了查询性能的严重下降,无法满足实际需求。
SQL语句:`SELECT column1..column FROM table1 WHERE type = 2 OR type = 4;`
业务代码简单地创建了一个对象,并将每一列的值读取出来。
1.1 时间消耗在哪里了?:查询的执行涉及到多次调用SQLiteQuery.fillWindow方法。SQLiteCursor通过CursorWindow管理数据,CursorWindow封装了2MB内存,用于存放从SQLite3查询出的数据。当查询的数据集大小超过了CursorWindow的容量时,Cursor将会多次调用fillWindow方法。fillWindow方法从查询的数据集中提取数据放入CursorWindow中。
1.1.1 多次调用SQLiteQuery.fillWindow:SQLiteCursor的性能瓶颈在于此。
1.1.2 JNI间的数据转换:Java层的CursorWindow是Native层CursorWindow的一个封装,它记录了Native层CursorWindow的地址。因此,像`cursor.getString()`这样的方法,实际上通过JNI将C层的对象转换为Java对象进行赋值。
2. 为什么这么慢?:通过源码分析,我们可以深入了解Android系统如何查询数据库数据。
2.1 SQLiteDatabase.query:首先,分析SQLiteDatabase类中query函数的流程。SQLiteDatabase.query只构造查询信息并返回Cursor对象,而不执行实际的查询操作。
2.2 SQLiteQuery.fillWindow —— 真正耗时的地方:真正查询数据库数据的实现位于SQLITECONNECTION.CPP中的exectorForCursorWindow方法中。fillWindow方法的调用顺序涉及多次从查询结果数据集中提取数据。每次执行fillWindow时,会清空CursorWindow,然后从查询结果的第一条记录开始遍历数据集,依次将每行数据复制到CursorWindow中。在内存空间满或指定记录不在范围内时,会清空CursorWindow继续遍历。
2.3 Cursor.onMove —— 刷新CursorWindow的时机:Cursor Move相关流程涉及判断请求查询的位置是否在cursorWindow范围内。如果在范围内,不会执行fillWindow方法;如果超出范围,Cursor会调用fillWindow方法更新CursorWindow数据。
2.4 源码分析总结:由于CursorWindow的2MB内存大小限制,查询大型数据集时,必须严格控制查询结果数据集的大小。数据集过大时,执行fillwindow方法的性能损耗将严重。具体数据说明见第四章实验数据。
3. 优化方案:通过深入分析,我们针对微云云相册业务数据,明确了2MB的CursorWindow最多只能容纳多条记录。优化方案如下:
1. 避免多次遍历查询结果,只需执行一次fillwindow方法,减少无效的sqlite3_step操作。
2. 对于不急需的数据,可以暂时在C层保存,特别是字符串数据。
具体优化方案为:在遍历查询结果数据集时,针对每条记录在C层直接生成一个对象。然后利用CursorWindow将对象的指针地址返回给Java层。在此方案中,CursorWindow中每行数据只存放了一个Long型数值,使得CursorWindow足够存储几十万条数据,避免了无效的fillwindow性能消耗。
4. 实验结果:通过实验对比,我们可以看到优化方案显著提升了查询性能。实验数据显示,Android系统在查询性能及时间上的性能损耗随着查询结果数据集的增大而急剧下降,而优化方案使得查询性能不受数据集大小的影响,查询耗时得到了明显的提升。
独家食用指南系列|Android端SQLCipher的攻与防新编
欢迎来到本周技术拆解官的第二篇独家食用指南系列,主题聚焦于Android端的SQLCipher。如果您之前未了解过,可以回顾上篇指南进行预习。
本篇指南将带领大家重新审视SQLCipher,一个在安全性方面为Android SQLite数据库加密的工具。首先,让我们了解一下SQLite的优缺点,作为分析SQLCipher的基础。
SQLite作为轻量级数据库,具备易用性、易安装等优点,但也有性能和安全性上的局限。性能问题主要在于它在大并发、复杂查询等场景下可能遇到性能瓶颈;安全性方面,免费版本不支持加密,导致数据在未加密状态下容易被访问。
为解决这些问题,我们可以从性能优化和安全加固两个方面入手。性能优化包括改善并发机制、使用连接池、开启WAL模式等,以提升数据库读写效率。安全加固则推荐使用SQLCipher,通过加密数据库,保障数据安全。
SQLCipher基于SQLite接口设计,采用AES加密算法,提供安全加密数据库功能。它通过自定义的接口实现加密流程,加密过程分为写操作时的数据加密和读操作时的数据解密。使用SQLCipher时,主要涉及类替换和加载加密SO库两个步骤,无需侵入原有APP逻辑。
在调试SQLCipher方面,Linux环境下的安装和生成加密库较为基础,可通过SQLiteStudio等工具进行可视化操作。最后,企业级应用在使用SQLCipher时通常会有额外的安全防护措施,例如百度汉语APP在数据库加载和秘钥获取上采取了多层保护。
本指南从原理、实战角度出发,详细介绍了SQLCipher的使用方法和安全加固流程。随着指南的深入,我们即将进入关于SQLite源码剖析的最后一篇,敬请期待。
在探索SQLCipher的过程中,我们不仅仅学习了如何使用这个工具,更重要的是理解了如何在实际应用中保护数据安全,为构建可靠的应用奠定基础。希望本指南对您的技术旅程有所帮助,期待您在实际项目中应用所学知识。
node-pre-gyp以及node-gyp的源码简单解析(以安装sqlite3为例)
在Node.js开发中,确保模块跨平台性至关重要,尤其当涉及到使用C/C++原生代码的模块,如SQLite3。让我们通过一个实例来理解安装这种原生模块的过程,以SQLite3为例。项目初始化
首先,创建一个基础的Node.js项目,我们开始安装SQLite3。安装SQLite3
执行安装命令后,你会看到命令行输出关键信息:node-pre-gyp的引入
在安装过程中,你会遇到node-pre-gyp,这个工具与node-gyp和gyp紧密相关。gyp是一个用于生成项目文件的构建工具,它为Chromium项目生成IDE项目文件,如Visual Studio和Xcode。而node-gyp则是专为Node.js Addons(原生模块)编译设计的,它允许在本地编译C/C++代码。node-pre-gyp的作用
为了简化每次安装时的平台编译工作,node-pre-gyp允许预先为常见平台生成二进制文件。当项目尝试安装时,它会优先查找预编译的二进制包,如果找不到,才会转而依赖node-gyp进行源码编译。安装流程
当我们使用`npm install sqlite3`时,实际上执行了`node-pre-gyp install --fallback-to-build`。安装流程包括:检查node-pre-gyp是否已安装,如果没有,npm会自动安装。
node-pre-gyp查找预编译二进制包,如果存在,则直接使用。
如果没有找到,使用node-gyp进行源码编译。
深入了解SQLite3安装
查看sqlite3的package.json,`scripts`部分包含了`node-pre-gyp install`命令。npm会根据这个脚本执行安装过程。源码编译与node-gyp
node-gyp的`build.js`负责执行编译任务,通过`gyp`工具生成特定平台的项目文件,如Windows的vcxproj,然后使用MSBuild编译。node-pre-gyp与node-gyp的交互
node-pre-gyp的`do_build`模块调用node-gyp build,执行具体的编译操作,确保模块能在目标平台上正确工作。å¦ä½ç¼è¯SQLite-How To Compile SQLite
SQLiteæ¯ANSI-Cçæºä»£ç ãå¨ä½¿ç¨ä¹åå¿ é¡»è¦ç¼è¯ææºå¨ç ãè¿ç¯æç« æ¯ç¨äºåç§ç¼è¯SQLiteæ¹æ³çæåã
è¿ç¯æç« ä¸å å«ç¼è¯SQLiteçæ¯ä¸ªæ¥éª¤çåé¦ï¼é£æ ·å¯è½ä¼å°é¾å 为æ¯ç§å¼ååºæ¯é½ä¸åãæ以è¿ç¯æç« æè¿°åéè¿°äºç¼è¯Sqliteçååãå ¸åçç¼è¯å½ä»¤å·²ç»ä½ä¸ºä¾åæä¾äºï¼ä»¥ææåºç¨å¼åè è½å¤ä½¿ç¨è¿äºä¾åä½ä¸ºå®æä»ä»¬èªå·±å®å¶çç¼è¯è¿ç¨ççä¸ä¸ªæåãæ¢å¥è¯è¯´ï¼è¿ç¯æç« æä¾äºæ³æ³åè§è§£ï¼èä¸æ¯äº¤é¥åç解å³æ¹æ³ã
èåVSåç¬æºæ件
Sqliteæ¯ç±è¶ è¿ä¸ç¾ä¸ªcæºç æ件以åä¼å¤çç®å½ä¸çèæ¬æ建çãSqliteçå®ç°æ¯çº¯ç²¹çANSI-Cï¼ä½æ¯è®¸å¤Cè¯è¨æºä»£ç æ件æ¯ç±è¾ å©çCç¨åºçææè 转æ¢æ¥çï¼å¹¶ä¸AWKï¼SEDåTCLèæ¬ä¼èåå°å®æçsqliteåºä¸ã对Sqliteæ建éè¦çCç¨åºå转æ¢åå建Cè¯è¨æºç æ¯ä¸ä¸ªå¤æçè¿ç¨ã
为äºç®åè¿äºï¼sqliteä¹éè¿ä¸ä¸ªé¢æå çå并åçæºç æ件ï¼sqlite3.cãè¿ä¸ªå并æ件æ¯ä¸ä¸ªANSI-Cæºç å®ç°æ´ä¸ªSQLiteåºçå¯ä¸æ件ãå并åçæ件æ´å®¹æå¤çãææçä¸è¥¿é½å å«å¨è¿ä¸ä¸ªæ件éï¼æ以å¾å®¹æè¿å ¥ä¸ä¸ªæ´å¤§çCæè C++ç¨åºçæºç æ ãææç代ç çæå转æ¢æ¥éª¤é½å·²ç»å®ç°äºï¼å æ¤æ²¡æè¾ å©çCç¨åºéè¦å»é ç½®ååå¼ï¼ä¹æ²¡æèæ¬éè¦å»è¿è¡ã并ä¸ï¼å æ¤ææåé½å å«å¨ä¸ä¸ªç¿»è¯åå ï¼ç¼è¯å¨å¯ä»¥åæ´å¤é«çº§çä¼åä»èæå5%å°%çæ§è½ãå 为è¿äºåå ï¼èååçæºç æ件sqlite3.c对ææç¨åºæ¥è®²é½æ¯å¼å¾æ¨èçã
æ¨èææçåºç¨ç¨åºä½¿ç¨èåæ件ã
ç´æ¥ä»åç¬çæºç æ件ä¸æ建sqliteå½ç¶å¯ä»¥ï¼ä½æ¯å¹¶ä¸æ¨èã对ä¸äºç¹æ®çåºç¨ç¨åºï¼å¯è½éè¦ä¿®æ¹æ建ç¨åºå»å¤ç使ç¨é£äºä»ç½ç«ä¸ä¸è½½çé¢æ建çæºç æ件ä¸è½å®æçæ åµã对äºè¿äºæ åµï¼æ¨èæ建å使ç¨ä¸ä¸ªå®å¶è¿çå并æ件ãæ¢å¥è¯è¯´ï¼å³ä½¿ä¸ä¸ªå·¥ç¨éè¦ä»¥åç¬çæºç æ件æ建sqliteï¼ä»ç¶æ¨è使ç¨ä¸ä¸ªèååçæºç æ件ä½ä¸ºä¸ä¸ªä¸é´æ¥éª¤ã
ç¼è¯å½ä»¤è¡æ¥å£ï¼CLIï¼
æ建å½ä»¤è¡æ¥å£éè¦ä¸ä¸ªæºç æ件ï¼
sqlite3.c:Sqliteèåçæºç æ件
sqlite3.h:å¹é sqlite3.c以åå®ä¹sqliteçcè¯è¨æ¥å£ç头æ件
shell.c:å½ä»¤è¡æ¥å£ç¨åºæ¬èº«ãè¿ä¸ªcæºç æ件å å«ä¸ä¸ªmain()çä¾ç¨åæ¯è½®å¾ªç¯çç¨æ·è¾å ¥çæ示符并å°è¾å ¥ä¼ ç»sqliteæ°æ®åºå¼æç¨äºå¤çã
ææçä¸è¿°æºç çä¸ä¸ªæ件é½è¢«å å«å¨ä¸è½½é¡µé¢çamalgamation tarballä¸ã
为äºæ建CLIï¼ç®åçå°è¿ä¸ä¸ªæ件æ¾ç½®å¨ç¸åçç®å½ä¸ç¶åä¸èµ·ç¼è¯ä»ä»¬ãç¨MSVCï¼
cl shell.c sqlite3.c -Fesqlite3.exe
å¨unixç³»ç»ä¸ï¼æè å¨windowsä¸ç¨cygwinæè mingw+msysï¼å ¸åçå½ä»¤ä¼æäºåè¿æ ·ï¼
gcc shell.c sqlite3.c -lpthread -ldl
为äºSQLite线ç¨å®å ¨ï¼éè¦pthreadsåºãä½æ¯å 为CLIæ¯ä¸ä¸ªå线ç¨çï¼æ们å¯ä»¥æ示SQLiteæ建ä¸ä¸ªé线ç¨å®å ¨çåºå¹¶å æ¤æ¤ç»¿pthreadsåºï¼
gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl
-ldlåºæ¯å¨æ¯æå¨æè£ è½½æ¶éè¦ï¼ä¾å¦sqlite3_load_extension() æ¥å£åload_extension()
SQL functionãå¦æè¿äºç¹æ§é½ä¸è¦æ±ï¼é£ä¹æ们ä¹å¯ä»¥ä½¿ç¨SQLITE_OMIT_LOAD_EXTENSIONç¼è¯æ¶é´é项忽ç¥ä»ä»¬ã
gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c
æ人å¯è½æ³è¦æä¾å ¶ä»çç¼è¯æ¶é´é项(compile-time options)ï¼ä¾å¦SQLITE_ENABLE_FTS3å»å ¨ææ¬æç´¢æè SQLITE_ENABLE_RTREEç¨äºR*æ æç´¢å¼ææ©å±ãèæ人å°æ£å¸¸æå®ä¸äºç¼è¯ä¼åå¼å ³ãï¼é¢ç¼è¯çCLIå¯ä»¥ä»éæ©sqliteç½ç«ä¸ä½¿ç¨â-Osâä¸è½½ä¸æ¥ï¼ææ æ°ç§å¯è½çåæ°å¨è¿éã
å ³é®ç¹å¨è¿éï¼æ建CLIéè¦ç¼è¯ä¸èµ·ä¸¤ä¸ªCè¯è¨æ件ãshell.cæ件å å«å ¥å£çå®ä¹åç¨æ·è¾å ¥çloopï¼èsqliteèåæ件sqlite3.cå å«å®æ´çsqliteåºçå®ç°ã
ç¼è¯TCLæ¥å£
sqliteçtclæ¥å£æ¯ä¸ä¸ªå°ç模å被添å å°ä¸è¬çèåæ件ä¸ãç»ææ¯ä¸ä¸ªæ°çèååçæºç æ件ï¼ç§°ä¹ä¸ºâtclsqlite3.câãè¿ä¸ªæºç æ件æ¯çæä¸ä¸ªå¯ä»¥ä½¿ç¨TCL
loadå½ä»¤å»å è½½å°ä¸ä¸ªæ åçtclshæè wishä¸ï¼æè éçsqliteæ建æåçæä¸ä¸ªåç¬å¯ä¸çtclshçå ±äº«åºæéè¦çãä¸ä¸ªtclçèåçå¯æ¬è¢«å å«å¨ä¸è½½é¡µçTEA
tarballä¸ä½ä¸ºä¸ä¸ªæ件ã
为äºçæä¸ä¸ªlinuxä¸çsqliteçTCL-loadableåº,ä¸é¢çå½ä»¤éè¦æ»¡è¶³ï¼
gcc -o libtclsqlite3.so -shared tclsqlite3.c -lpthread -ldl -ltcl
ä¸å¹¸çæ¯æ建Mac OS X å Windowsçå ±äº«åºå¹¶ä¸æ¯å¦æ¤ç®åã对äºè¿äºå¹³å°æ好使ç¨å å«å¨TEA tarballä¸çconfigureèæ¬åmakefile.
为äºçæä¸ä¸ªåç¬çtclshï¼å¯ä»¥ç¨äºsqliteéæé¾æ¥ï¼ä½¿ç¨å¦ä¸çç¼è¯å¨è°ç¨ï¼
gcc -DTCLSH=1 tclsqlite3.c -ltcl -lpthread -ldl -lz -lm
è¿éçæå·§æ¯-DTCLSH=1é项ãsqliteçTCLæ¥å£æ¨¡åå å«ä¸ä¸ªmainçè¿ç¨ï¼ç¨äºåå§åä¸ä¸ªTCL解éå¨å¹¶å¨ä»¥-DTCLSH=1ç¼è¯åè¿å ¥å°ä¸ä¸ªå½ä»¤è¡loopãä¸è¿°å½ä»¤å¯ä»¥å·¥ä½å¨LinuxåMac
OS X,è½ç¶ææ¶å¯è½éè¦ä¾èµäºå¹³å°è°æ´åºé项以åç¼è¯çTCLçåªä¸ä¸ªçæ¬ã
æ建èåæ件
ä¸è½½é¡µæä¾çsqliteèåæ件ççæ¬å¯¹å¤§å¤æ°ç¨æ·æ¥è¯´æ¯è¶³å¤çãç¶èï¼ä¸äºå·¥ç¨å¯è½æ³è¦æè éè¦æ建ä»ä»¬èªå·±çèåæ件ãä¸ä¸ªå¸¸è§çæ建ä¸ä¸ªå®å¶çèåæ件ççç±æ¯ä¸ºäºä½¿ç¨ç¹å®çcompile-time optionsæ¥å®å¶sqliteåºãåæ³sqliteèåæ件ä¸å å«äºè®¸å¤C代ç ç±è¾ å©ç¨åºåèæ¬çæã许å¤çç¼è¯æ¶é´é项影åè¿ä¸æå£ä»£ç èä¸å¿ é¡»å¨èåæ件ç»è£ åæä¾ç»ä»£ç çæå¨ãè¿ä¸ç³»åå¿ é¡»ä¼ ç»ä»£ç çæå¨çç¼è¯æ¶é´ç¸å ³çé项ä¼ä½¿å¾sqliteçåå¸çæ¬åä¸ç¸åï¼ä½æ¯å¨åè¿è¾¹æç« çæ¶åï¼ä»£ç çæå¨éè¦ç¥éçè¿ç»é项å æ¬ï¼
SQLITE_ENABLE_UPDATE_DELETE_LIMIT
SQLITE_OMIT_ALTERTABLE
SQLITE_OMIT_ANALYZE
SQLITE_OMIT_ATTACH
SQLITE_OMIT_AUTOINCREMENT
SQLITE_OMIT_CAST
SQLITE_OMIT_COMPOUND_SELECT
SQLITE_OMIT_EXPLAIN
SQLITE_OMIT_FOREIGN_KEY
SQLITE_OMIT_PRAGMA
SQLITE_OMIT_REINDEX
SQLITE_OMIT_SUBQUERY
SQLITE_OMIT_TEMPDB
SQLITE_OMIT_TRIGGER
SQLITE_OMIT_VACUUM
SQLITE_OMIT_VIEW
SQLITE_OMIT_VIRTUALTABLE
为äºæ建ä¸ä¸ªå®å¶çèåæ件ï¼å ä¸è½½åå§çç¬ç«æºç æ件å°ä¸ä¸ªunixæè ç±»unixå¼åå¹³å°ãç¡®å®è·åçåå§æºç æ件ä¸æ¯âé¢ç¼è¯è¿çæºæ件âãä»»ä½äººé½å¯ä»¥éè¿å°ä¸è½½é¡µæè ç´æ¥ä»configuration management system.è·åå®æ´çä¸å¥åå§æºç æ件ã
å设sqliteæºç æ 被åå¨ä¸ä¸ªå为âsqliteâçç®å½ä¸ã计åæ建ä¸ä¸ªå¹³è¡ç®å½ä¸çå为âbldâçèåæ件ãé¦å éè¿è¿è¡sqliteæºç æ ç§çconfigureèæ¬è¿è¡æè éè¿å¶ä½ä¸ä»½æºç æ 顶å±ççmakfile模æ¿çä¸ä»½ï¼æ¥æ建ä¸ä¸ªåéçmakefile.ç¶åæå¨ç¼è¾è¿ä¸ªMakfileå»å å«éè¦çç¼è¯æ¶é´ç¸å ³çé项ãæç»è¿è¡ï¼
make sqlite3.c
å¨windowsä¸ä½¿ç¨MSVC:
nmake /f Makefile.msc sqlite3.c
sqlite3.cçmake
targetä¼èªå¨æé ä¸è¬çâsqlite3.câå并çæºç æ件ï¼ä»¥åå®ç头æ件âsqlite3.hâï¼åå å«TCLæ¥å£çèåæºç æ件âtclsqlite3.câãä¹åï¼éè¦çæ件å¯ä»¥è¢«æ·è´å°æ件ç®å½ä¸ç¶åæ ¹æ®ä¸è¿°å¾åçè¿ç¨ç¼è¯ã
æ建ä¸ä¸ªwindowsçå¨æé¾æ¥åºDLL
为äºå¨windowsæ建ä¸ä¸ªsqliteçdll使ç¨ï¼é¦å è·å对åºçèåè¿çæºç æ件ï¼sqlit3.cåsqlite.hãè¿äºå¯ä»¥ä»SQLite websiteä¸ä¸è½½æè åä¸è¿°åç¥çä¸æ ·å»å®å¶çæã
使ç¨å·¥ä½ç®å½ä¸çæºç æ件ï¼ä¸ä¸ªdllå¯ä»¥å¨msvcä¸ä½¿ç¨å¦ä¸å½ä»¤çæï¼
cl sqlite3.c -link -dll -out:sqlite3.dll
ä¸è¿°å½ä»¤éè¦è¿è¡å¨msvcçMSVC Native Tools Command
Prompt.å¦ä½ä½ å·²ç»å¨æºå¨ä¸å®è£ äºmsvcï¼ä½ å¯è½æå¤ä¸ªçæ¬çè¿ç§å½ä»¤æ示符ï¼é对äºxåxçèªå¸¦æ建çï¼æè 交åç¼è¯å°ARMçãä¾èµè¦æ±çDLLå»ä½¿ç¨å¯¹åºåéçå½ä»¤æç¤ºç¬¦å·¥å ·ã
å¦æ使ç¨MinGWç¼è¯å¨ï¼å½ä»¤æ¯è¿æ ·çï¼
gcc -shared sqlite3.c -o sqlite3.dll
注æMinGWåªçæä½çdllãå¦æä¸ä¸ªåå¼çMinGWå·¥ç¨å¯ä»¥ç¨æ¥çæä½çdllãå¯ä»¥æ¨æå ¶å½ä»¤è¡è¯æ³æ¯ç±»ä¼¼çãéè¦æ³¨æçæ¯æè¿çMSVCççæ¬çæçDLLså¯è½ä¸è½å·¥ä½å°WinXPæè æ´æ©çæ¬çwindowsä¸ãå æ¤ä¸ºäºæ大é度çå ¼å®¹ä½ ççæçdllï¼æ¨èMinGWãä¸ä¸ªå¥½çç»éªæ³åæ¯ä½¿ç¨MinGWå»çæä½çdllsï¼ä½¿ç¨msvcå»çæä½çdllsã