非常教程

Sqlite参考手册

其他 | Miscellaneous

How To Compile SQLite

1.合并与单个源文件

2.编译命令行界面

3.编译TCL接口

4.建立融合

5.构建Windows DLL

如何编译SQLite

概观

SQLite是ANSI-C源代码。在它有用之前,它必须被编译成机器代码。本文是编译SQLite的各种方式的指南。

本文不包含编译SQLite的详细步骤。由于每个发展情况都不同,这将很困难。相反,本文描述和说明SQLite编译背后的原理。典型的编译命令作为示例提供,期望应用程序开发人员可以使用这些示例作为开发自己的自定义编译过程的指导。换句话说,这篇文章提供了一些想法和见解,而不是交钥匙解决方案。

SQLite是由超过一百个C代码文件和脚本构建而成的,分布在多个目录中。SQLite的实现是纯粹的ANSI-C,但是许多C语言源代码文件在被合并到完成的SQLite库之前可以由辅助C程序和AWK,SED和TCL脚本生成或转换。构建必要的C程序和转换和/或创建SQLite的C语言源代码是一个复杂的过程。

为了简化问题,SQLite也可以作为预先打包的合并源代码文件:sqlite3.c。合并是实现整个SQLite库的ANSI-C代码的单个文件。合并更容易处理。所有内容都包含在一个单独的代码文件中,因此很容易将其放入较大的C或C ++程序的源代码树中。所有的代码生成和转换步骤已经完成,所以没有辅助的C程序来配置和编译,也没有脚本可以运行。而且,由于整个库都包含在一个翻译单元中,因此编译器可以进行更高级的优化,从而使性能提高5%到10%。由于这些原因,合并源文件(“ sqlite3.c“)被推荐用于所有应用程序。

所有应用都推荐使用合并

直接从单个源代码文件构建SQLite当然是可能的,但不推荐。对于某些专门的应用程序,可能需要修改构建过程,这种方式无法仅使用从网站下载的预先构建的合并源文件完成。对于这些情况,建议建立一个定制的合并(如下所述)并使用。换句话说,即使项目需要以单个源文件开始构建SQLite,仍然建议使用合并源文件作为中间步骤。

构建命令行界面需要三个源文件:

  • sqlite3.c:SQLite合并源文件
  • sqlite3.hsqlite3.c附带的头文件,它定义了SQLite的C语言接口。
  • shell.c:命令行界面程序本身。这是C源代码文件,其中包含main()例程的定义以及提示用户输入的循环,并将该输入传递到SQLite数据库引擎进行处理。

上述所有三个源文件都包含在下载页面上提供的合并tarball中。

要构建CLI,只需将这三个文件放在同一目录中并将它们一起编译。使用MSVC:

cl shell.c sqlite3.c -Fesqlite3.exe

在unix系统(或使用cygwin或mingw + msys的Windows上),该命令通常看起来像这样:

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函数。如果这些功能不是必需的,那么可以使用SQLITE_OMIT_LOAD_EXTENSION编译时选项省略它们:

gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c

有人可能希望提供其他编译时选项,例如用于全文搜索的-DSQLITE_ENABLE_FTS4或-DSQLITE_ENABLE_FTS5,用于R * Tree搜索引擎扩展的-DSQLITE_ENABLE_RTREE,用于包括JSON SQL函数的-DSQLITE_ENABLE_JSON1或用于dbstat虚拟表的-DSQLITE_ENABLE_DBSTAT_VTAB 。为了在EXPLAIN列表中看到额外的评论,添加-DSQLITE_ENABLE_EXPLAIN_COMMENTS选项。在unix系统上,如果主机支持usleep()系统调用,则添加-DHAVE_USLEEP = 1。添加-DHAVE_READLINE和-lreadline和-lncurses库以获得命令行编辑支持。有人可能也想指定一些编译器优化开关。(可从SQLite网站下载的预编译CLI使用“-Os”。)这里有无数种可能的变体。

gcc -Os -I. -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_FTS4 \
   -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 \
   -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_EXPLAIN_COMMENTS \
   -DHAVE_USLEEP -DHAVE_READLINE \
   shell.c sqlite3.c -ldl -lreadline -lncurses -o sqlite3

关键在于:构建CLI包括将两个C语言文件编译在一起。该shell.c文件包含入口点的定义和用户输入回路和SQLite的融合sqlite3.c包含了SQLite库的完整实现。

SQLite的TCL接口是一个添加到常规合并中的小模块。结果是一个名为“ tclsqlite3.c ” 的新的合并源文件。这个单一的源文件是生成一个共享库所需要的,它可以加载到标准的tclsh或希望使用TCL加载命令,或者生成一个随SQLite内置的独立tclsh。tcl合并的一个副本是作为TEA tarball中的文件包含在下载页面中。

要在Linux上为SQLite生成一个TCL可加载的库,以下命令就足够了:

gcc -o libtclsqlite3.so -shared tclsqlite3.c -lpthread -ldl -ltcl

不幸的是,为Mac OS X和Windows构建共享库并不那么简单。对于这些平台,最好使用TEA tarball中包含的configure脚本和makefile 。

要生成与SQLite静态链接的独立tclsh,请使用以下编译器调用:

gcc -DTCLSH=1 tclsqlite3.c -ltcl -lpthread -ldl -lz -lm

这里的技巧是-DTCLSH = 1选项。用于SQLite的TCL接口模块包含一个main()过程,用于初始化TCL解释器并在编译时使用-DTCLSH = 1进入命令行循环。上述命令适用于Linux和Mac OS X,但可能需要根据平台和TCL的哪个版本链接来调整库选项。

下载页面上提供的SQLite合并版本对大多数用户来说通常是足够的 但是,一些项目可能需要或需要建立自己的合并。构建自定义合并的一个常见原因是为了使用某些编译时选项来自定义SQLite库。回想一下,SQLite合并包含很多由辅助程序和脚本生成的C代码。许多编译时选项会影响此生成的代码,并且在汇编合并之前必须提供给代码生成器。必须传递到代码生成器中的编译时选项集可以从一个SQLite版本到下一个版本不同,但在编写本文时(大约SQLite 3.6.20,2009-11-04),该选项集代码生成器必须知道的内容包括:

  • 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类似的开发平台上。一定要获取原始源文件而不是“预处理源文件”。可以从下载页面或直接从配置管理系统获取完整的原始源文件集。

假设SQLite源码树存储在名为“sqlite”的目录中。计划在名为(例如)“bld”的并行目录中构建合并。首先通过运行SQLite源代码树顶部的配置脚本,或者在源代码树顶部创建一个模板Makefiles的副本来构建一个合适的Makefile。然后手编辑这个Makefile以包含所需的编译时选项。最后运行:

make sqlite3.c

或者在Windows上使用MSVC:

nmake /f Makefile.msc sqlite3.c

“sqlite3.c”make目标将自动构建常规的“ sqlite3.c ”合并源文件,其头文件“ sqlite3.h ”和包含TCL接口的“ tclsqlite3.c ”合并源文件。之后,可以将所需的文件复制到项目目录中并根据上述过程进行编译。

要构建用于Windows的SQLite DLL,首先要获取合适的合并源代码文件sqlite3.c和sqlite3.h。这些可以从SQLite网站下载,也可以从源代码生成,如上所示。

使用工作目录中的源代码文件,可以使用以下命令使用MSVC生成一个DLL:

cl sqlite3.c -link -dll -out:sqlite3.dll

上述命令应该从MSVC本地工具命令提示符运行。如果您的计算机上安装了MSVC,则可能有多个版本的此命令提示符,适用于x86和x64的本机构建,也可能用于交叉编译到ARM。根据所需的DLL使用适当的命令提示符。

如果使用MinGW编译器,命令行是这样的:

gcc -shared sqlite3.c -o sqlite3.dll

请注意,MinGW仅生成32位DLL。有一个单独的MinGW64项目可用于生成64位DLL。据推测,命令行语法是相似的。另请注意,最新版本的MSVC生成的DLL在WinXP和Windows的早期版本上不起作用。因此,为了最大限度地兼容您生成的DLL,建议使用MinGW。一个很好的经验法则是使用MinGW和使用MSVC的64位DLL生成32位DLL。

在大多数情况下,您需要使用适合您应用程序的编译时选项来补充上述基本命令。常用的编译时选项包括:

  • -Os - 优化尺寸。使DLL尽可能小。
  • -O2 - 优化速度。这将通过展开循环和内联函数来扩大DLL。
  • -DSQLITE_ENABLE_FTS4 - 在SQLite中包含全文搜索引擎代码。
  • -DSQLITE_ENABLE_RTREE - 包含R-Tree扩展。
  • -DSQLITE_ENABLE_COLUMN_METADATA - 这启用了一些常用系统所需的额外API,包括Ruby-on-Rails。
 SQLite在公共领域。

其他 | Miscellaneous相关

1.35% Faster Than The Filesystem
2.8+3 Filenames
3.An Asynchronous I/O Module For SQLite
4.Appropriate Uses For SQLite
5.Architecture of SQLite
6.Atomic Commit In SQLite
7.Automatic Undo/Redo With SQLite
8.Benefits of SQLite As A File Format
9.Change in Default Page Size in SQLite Version 3.12.0
10.Clustered Indexes and the WITHOUT ROWID Optimization
11.Compile-time Options
12.Constraint Conflict Resolution in SQLite
13.Custom Builds Of SQLite
14.Deterministic SQL Functions
15.Distinctive Features Of SQLite
16.EXPLAIN QUERY PLAN
17.Features Of SQLite
18.File Format Changes in SQLite
19.Full-Featured SQL
20.High Reliability
21.Hints for Debugging SQLite
22.How SQLite Is Tested
23.How To Download Canonical SQLite Source Code
24.Imposter Tables
25.In-Memory Databases
26.Indexes On Expressions
27.Internal Versus External BLOBs
28.Isolation In SQLite
29.Long Term Support
30.Maintaining Private Branches Of SQLite
31.Many Small Queries Are Efficient In SQLite
32.Measuring and Reducing CPU Usage in SQLite
33.Memory-Mapped I/O
34.NULL Handling in SQLite
35.Partial Indexes
36.Pointer Passing Interfaces
37.Powersafe Overwrite
38.Release History Of SQLite
39.Result and Error Codes
40.Row Values
41.Rowid Tables
42.Run-Time Loadable Extensions
43.SQL Features That SQLite Does Not Implement
44.sqldiff.exe: Database Difference Utility
45.SQLite As An Application File Format
46.SQLite Autoincrement
47.SQLite Backup API
48.SQLite Changes From Version 3.4.2 To 3.5.0
49.SQLite Changes From Version 3.5.9 To 3.6.0
50.SQLite Database Speed Comparison
51.SQLite File IO Specification
52.SQLite Frequently Asked Questions
53.SQLite In 5 Minutes Or Less
54.SQLite is a Self Contained System
55.SQLite Is Serverless
56.SQLite Is Transactional
57.SQLite Library Footprint
58.SQLite Shared-Cache Mode
59.SQLite Unlock-Notify API
60.SQLite Version 3 Overview
61.SQLite: Single File Database
62.Temporary Files Used By SQLite
63.TH3
64.The COMPLETION() Table-Valued Function
65.The CSV Virtual Table
66.The dbhash.exe Utility Program
67.The DBSTAT Virtual Table
68.The Error And Warning Log
69.The generate_series Table-Valued Function
70.The OS Backend (VFS) To SQLite
71.The Spellfix1 Virtual Table
72.The SQLite Amalgamation
73.The SQLite Bytecode Engine
74.The sqlite3_analyzer.exe Utility Program
75.The SQLITE_STMT Virtual Table
76.The UNION Virtual Table
77.The Virtual Database Engine of SQLite
78.Uniform Resource Identifiers
79.Using SQLite In Multi-Threaded Applications
80.Version Numbers in SQLite
81.What If OpenDocument Used SQLite?
82.Why Is SQLite Coded In C
83.Zero-Configuration
Sqlite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来

主页 https://sqlite.org/
源码 https://www.sqlite.org/src/
发布版本 3.21.0

Sqlite目录

1.C界面 | C Interface
2.C Interface: Session Module
3.CLI
4.数据库文件表 | Database File Format
5.数据类 | Datatypes
6.动态内存分配 | Dynamic Memory Allocation
7.外键约束 | Foreign Key Constraints
8.全文索引 | Full-Text Search
9.损坏方式 | How To Corrupt
10.JSON
11.语言 | Language
12.局限性 | Limits
13.锁定和并发 | Locking and Concurrency
14.其他 | Miscellaneous
15.PRAGMA Statements
16.查询计划程序 | Query Planner
17.R*Tree Module
18.RBU Extension
19.语法图 | Syntax Diagrams
20.Tcl Interface
21.虚拟表机制 | Virtual Table Mechanism
22.预写日志 | Write-Ahead Logging
23.SQL 教程
24.SQL 简介
25.SQL 语法
26.SQL DELETE 语句
27.SQL UPDATE 语句
28.SQL NOT NULL 约束
29.SQL 约束
30.SQL CREATE TABLE 语句
31.SQL CREATE DATABASE 语句
32.SQL INSERT INTO SELECT 语句
33.SQL SELECT INTO 语句
34.SQL CREATE VIEW、REPLACE VIEW、 DROP VIEW 语句
35.SQL AUTO INCREMENT 字段
36.SQL ALTER TABLE 语句
37.SQL 撤销索引、表以及数据库
38.SQL CREATE INDEX 语句
39.SQL DEFAULT 约束
40.SQL CHECK 约束
41.SQL FOREIGN KEY 约束
42.SQL PRIMARY KEY 约束
43.SQL UNIQUE 约束
44.SQL 通用数据类型
45.SQL ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
46.SQL NULL 值 – IS NULL 和 IS NOT NULL
47.SQL Server 和 MySQL 中的 Date 函数
48.SQL MS Access、MySQL 和 SQL Server 数据类型
49.SQL 函数
50.SQL 总结
51.SQL 主机
52.SQL 快速参考
53.SQL ROUND() 函数
54.SQL Server GETDATE() 函数
55.MySQL DATE_FORMAT() 函数
56.MySQL DATEDIFF() 函数
57.MySQL DATE_SUB() 函数
58.MySQL DATE_ADD() 函数
59.MySQL EXTRACT() 函数
60.MySQL DATE() 函数
61.MySQL CURTIME() 函数
62.MySQL CURDATE() 函数
63.MySQL NOW() 函数
64.SQL Server CONVERT() 函数
65.SQL Server DATEDIFF() 函数
66.SQL Server DATEADD() 函数
67.SQL Server DATEPART() 函数
68.SQLite 命令
69.SQLite 安装
70.SQLite 简介
71.SQLite 运算符
72.SQLite Select 语句
73.SQLite 删除表
74.SQLite 创建表
75.SQLite Insert 语句
76.SQLite 分离数据库
77.SQLite 附加数据库
78.SQLite 创建数据库
79.SQLite 数据类型
80.SQLite 语法
81.SQLite Order By
82.SQLite Limit 子句
83.SQLite Glob 子句
84.SQLite Like 子句
85.SQLite Delete 语句
86.SQLite Update 语句
87.SQLite AND/OR 运算符
88.SQLite Where 子句
89.SQLite 表达式
90.SQLite Distinct 关键字
91.SQLite Having 子句
92.SQLite Group By
93.SQLite Join
94.SQLite 约束
95.SQLite PRAGMA
96.SQLite 事务
97.SQLite 视图
98.SQLite Truncate Table
99.SQLite Alter 命令
100.SQLite Indexed By