小巧。快速。可靠。
三选其二。

SQLite C 接口

配置选项

#define SQLITE_CONFIG_SINGLETHREAD         1  /* nil */
#define SQLITE_CONFIG_MULTITHREAD          2  /* nil */
#define SQLITE_CONFIG_SERIALIZED           3  /* nil */
#define SQLITE_CONFIG_MALLOC               4  /* sqlite3_mem_methods* */
#define SQLITE_CONFIG_GETMALLOC            5  /* sqlite3_mem_methods* */
#define SQLITE_CONFIG_SCRATCH              6  /* No longer used */
#define SQLITE_CONFIG_PAGECACHE            7  /* void*, int sz, int N */
#define SQLITE_CONFIG_HEAP                 8  /* void*, int nByte, int min */
#define SQLITE_CONFIG_MEMSTATUS            9  /* boolean */
#define SQLITE_CONFIG_MUTEX               10  /* sqlite3_mutex_methods* */
#define SQLITE_CONFIG_GETMUTEX            11  /* sqlite3_mutex_methods* */
/* previously SQLITE_CONFIG_CHUNKALLOC    12 which is now unused. */
#define SQLITE_CONFIG_LOOKASIDE           13  /* int int */
#define SQLITE_CONFIG_PCACHE              14  /* no-op */
#define SQLITE_CONFIG_GETPCACHE           15  /* no-op */
#define SQLITE_CONFIG_LOG                 16  /* xFunc, void* */
#define SQLITE_CONFIG_URI                 17  /* int */
#define SQLITE_CONFIG_PCACHE2             18  /* sqlite3_pcache_methods2* */
#define SQLITE_CONFIG_GETPCACHE2          19  /* sqlite3_pcache_methods2* */
#define SQLITE_CONFIG_COVERING_INDEX_SCAN 20  /* int */
#define SQLITE_CONFIG_SQLLOG              21  /* xSqllog, void* */
#define SQLITE_CONFIG_MMAP_SIZE           22  /* sqlite3_int64, sqlite3_int64 */
#define SQLITE_CONFIG_WIN32_HEAPSIZE      23  /* int nByte */
#define SQLITE_CONFIG_PCACHE_HDRSZ        24  /* int *psz */
#define SQLITE_CONFIG_PMASZ               25  /* unsigned int szPma */
#define SQLITE_CONFIG_STMTJRNL_SPILL      26  /* int nByte */
#define SQLITE_CONFIG_SMALL_MALLOC        27  /* boolean */
#define SQLITE_CONFIG_SORTERREF_SIZE      28  /* int nByte */
#define SQLITE_CONFIG_MEMDB_MAXSIZE       29  /* sqlite3_int64 */
#define SQLITE_CONFIG_ROWID_IN_VIEW       30  /* int* */

这些常量是可以作为 sqlite3_config() 接口的第一个参数传递的可用整数配置选项。

大多数 sqlite3_config() 的配置选项只有在调用 sqlite3_initialize() 之前或 sqlite3_shutdown() 之后才会生效。少数例外情况称为“随时配置选项”。在调用 sqlite3_initialize()sqlite3_shutdown() 之间,使用非随时配置选项作为第一个参数调用 sqlite3_config() 将是一个无操作,并返回 SQLITE_MISUSE。

随时配置选项的集合可能会在 SQLite 的不同版本之间发生变化(通过插入和/或删除)。截至 SQLite 3.42.0 版本,随时配置选项的完整集合是

SQLite 的未来版本可能会添加新的配置选项。现有的配置选项可能会被弃用。应用程序应该检查 sqlite3_config() 的返回值,以确保调用成功。如果调用了已弃用或不支持的配置选项,则 sqlite3_config() 接口将返回非零的 错误代码

SQLITE_CONFIG_SINGLETHREAD
此选项没有参数。此选项将 线程模式 设置为单线程。换句话说,它禁用了所有互斥锁,并将 SQLite 置于只能由单个线程使用的模式。如果 SQLite 使用 SQLITE_THREADSAFE=0 编译时选项编译,则无法从其默认的单线程值更改 线程模式,因此如果使用 SQLITE_CONFIG_SINGLETHREAD 配置选项调用 sqlite3_config(),它将返回 SQLITE_ERROR

SQLITE_CONFIG_MULTITHREAD
此选项没有参数。此选项将 线程模式 设置为多线程。换句话说,它禁用了 数据库连接预处理语句 对象上的互斥锁。应用程序负责序列化对 数据库连接预处理语句 的访问。但其他互斥锁已启用,因此只要没有两个线程尝试同时使用相同的 数据库连接,SQLite 在多线程环境中使用起来就是安全的。如果 SQLite 使用 SQLITE_THREADSAFE=0 编译时选项编译,则无法设置多线程 线程模式,并且如果使用 SQLITE_CONFIG_MULTITHREAD 配置选项调用 sqlite3_config(),它将返回 SQLITE_ERROR

SQLITE_CONFIG_SERIALIZED
此选项没有参数。此选项将 线程模式 设置为序列化。换句话说,此选项启用了所有互斥锁,包括 数据库连接预处理语句 对象上的递归互斥锁。在此模式下(当 SQLite 使用 SQLITE_THREADSAFE=1 编译时为默认模式),SQLite 库本身将序列化对 数据库连接预处理语句 的访问,以便应用程序可以在不同的线程中同时自由使用相同的 数据库连接 或相同的 预处理语句。如果 SQLite 使用 SQLITE_THREADSAFE=0 编译时选项编译,则无法设置序列化 线程模式,并且如果使用 SQLITE_CONFIG_SERIALIZED 配置选项调用 sqlite3_config(),它将返回 SQLITE_ERROR

SQLITE_CONFIG_MALLOC
SQLITE_CONFIG_MALLOC 选项接受一个参数,该参数是指向 sqlite3_mem_methods 结构实例的指针。该参数指定要使用的替代低级内存分配例程,以代替内置于 SQLite 中的内存分配例程。在 sqlite3_config() 调用返回之前,SQLite 会创建 sqlite3_mem_methods 结构内容的私有副本。

SQLITE_CONFIG_GETMALLOC
SQLITE_CONFIG_GETMALLOC 选项接受一个参数,该参数是指向 sqlite3_mem_methods 结构实例的指针。 sqlite3_mem_methods 结构将填充当前定义的内存分配例程。例如,此选项可用于使用模拟内存分配失败或跟踪内存用量的包装器来重载默认内存分配例程。

SQLITE_CONFIG_SMALL_MALLOC
SQLITE_CONFIG_SMALL_MALLOC 选项接受一个 int 类型的参数,解释为布尔值,如果为真,则向 SQLite 提供一个提示,表明它应尽可能避免大型内存分配。如果 SQLite 可以自由进行大型内存分配,则其运行速度会更快,但某些应用程序可能更愿意以牺牲速度为代价来换取避免大型分配时可能出现的内存碎片保证。此提示通常处于关闭状态。

SQLITE_CONFIG_MEMSTATUS
SQLITE_CONFIG_MEMSTATUS 选项接受一个 int 类型的参数,解释为布尔值,它启用或禁用内存分配统计信息的收集。当禁用内存分配统计信息时,以下 SQLite 接口将无法使用默认情况下启用内存分配统计信息,除非 SQLite 使用 SQLITE_DEFAULT_MEMSTATUS=0 编译,在这种情况下,默认情况下禁用内存分配统计信息。

SQLITE_CONFIG_SCRATCH
SQLITE_CONFIG_SCRATCH 选项已不再使用。

SQLITE_CONFIG_PAGECACHE
SQLITE_CONFIG_PAGECACHE 选项指定 SQLite 可以用于数据库页面缓存的内存池,并使用默认页面缓存实现。如果使用 SQLITE_CONFIG_PCACHE2 加载了应用程序定义的页面缓存实现,则此配置选项将不起作用。SQLITE_CONFIG_PAGECACHE 有三个参数:指向 8 字节对齐内存的指针 (pMem)、每个页面缓存行的尺寸 (sz) 和缓存行的数量 (N)。sz 参数应为最大数据库页面大小(512 到 65536 之间的 2 的幂)加上每个页面头的一些额外字节。可以使用 SQLITE_CONFIG_PCACHE_HDRSZ 确定页面头所需的额外字节数。除了浪费内存之外,sz 参数大于必要值是无害的。pMem 参数必须是 NULL 指针或指向至少 sz*N 字节的 8 字节对齐内存块的指针,否则后续行为未定义。当 pMem 不为 NULL 时,SQLite 将努力使用提供的内存来满足页面缓存需求,如果页面缓存行大于 sz 字节或所有 pMem 缓冲区都已用尽,则回退到 sqlite3_malloc()。如果 pMem 为 NULL 且 N 非零,则每个数据库连接都会从 sqlite3_malloc() 进行初始批量分配,以满足页面缓存内存,如果 N 为正,则分配足够 N 个缓存行,如果 N 为负,则分配 -1024*N 字节。如果需要超出初始分配提供的页面缓存内存,则 SQLite 会为每个额外的缓存行单独使用 sqlite3_malloc()

SQLITE_CONFIG_HEAP
SQLITE_CONFIG_HEAP 选项指定一个静态内存缓冲区,SQLite 将使用该缓冲区来满足其所有动态内存分配需求,超出 SQLITE_CONFIG_PAGECACHE 提供的需求。SQLITE_CONFIG_HEAP 选项仅在 SQLite 使用 SQLITE_ENABLE_MEMSYS3SQLITE_ENABLE_MEMSYS5 编译时可用,并在其他情况下返回 SQLITE_ERROR。SQLITE_CONFIG_HEAP 有三个参数:指向内存的 8 字节对齐指针、内存缓冲区中的字节数和最小分配大小。如果第一个指针(内存指针)为 NULL,则 SQLite 会恢复使用其默认内存分配器(系统 malloc() 实现),撤消之前对 SQLITE_CONFIG_MALLOC 的任何调用。如果内存指针不为 NULL,则将启用备用内存分配器来处理 SQLite 的所有内存分配需求。第一个指针(内存指针)必须与 8 字节边界对齐,否则 SQLite 的后续行为未定义。最小分配大小限制为 2**12。最小分配大小的合理值是 2**5 到 2**8。

SQLITE_CONFIG_MUTEX
SQLITE_CONFIG_MUTEX 选项接受一个参数,该参数是指向 sqlite3_mutex_methods 结构实例的指针。该参数指定要使用的替代低级互斥锁例程,以代替内置于 SQLite 中的互斥锁例程。在调用 sqlite3_config() 返回之前,SQLite 会创建 sqlite3_mutex_methods 结构内容的副本。如果 SQLite 使用 SQLITE_THREADSAFE=0 编译时选项编译,则整个互斥锁子系统将从构建中省略,因此使用 SQLITE_CONFIG_MUTEX 配置选项调用 sqlite3_config() 将返回 SQLITE_ERROR

SQLITE_CONFIG_GETMUTEX
SQLITE_CONFIG_GETMUTEX 选项接受一个参数,该参数是指向 sqlite3_mutex_methods 结构实例的指针。 sqlite3_mutex_methods 结构将填充当前定义的互斥锁例程。例如,此选项可用于使用用于跟踪互斥锁使用情况以进行性能分析或测试的包装器来重载默认互斥锁分配例程。如果 SQLite 使用 SQLITE_THREADSAFE=0 编译时选项编译,则整个互斥锁子系统将从构建中省略,因此使用 SQLITE_CONFIG_GETMUTEX 配置选项调用 sqlite3_config() 将返回 SQLITE_ERROR

SQLITE_CONFIG_LOOKASIDE
SQLITE_CONFIG_LOOKASIDE 选项接受两个参数,这两个参数确定每个 数据库连接 上的备用内存的默认大小。第一个参数是每个备用缓冲区槽的大小,第二个参数是分配给每个数据库连接的槽数。SQLITE_CONFIG_LOOKASIDE 设置默认备用大小。 SQLITE_DBCONFIG_LOOKASIDE 选项到 sqlite3_db_config() 可用于更改各个连接上的备用配置。

SQLITE_CONFIG_PCACHE2
SQLITE_CONFIG_PCACHE2 选项接受一个参数,该参数是指向 sqlite3_pcache_methods2 对象的指针。此对象指定自定义页面缓存实现的接口。SQLite 会创建 sqlite3_pcache_methods2 对象的副本。

SQLITE_CONFIG_GETPCACHE2
SQLITE_CONFIG_GETPCACHE2 选项接受一个参数,该参数是指向 sqlite3_pcache_methods2 对象的指针。SQLite 将当前页面缓存实现的副本复制到该对象中。

SQLITE_CONFIG_LOG
SQLITE_CONFIG_LOG 选项用于配置 SQLite 全局的 错误日志。(SQLITE_CONFIG_LOG 选项接受两个参数:一个指向函数的指针,该函数的调用签名为 void(*)(void*,int,const char*),以及一个指向 void 的指针。如果函数指针不为 NULL,则 sqlite3_log() 会调用它来处理每个日志事件。如果函数指针为 NULL,则 sqlite3_log() 接口将变为无操作。每次调用应用程序定义的日志记录函数时,作为 SQLITE_CONFIG_LOG 的第二个参数的 void 指针都会作为第一个参数传递给该函数。日志记录函数的第二个参数是对应 sqlite3_log() 调用的第一个参数的副本,旨在作为 结果代码扩展结果代码。传递给日志记录器的第三个参数是通过 sqlite3_snprintf() 格式化后的日志消息。SQLite 日志记录接口不是可重入的;应用程序提供的日志记录函数不得调用任何 SQLite 接口。在多线程应用程序中,应用程序定义的日志记录函数必须是线程安全的。

SQLITE_CONFIG_URI
SQLITE_CONFIG_URI 选项接受一个类型为 int 的单个参数。如果非零,则全局启用 URI 处理。如果参数为零,则全局禁用 URI 处理。如果全局启用了 URI 处理,则传递给 sqlite3_open()sqlite3_open_v2()sqlite3_open16() 的所有文件名或作为 ATTACH 命令的一部分指定的文件名都将被解释为 URI,而不管在打开数据库连接时是否设置了 SQLITE_OPEN_URI 标志。如果全局禁用了它,则仅当在打开数据库连接时设置了 SQLITE_OPEN_URI 标志时,文件名才会被解释为 URI。默认情况下,全局禁用 URI 处理。可以通过定义 SQLITE_USE_URI 符号进行编译来更改默认值。

SQLITE_CONFIG_COVERING_INDEX_SCAN
SQLITE_CONFIG_COVERING_INDEX_SCAN 选项接受一个单个整数参数,该参数被解释为布尔值,以启用或禁用查询优化器中使用覆盖索引进行全表扫描。默认设置由 SQLITE_ALLOW_COVERING_INDEX_SCAN 编译时选项确定,或者如果省略该编译时选项,则为“开启”。能够禁用使用覆盖索引进行全表扫描的原因是,某些代码编写错误的旧版应用程序在启用此优化时可能会出现故障。提供禁用优化的能力允许旧的、有错误的应用程序代码在不更改的情况下也能与更新版本的 SQLite 一起工作。

SQLITE_CONFIG_PCACHE 和 SQLITE_CONFIG_GETPCACHE
这些选项已过时,新代码不应使用它们。为了向后兼容性,它们被保留,但现在是无操作的。

SQLITE_CONFIG_SQLLOG
仅当 sqlite 使用定义的 SQLITE_ENABLE_SQLLOG 预处理器宏进行编译时,此选项才可用。第一个参数应是指向类型为 void(*)(void*,sqlite3*,const char*, int) 的函数的指针。第二个参数应为 (void*) 类型。回调在三种不同的情况下由库调用,由作为第四个参数传递的值标识。如果第四个参数为 0,则作为第二个参数传递的数据库连接刚刚打开。第三个参数指向包含主数据库文件名的缓冲区。如果第四个参数为 1,则第三个参数指向的 SQL 语句刚刚执行。或者,如果第四个参数为 2,则作为第二个参数传递的连接正在关闭。在这种情况下,第三个参数传递 NULL。在规范 SQLite 源代码树中的“test_sqllog.c”源文件中可以看到使用此配置选项的示例。

SQLITE_CONFIG_MMAP_SIZE
SQLITE_CONFIG_MMAP_SIZE 接受两个 64 位整数 (sqlite3_int64) 值,它们是默认的 mmap 大小限制(PRAGMA mmap_size 的默认设置)和允许的最大 mmap 大小限制。可以使用 PRAGMA mmap_size 命令或使用 SQLITE_FCNTL_MMAP_SIZE 文件控制来覆盖每个数据库连接的默认设置。如果需要,允许的最大 mmap 大小将被静默截断,以使其不超过由 SQLITE_MAX_MMAP_SIZE 编译时选项设置的编译时最大 mmap 大小。如果此选项的任一参数为负,则该参数将更改为其编译时默认值。

SQLITE_CONFIG_WIN32_HEAPSIZE
仅当 SQLite 使用定义的 SQLITE_WIN32_MALLOC 预处理器宏为 Windows 编译时,SQLITE_CONFIG_WIN32_HEAPSIZE 选项才可用。SQLITE_CONFIG_WIN32_HEAPSIZE 接受一个 32 位无符号整数,该整数指定创建的堆的最大大小。

SQLITE_CONFIG_PCACHE_HDRSZ
SQLITE_CONFIG_PCACHE_HDRSZ 选项接受一个参数,该参数是指向整数的指针,并将 SQLITE_CONFIG_PAGECACHE 中每个页面的每个页面所需的额外字节数写入该整数。所需额外空间的数量可能会因编译器、目标平台和 SQLite 版本而异。

SQLITE_CONFIG_PMASZ
SQLITE_CONFIG_PMASZ 选项接受一个参数,该参数是一个无符号整数,并将多线程排序器的“最小 PMA 大小”设置为该整数。最小 PMA 大小的默认值由 SQLITE_SORTER_PMASZ 编译时选项设置。当启用多线程排序(使用 PRAGMA threads 命令)并且要排序的内容量超过页面大小乘以 PRAGMA cache_size 设置和此值的最小值时,将启动新线程来帮助进行排序操作。

SQLITE_CONFIG_STMTJRNL_SPILL
SQLITE_CONFIG_STMTJRNL_SPILL 选项接受一个参数,该参数将成为 语句日志 溢出到磁盘的阈值。语句日志 保存在内存中,直到其大小(以字节为单位)超过此阈值,此时它们将写入磁盘。或者,如果阈值为 -1,则语句日志始终仅保存在内存中。由于许多语句日志永远不会变得很大,因此将溢出阈值设置为 64KiB 等值可以大大减少支持语句回滚所需的 I/O 量。此设置的默认值由 SQLITE_STMTJRNL_SPILL 编译时选项控制。

SQLITE_CONFIG_SORTERREF_SIZE
SQLITE_CONFIG_SORTERREF_SIZE 选项接受一个类型为 (int) 的单个参数 - 排序器引用大小阈值的新值。通常,当 SQLite 使用外部排序根据 ORDER BY 子句对记录进行排序时,调用者所需的所有字段都存在于已排序的记录中。但是,如果 SQLite 根据表列的声明类型确定其值可能非常大 - 大于配置的排序器引用大小阈值 - 则在每个已排序的记录中存储一个引用,并在记录按排序顺序返回时从数据库加载所需的列值。此选项的默认值为从不使用此优化。为该选项指定负值将恢复默认行为。仅当 SQLite 使用 SQLITE_ENABLE_SORTER_REFERENCES 编译时选项进行编译时,此选项才可用。

SQLITE_CONFIG_MEMDB_MAXSIZE
SQLITE_CONFIG_MEMDB_MAXSIZE 选项接受一个单个参数 sqlite3_int64 参数,该参数是使用 sqlite3_deserialize() 创建的内存数据库的默认最大大小。可以使用 SQLITE_FCNTL_SIZE_LIMIT 文件控制 对各个数据库调整此默认最大大小。如果从未使用此配置设置,则默认最大值由 SQLITE_MEMDB_DEFAULT_MAXSIZE 编译时选项确定。如果未设置该编译时选项,则默认最大值为 1073741824。

SQLITE_CONFIG_ROWID_IN_VIEW
SQLITE_CONFIG_ROWID_IN_VIEW 选项启用或禁用 VIEW 是否可以具有 ROWID 的功能。该功能仅能在 SQLite 使用 -DSQLITE_ALLOW_ROWID_IN_VIEW 编译时启用,在这种情况下,该功能默认为开启。此配置选项查询当前设置或将设置更改为关闭或开启。参数是指向整数的指针。如果该整数最初包含值为 1,则激活 VIEW 是否可以具有 ROWID 的功能。如果该整数最初包含值为零,则停用该功能。该整数的任何其他初始值都不会更改设置。在更改(如果有)之后,整数将写入 1 或 0,如果 VIEW 是否可以具有 ROWID 的功能处于开启或关闭状态。如果 SQLite 在没有 -DSQLITE_ALLOW_ROWID_IN_VIEW 的情况下进行编译(这是通常且推荐的做法),则整数始终填充为零,而不管其初始值如何。

另请参阅 对象常量函数 列表。