非常教程

Sqlite参考手册

其他 | Miscellaneous

The Error And Warning Log

1.设置错误记录回调

2.接口细节

3.各种错误消息

4.总结

概观

SQLite 可以配置为在出现异常时调用包含错误代码和简洁错误消息的回调函数。这种机制对跟踪在现场很少发生的模糊问题非常有用。鼓励应用程序开发人员在他们的产品中利用 SQLite 的错误日志记录功能,因为它非常低的 CPU 和内存成本,但对调试有很大的帮助。

每个进程只能有一个错误记录回调。错误记录回调在开始时使用类似于以下内容的 C 代码进行注册:

sqlite3_config(SQLITE_CONFIG_LOG, errorLogCallback, pData);

错误记录器回调函数可能如下所示:

void errorLogCallback(void *pArg, int iErrCode, const char *zMsg){
  fprintf(stderr, "(%d) %s\n", iErrCode, zMsg);
}

上面的例子说明了错误记录器回调的签名。但是,在嵌入式应用程序中,通常不会在 stderr 上打印消息。相反,可以将消息存储在预分配的循环缓冲区中,在调试期间需要诊断信息时可以访问它们。或者也许这些消息可以发送到 Syslog。不知何故,消息需要存储在开发人员可访问的位置,而不是向最终用户显示。

不要误解:将错误记录器消息显示给最终用户在技术上没有任何问题。这些消息不包含敏感或私人信息,必须防止未经授权的查看。相反,这些消息本质上是技术性的,对典型的最终用户来说没有用处或意义。来自错误记录器的消息适用于数据库爱好者。相应地显示它们。

sqlite3_config(SQLITE_CONFIG_LOG,...)接口的第三个参数(上例中的 “pData” 参数)是指向任意数据的指针。SQLite 将该指针传递给错误记录器回调的第一个参数。如果需要,指针可用于传递应用程序特定的设置或状态信息。或者它可以只是一个被回调忽略的 NULL 指针。

错误记录器回调的第二个参数是整数扩展错误代码。错误记录器的第三个参数是错误消息的文本。错误消息文本存储在调用函数中的固定长度堆栈缓冲区中,因此仅在错误记录器回调函数的持续时间内有效。如果需要保留消息,错误记录器应将此消息的副本保存到永久存储器中。

错误记录器回调应该像信号处理程序一样处理。应用程序应该保存或以其他方式处理错误,然后尽快返回。不应该直接或间接地从错误记录器调用其他 SQLite API。SQLite 不能通过错误记录器回调重入。特别是,当内存分配失败时,会调用错误记录器回调函数,因此尝试在错误记录器内分配内存通常是一个坏主意。甚至不要考虑尝试将错误消息存储在另一个 SQLite 数据库中。

如果需要,应用程序可以使用 sqlite3_log(E,F,..)API 将新消息发送到日志,但不鼓励。sqlite3_log()接口仅供扩展使用,而不是由应用程序使用。

可能发送到错误记录器的错误消息及其确切格式可能会因发行版的不同而发生变化。所以应用程序不应该依赖于任何特定的错误消息文本格式或错误代码。事情并不反复改变,但他们有时会改变。

以下是可能出现在错误记录器回调中的消息种类的部分列表。

  • 任何时候编译 SQL 语句(使用 sqlite3_prepare_v2()或其同级)或运行 SQL 语句(使用 sqlite3_step())都会记录错误。
  • 当发生模式更改时需要重新准备和重新编写准备好的语句时,会使用错误代码 SQLITE_SCHEMA 记录该事件。reparse 和 reprepare 通常是自动的(假设最初使用 sqlite3_prepare_v2()来准备语句,这是推荐的),所以这些记录事件通常是知道正在发生的唯一方法。
  • 无论何时必须恢复数据库,都会记录 SQLITE_NOTICE 消息,因为先前的作者在没有完成其事务的情况下崩溃。在恢复预写日志时恢复回滚日志和 SQLITE_NOTICE_RECOVER_WAL 时,错误代码为 SQLITE_NOTICE_RECOVER_ROLLBACK。
  • 当数据库文件以可能导致数据库损坏的方式重命名或别名时,会记录 SQLITE_WARNING 消息。(请参阅1和2了解更多信息。)
  • 内存不足(OOM)错误条件使用 SQLITE_NOMEM 错误代码生成错误记录事件,并显示一条消息,指出失败的分配请求了多少字节的内存。
  • OS 界面中的 I / O 错误会生成错误记录事件。发送到这些事件的消息给出源代码中产生错误的行号以及存在相应文件时与事件关联的文件名。
  • 当检测到数据库损坏时,调用 SQLITE_CORRUPT 错误记录器回调。与 I / O 错误一样,错误消息文本包含首次检测到错误时原始源代码中的行号。
  • 在 SQLITE_MISUSE 错误上调用错误记录器回调。当在应用程序代码中不一致地检查返回码时,这对于检测应用程序设计问题非常有用。

SQLite 努力保持错误记录器流量低,并且只在真正出现问题时才将消息发送到错误记录器。应用程序可能会通过故意忽略某些他们不关心的错误消息来进一步剔除错误消息流量。例如,频繁更改数据库模式的应用程序可能希望忽略所有 SQLITE_SCHEMA 错误。

强烈建议使用错误记录器回调。错误记录器提供的调试信息已被证明在追踪应用程序进入现场后发生的模糊问题时非常有用。错误记录器回调也被证明在捕获错误中很有用,因为 API 返回代码的不一致检查导致应用程序错过了偶尔的错误。鼓励开发人员在开发周期的早期实现错误记录器回调,以便快速发现意外行为,并通过部署保持错误记录器回调的开启。如果错误记录器从未发现问题,则不会造成任何损害。但是,如果未能设置合适的错误记录器,则可能会在稍后影响诊断功能。

其他 | 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 Compile SQLite
24.How To Download Canonical SQLite Source Code
25.Imposter Tables
26.In-Memory Databases
27.Indexes On Expressions
28.Internal Versus External BLOBs
29.Isolation In SQLite
30.Long Term Support
31.Maintaining Private Branches Of SQLite
32.Many Small Queries Are Efficient In SQLite
33.Measuring and Reducing CPU Usage in SQLite
34.Memory-Mapped I/O
35.NULL Handling in SQLite
36.Partial Indexes
37.Pointer Passing Interfaces
38.Powersafe Overwrite
39.Release History Of SQLite
40.Result and Error Codes
41.Row Values
42.Rowid Tables
43.Run-Time Loadable Extensions
44.SQL Features That SQLite Does Not Implement
45.sqldiff.exe: Database Difference Utility
46.SQLite As An Application File Format
47.SQLite Autoincrement
48.SQLite Backup API
49.SQLite Changes From Version 3.4.2 To 3.5.0
50.SQLite Changes From Version 3.5.9 To 3.6.0
51.SQLite Database Speed Comparison
52.SQLite File IO Specification
53.SQLite Frequently Asked Questions
54.SQLite In 5 Minutes Or Less
55.SQLite is a Self Contained System
56.SQLite Is Serverless
57.SQLite Is Transactional
58.SQLite Library Footprint
59.SQLite Shared-Cache Mode
60.SQLite Unlock-Notify API
61.SQLite Version 3 Overview
62.SQLite: Single File Database
63.Temporary Files Used By SQLite
64.TH3
65.The COMPLETION() Table-Valued Function
66.The CSV Virtual Table
67.The dbhash.exe Utility Program
68.The DBSTAT Virtual Table
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