非常教程

Sqlite参考手册

C界面 | C Interface

Application Defined Page Cache

应用程序定义的页面缓存。

typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2;
struct sqlite3_pcache_methods2 {
  int iVersion;
  void *pArg;
  int (*xInit)(void*);
  void (*xShutdown)(void*);
  sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable);
  void (*xCachesize)(sqlite3_pcache*, int nCachesize);
  int (*xPagecount)(sqlite3_pcache*);
  sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag);
  void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard);
  void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, 
      unsigned oldKey, unsigned newKey);
  void (*xTruncate)(sqlite3_pcache*, unsigned iLimit);
  void (*xDestroy)(sqlite3_pcache*);
  void (*xShrink)(sqlite3_pcache*);
};

sqlite3_config(SQLITE_CONFIG_PCACHE2,...)接口可以通过传入 sqlite3_pcache_methods2 结构的实例来注册备用页面缓存实现。在许多应用程序中,大部分由 SQLite 分配的堆内存都用于页面缓存。通过使用此 API 实现自定义页面缓存,应用程序可以更好地控制 SQLite 消耗的内存量,分配和释放内存的方式以及用于准确确定数据库文件的哪些部分被缓存的策略以及多长时间。

备用页面缓存机制是一种极端措施,只需要最苛刻的应用程序。内建页面缓存推荐用于大多数用途。

在调用 sqlite3_config 时,sqlite3_pcache_methods2 结构的内容被 SQLite 复制到内部缓冲区。因此,应用程序可能会在调用 sqlite3_config()返回后放弃参数。

每次对 sqlite3_initialize()进行有效调用时,都会调用一次 xInit()方法(在进程的整个生命周期中通常只调用一次)。xInit()方法传递了 sqlite3_pcache_methods2.pArg 值的副本。xInit()方法的意图是设置自定义页面缓存实现所需的全局数据结构。如果xInit()方法为 NULL,则使用内置的默认页面缓存而不是应用程序定义的页面缓存。

xShutdown()方法由 sqlite3_shutdown()调用。如果需要,它可以用于在过程关闭之前清理任何未完成的资源。xShutdown()方法可能为 NULL。

SQLite 自动将调用序列化到 xInit 方法,所以 xInit 方法不需要是线程安全的。xShutdown 方法仅从 sqlite3_shutdown()调用,因此它不需要是线程安全的。所有其他方法在多线程应用程序中必须是线程安全的。

如果没有对 xShutdown()的干预调用,SQLite 将永远不会调用 xInit()。

SQLite 调用 xCreate()方法来构造一个新的缓存实例。SQLite 通常会为每个打开的数据库文件创建一个缓存实例,但不能保证。第一个参数 szPage 是必须由缓存分配的页面的大小(以字节为单位)。szPage 将永远是两个幂。第二个参数szExtra 是与每个页面缓存条目关联的额外存储的字节数。szExtra 参数的数字小于250。SQLite 将在每个页面上使用额外的 szExtra 字节来存储关于磁盘上基础数据库页面的元数据。传递给 szExtra 的值取决于 SQLite 版本,目标平台以及 SQLite的编译方式。如果正在创建的缓存将用于缓存存储在磁盘上的文件的数据库页,则 xCreate()的第三个参数是 bPurgeable,如果它用于内存数据库,则为 false。缓存实现不需要根据 bPurgeable 的值做任何特殊的事情; 它纯粹是咨询。在bPurgeable 为 false 的缓存上,SQLite 将永远不会调用 xUnpin(),除非故意删除一个页面。换句话说,在 bPurgeable 设置为 false 的缓存上调用 xUnpin()将始终将“discard”标志设置为 true。因此,使用 bPurgeable false创建的缓存将永远不会包含任何未锁定的页面。在 bPurgeable 设置为 false 的缓存上调用 xUnpin()将始终将“discard”标志设置为 true。因此,使用 bPurgeable false创建的缓存将永远不会包含任何未锁定的页面。在 bPurgeable 设置为 false 的缓存上调用 xUnpin()将始终将“discard”标志设置为 true。因此,使用 bPurgeable false 创建的缓存将永远不会包含任何未锁定的页面。

SQLite 可以随时调用 xCachesize()方法来设置作为第一个参数传递的缓存实例的建议最大缓存大小(存储的页面数)。这是使用 SQLite“PRAGMA cache_size”命令配置的值。与 bPurgeable 参数一样,实现不需要对此值做任何事情; 它只是咨询。

xPagecount()方法必须返回当前存储在缓存中的页数,这两个页都是固定的和未固定的。

xFetch()方法在缓存中查找页面,并返回指向与该页面关联的 sqlite3_pcache_page 对象的指针或 NULL 指针。返回的 sqlite3_pcache_page 对象的 pBuf 元素将是一个指向 szPage 字节缓冲区的指针,用于存储单个数据库页面的内容。sqlite3_pcache_page 的 pExtra 元素将成为 SQLite 为页面缓存中的每个条目请求的额外存储的 szExtra 字节的指针。

要获取的页面由密钥确定。最小键值为1。使用 xFetch 检索后,该页面被视为“固定”。

如果请求的页面已经在页面缓存中,那么页面缓存实现必须返回一个指向页面缓冲区的指针,其内容保持不变。如果请求的页面不在缓存中,那么缓存实现应该使用 createFlag 参数的值来帮助确定要采取的操作:

createFlag

页面尚未进入缓存时的行为

0

不要分配新的页面。返回 NULL。

1

如果能够轻松方便地分配新页面,请分配一个新页面。否则返回 NULL。

2

尽一切努力分配一个新的页面。只有在分配新页面时才返回 NULL 是不可能的。

SQLite 通常会使用0或1的 createFlag 调用 xFetch()。在先前的 createFlag 为1的调用失败之后,SQLite 将只使用2的 createFlag。在 xFetch()调用之间,SQLite 可以尝试通过将固定页面的内容泄漏到磁盘并​​同步操作系统磁盘高速缓存来解除一个或多个高速缓存页面的固定。

xUnpin()被 SQLite 用一个指向当前固定页面的指针作为第二个参数来调用。如果第三个参数 discard 非零,那么该页面必须从缓存中清除。如果丢弃参数为零,则可以根据页面缓存实施的意愿丢弃或保留该页面。页面缓存实现可以选择随时驱逐未固定的页面。

缓存不得执行任何引用计数。无论之前调用 xFetch()的次数,对 xUnpin()的单个调用都会取消页面。

xRekey()方法用于更改与作为第二个参数传递的页面关联的键值。如果高速缓存先前包含与 newKey 关联的条目,则必须丢弃该条目。任何与 newKey 关联的先前缓存条目都保证不被锁定。

当 SQLite 调用 xTruncate()方法时,缓存必须丢弃页码(键)大于或等于传递给 xTruncate()的 iLimit 参数值的所有现有缓存条目。如果这些页面中的任何一个被固定,则它们被隐式地取消固定,这意味着它们可以被安全地丢弃。

xDestroy()方法用于删除由 xCreate()分配的缓存。应该释放与指定缓存关联的所有资源。在调用 xDestroy()方法之后,SQLite 将 sqlite3_pcache *句柄视为无效,并且不会将其用于任何其他 sqlite3_pcache_methods2 函数。

SQLite 在希望页面缓存释放尽可能多的堆内存时调用 xShrink()方法。页面缓存实现没有义务释放任何内存,但良好行为的实现应尽其所能。

另请参见对象,常量和函数的列表。

 SQLite is in the Public Domain.

C界面 | C Interface相关

1.64-Bit Integer Types
2.A Handle To An Open BLOB
3.An Introduction To The SQLite C/C++ Interface
4.Attempt To Free Heap Memory
5.Authorizer Action Codes
6.Authorizer Return Codes
7.Automatically Load Statically Linked Extensions
8.Binding Values To Prepared Statements
9.C/C++ Interface For SQLite Version 3
10.C/C++ Interface For SQLite Version 3 (old)
11.Cancel Automatic Extension Loading
12.Checkpoint a database
13.Checkpoint Mode Values
14.Close A BLOB Handle
15.Closing A Database Connection
16.Collation Needed Callbacks
17.Column Names In A Result Set
18.Commit And Rollback Notification Callbacks
19.Compare the ages of two snapshot handles
20.Compile-Time Authorization Callbacks
21.Compile-Time Library Version Numbers
22.Compiling An SQL Statement
23.Configuration Options
24.Configure an auto-checkpoint
25.Configure database connections
26.Configuring The SQLite Library
27.Conflict resolution modes
28.Constants Defining Special Destructor Behavior
29.Convenience Routines For Running Queries
30.Copy And Free SQL Values
31.Count The Number Of Rows Modified
32.Create Or Redefine SQL Functions
33.Custom Page Cache Object
34.Data Change Notification Callbacks
35.Database Connection Configuration Options
36.Database Connection For Functions
37.Database Connection Handle
38.Database Connection Status
39.Database Snapshot
40.Declare The Schema Of A Virtual Table
41.Declared Datatype Of A Query Result
42.Define New Collating Sequences
43.Deprecated Functions
44.Deprecated Soft Heap Limit Interface
45.Destroy A Prepared Statement Object
46.Destroy a snapshot
47.Determine if a database is read-only
48.Determine If A Prepared Statement Has Been Reset
49.Determine If An SQL Statement Is Complete
50.Determine If An SQL Statement Writes The Database
51.Determine The Virtual Table Conflict Policy
52.Device Characteristics
53.Dynamically Typed Value Object
54.Enable Or Disable Extended Result Codes
55.Enable Or Disable Extension Loading
56.Enable Or Disable Shared Pager Cache
57.Error Codes And Messages
58.Error Logging Interface
59.Evaluate An SQL Statement
60.Experimental Interfaces
61.Extended Result Codes
62.Extract Metadata About A Column Of A Table
63.File Locking Levels
64.Find The Database Handle Of A Prepared Statement
65.Find the next prepared statement
66.Finding The Subtype Of SQL Values
67.Flags For File Open Operations
68.Flags for the xAccess VFS method
69.Flags for the xShmLock VFS method
70.Flush caches to disk mid-transaction
71.Formatted String Printing Functions
72.Free Memory Used By A Database Connection
73.Function Auxiliary Data
74.Function Flags
75.Fundamental Datatypes
76.Impose A Limit On Heap Size
77.Index Of A Parameter With A Given Name
78.Initialize The SQLite Library
79.Interrupt A Long-Running Query
80.Introduction
81.Last Insert Rowid
82.List Of SQLite Constants
83.List Of SQLite Functions
84.List Of SQLite Objects
85.Load An Extension
86.Loadable Extension Thunk
87.Low-Level Control Of Database Files
88.Low-level system error code
89.Maximum xShmLock index
90.Memory Allocation Routines
91.Memory Allocation Subsystem
92.Memory Allocator Statistics
93.Move a BLOB Handle to a New Row
94.Mutex Handle
95.Mutex Methods Object
96.Mutex Types
97.Mutex Verification Routines
98.Mutexes
99.Name Of A Host Parameter
100.Name Of The Folder Holding Database Files
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