非常教程

Sqlite参考手册

C Interface: Session Module

Streaming Versions of API functions

流式 API 函数版本。

int sqlite3changeset_apply_strm(
  sqlite3 *db,                    /* Apply change to "main" db of this handle */
  int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */
  void *pIn,                                          /* First arg for xInput */
  int(*xFilter)(
    void *pCtx,                   /* Copy of sixth arg to _apply() */
    const char *zTab              /* Table name */
  ),
  int(*xConflict)(
    void *pCtx,                   /* Copy of sixth arg to _apply() */
    int eConflict,                /* DATA, MISSING, CONFLICT, CONSTRAINT */
    sqlite3_changeset_iter *p     /* Handle describing change and conflict */
  ),
  void *pCtx                      /* First argument passed to xConflict */
);
int sqlite3changeset_concat_strm(
  int (*xInputA)(void *pIn, void *pData, int *pnData),
  void *pInA,
  int (*xInputB)(void *pIn, void *pData, int *pnData),
  void *pInB,
  int (*xOutput)(void *pOut, const void *pData, int nData),
  void *pOut
);
int sqlite3changeset_invert_strm(
  int (*xInput)(void *pIn, void *pData, int *pnData),
  void *pIn,
  int (*xOutput)(void *pOut, const void *pData, int nData),
  void *pOut
);
int sqlite3changeset_start_strm(
  sqlite3_changeset_iter **pp,
  int (*xInput)(void *pIn, void *pData, int *pnData),
  void *pIn
);
int sqlite3session_changeset_strm(
  sqlite3_session *pSession,
  int (*xOutput)(void *pOut, const void *pData, int nData),
  void *pOut
);
int sqlite3session_patchset_strm(
  sqlite3_session *pSession,
  int (*xOutput)(void *pOut, const void *pData, int nData),
  void *pOut
);
int sqlite3changegroup_add_strm(sqlite3_changegroup*, 
    int (*xInput)(void *pIn, void *pData, int *pnData),
    void *pIn
);
int sqlite3changegroup_output_strm(sqlite3_changegroup*,
    int (*xOutput)(void *pOut, const void *pData, int nData), 
    void *pOut
);

这六个流式 API xxx_strm() 函数为相应的非流式 API 函数提供类似的用途:

流函数

非流式等式

sqlite3changeset_apply_strm

sqlite3changeset_apply

sqlite3changeset_concat_strm

sqlite3changeset_concat

sqlite3changeset_invert_strm

sqlite3changeset_invert

sqlite3changeset_start_strm

sqlite3changeset_start

sqlite3session_changeset_strm

sqlite3session_changeset

sqlite3session_patchset_strm

sqlite3session_patchset

接受变更集(或补丁集)作为输入的非流功能需要将整个变更集存储在内存中的单个缓冲区中。同样,那些返回变更集或补丁集的人通过返回一个指向使用 sqlite3_malloc() 分配的单个大缓冲区的指针来实现。通常这很方便。但是,如果需要在低内存环境中运行的应用程序处理非常大的变更集,则所需的大型连续内存分配可能变得繁重。

为了避免这个问题,输入通过回调函数传递给流式 API 函数,会话模块调用该函数以根据需要递增地请求输入数据。在所有情况下,一对 API 函数参数如

      int nChangeset,
      void *pChangeset,

被替换为:

      int (*xInput)(void *pIn, void *pData, int *pnData),
      void *pIn,

每次会话模块调用 xInput 回调函数时,传递的第一个参数都是提供的 pIn 上下文指针的副本。第二个参数 pData 指向一个大小为缓冲区(* pnData)的字节。假设没有发生错误,xInput 方法应该将最多(* pnData)个字节的数据拷贝到缓冲区中,并将(* pnData)设置为在返回 SQLITE_OK 之前复制的实际字节数。如果输入完全耗尽,(* pnData)应该设置为零来表示这一点。或者,如果发生错误,则应返回 SQLite 错误代码。在任何情况下,如果一个 xInput 回调函数返回一个错误,所有的处理都会被放弃,流式 API 函数会将错误代码的一个副本返回给调用者。

在 sqlite3changeset_start_strm() 的情况下,xInput 回调可能会在迭代器的生命周期中的任何点由会话模块调用。如果这样的 xInput 回调函数返回错误,则迭代器将进入错误状态,从而所有对迭代器函数的后续调用将立即失败,并返回由 xInput 返回的错误代码。

同样,返回变更集(或补丁集)的流 API 函数通过回调函数以块的形式返回它们,而不是通过指向单个大缓冲区的指针。在这种情况下,一对参数如:

      int *pnChangeset,
      void **ppChangeset,

被替换为:

      int (*xOutput)(void *pOut, const void *pData, int nData),
      void *pOut

调用 xOutput 回调零次或多次以将数据返回给应用程序。传递给每个调用的第一个参数是应用程序提供的 pOut 指针的副本。第二个参数 pData 指向一个大小为 nData 的缓冲区,其中包含返回的输出数据块。如果 xOutput 回调成功处理提供的数据,它应该返回 SQLITE_OK 以指示成功。否则,它应该返回一些其他的 SQLite 错误代码。在这种情况下,立即放弃处理,流式 API 函数将 xOutput 错误代码的副本返回给应用程序。

会话模块从未调用 xOutput 回调,并将第三个参数设置为小于或等于零的值。除此之外,不保证返回的数据块的大小。

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