SQLite C 接口
标准文件控制操作码
#define SQLITE_FCNTL_LOCKSTATE 1 #define SQLITE_FCNTL_GET_LOCKPROXYFILE 2 #define SQLITE_FCNTL_SET_LOCKPROXYFILE 3 #define SQLITE_FCNTL_LAST_ERRNO 4 #define SQLITE_FCNTL_SIZE_HINT 5 #define SQLITE_FCNTL_CHUNK_SIZE 6 #define SQLITE_FCNTL_FILE_POINTER 7 #define SQLITE_FCNTL_SYNC_OMITTED 8 #define SQLITE_FCNTL_WIN32_AV_RETRY 9 #define SQLITE_FCNTL_PERSIST_WAL 10 #define SQLITE_FCNTL_OVERWRITE 11 #define SQLITE_FCNTL_VFSNAME 12 #define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13 #define SQLITE_FCNTL_PRAGMA 14 #define SQLITE_FCNTL_BUSYHANDLER 15 #define SQLITE_FCNTL_TEMPFILENAME 16 #define SQLITE_FCNTL_MMAP_SIZE 18 #define SQLITE_FCNTL_TRACE 19 #define SQLITE_FCNTL_HAS_MOVED 20 #define SQLITE_FCNTL_SYNC 21 #define SQLITE_FCNTL_COMMIT_PHASETWO 22 #define SQLITE_FCNTL_WIN32_SET_HANDLE 23 #define SQLITE_FCNTL_WAL_BLOCK 24 #define SQLITE_FCNTL_ZIPVFS 25 #define SQLITE_FCNTL_RBU 26 #define SQLITE_FCNTL_VFS_POINTER 27 #define SQLITE_FCNTL_JOURNAL_POINTER 28 #define SQLITE_FCNTL_WIN32_GET_HANDLE 29 #define SQLITE_FCNTL_PDB 30 #define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31 #define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32 #define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 #define SQLITE_FCNTL_LOCK_TIMEOUT 34 #define SQLITE_FCNTL_DATA_VERSION 35 #define SQLITE_FCNTL_SIZE_LIMIT 36 #define SQLITE_FCNTL_CKPT_DONE 37 #define SQLITE_FCNTL_RESERVE_BYTES 38 #define SQLITE_FCNTL_CKPT_START 39 #define SQLITE_FCNTL_EXTERNAL_READER 40 #define SQLITE_FCNTL_CKSM_FILE 41
这些整数常量是sqlite3_io_methods对象 的 xFileControl 方法和sqlite3_file_control() 接口的操作码。
- SQLITE_FCNTL_LOCKSTATE操作码用于调试。此操作码导致 xFileControl 方法将锁的当前状态(SQLITE_LOCK_NONE、SQLITE_LOCK_SHARED、 SQLITE_LOCK_RESERVED、SQLITE_LOCK_PENDING或SQLITE_LOCK_EXCLUSIVE 之一)写入 pArg 参数指向的整数。此功能在测试期间使用,并且仅在使用 SQLITE_TEST 编译时选项时可用。
- SQLITE_FCNTL_SIZE_HINT操作码被 SQLite 用来向 VFS 层提示在当前事务期间数据库文件将增长到多大。此提示不保证准确,但通常很接近。底层 VFS 可能会根据此提示选择预分配数据库文件空间,以帮助更快地写入数据库文件。
- SQLITE_FCNTL_SIZE_LIMIT操作码由实现sqlite3_deserialize()的内存 VFS 使用,以设置内存数据库大小的上限。参数是指向sqlite3_int64的指针。如果指向的整数是负数,则用当前限制填充。否则,限制设置为指向的整数值和当前数据库大小中的较大者。指向的整数被设置为新的限制。
- SQLITE_FCNTL_CHUNK_SIZE操作码用于请求 VFS 以用户指定的大小块扩展和截断数据库文件。sqlite3_file_control()的第四个参数应指向一个整数(int 类型),其中包含用于指定数据库的新块大小。以大块(比如一次 1MB)的形式分配数据库文件空间,可以减少文件系统碎片并提高某些系统的性能。
- SQLITE_FCNTL_FILE_POINTER操作码用于获取指向与特定数据库连接关联的sqlite3_file对象的指针。另见SQLITE_FCNTL_JOURNAL_POINTER。
- SQLITE_FCNTL_JOURNAL_POINTER操作码用于获取指向与特定数据库连接的日志文件(回滚日志或预写日志)关联的sqlite3_file对象的指针。另见SQLITE_FCNTL_FILE_POINTER。
- 不再使用。
- SQLITE_FCNTL_SYNC操作码由 SQLite 在内部生成,并在对数据库文件描述符调用 xSync 方法之前立即发送到 VFS。或者,如果由于用户已将 SQLite 配置为 PRAGMA synchronous=OFF而未调用 xSync 方法,则会调用它来代替 xSync 方法。在大多数情况下,与此文件控制一起传递的指针参数为 NULL。但是,如果数据库文件作为多数据库提交的一部分进行同步,则该参数指向一个包含事务超级日志文件名的以 nul 结尾的字符串。不需要这个信号的 VFS 应该默默地忽略这个操作码。应用程序不应调用sqlite3_file_control()使用此操作码,因为这样做可能会中断需要它的专用 VFS 的操作。
- SQLITE_FCNTL_COMMIT_PHASETWO操作码由 SQLite 内部生成,并在事务立即提交之后但在数据库解锁之前发送到 VFS。不需要这个信号的 VFS 应该默默地忽略这个操作码。应用程序不应使用此操作码调用 sqlite3_file_control(),因为这样做可能会中断需要它的专用 VFS 的操作。
- SQLITE_FCNTL_WIN32_AV_RETRY操作码用于为 windows VFS的某些磁盘 I/O 操作配置自动重试计数和间隔为了在存在反病毒程序的情况下提供稳健性。默认情况下,windows VFS 将重试文件读取、文件写入和文件删除操作最多 10 次,在第一次重试之前有 25 毫秒的延迟,并且随着后续每次重试的延迟增加 25 毫秒。此操作码允许调整这两个值(10 次重试和 25 毫秒延迟)。同一进程中所有数据库连接的值都会更改。参数是指向两个整数数组的指针,其中第一个整数是新的重试计数,第二个整数是延迟。如果任一整数为负,则设置不会更改,而是将该设置的先前值写入数组条目,从而允许查询当前的重试设置。
- SQLITE_FCNTL_PERSIST_WAL操作码用于设置或查询持久的预写日志设置。默认情况下,用于事务控制的辅助预写日志( WAL 文件)和共享内存文件会在最新的数据库连接关闭时自动删除。设置持久 WAL 模式会导致这些文件在关闭后仍然存在。当对包含数据库文件的目录没有写权限的其他进程想要读取数据库文件时,持久化文件很有用,因为 WAL 和共享内存文件必须存在才能使数据库可读。sqlite3_file_control()的第四个参数 因为这个操作码应该是一个指向整数的指针。该整数为 0 以禁用持久 WAL 模式或 1 以启用持久 WAL 模式。如果整数是 -1,那么它会被当前的 WAL 持久性设置覆盖。
- SQLITE_FCNTL_POWERSAFE_OVERWRITE操作码用于设置或查询持久的“powersafe-overwrite”或“PSOW”设置。PSOW 设置决定了xDeviceCharacteristics 方法的SQLITE_IOCAP_POWERSAFE_OVERWRITE位。此操作码的sqlite3_file_control()的第四个参数 应该是一个指向整数的指针。该整数为 0 以禁用零损坏模式或 1 以启用零损坏模式。如果整数为 -1,则它会被当前的零损坏模式设置覆盖。
- SQLITE_FCNTL_OVERWRITE操作码在打开写入事务后由 SQLite 调用,以指示除非由于某种原因回滚,否则整个数据库文件将被当前事务覆盖。这由 VACUUM 操作使用。
- SQLITE_FCNTL_VFSNAME操作码可用于获取VFS 堆栈中所有VFS的名称。所有VFS shim的名称和最终底层VFS被写入从 sqlite3_malloc()获得的内存中,结果存储在sqlite3_file_control()的第四个参数指向的char*变量中。调用者负责在完成后释放内存。与所有文件控制操作一样,不能保证这会实际执行任何操作。调用者应将 char* 变量初始化为 NULL 指针,以防未实现此文件控制。此文件控件仅供诊断使用。
- SQLITE_FCNTL_VFS_POINTER操作码找到指向当前使用的顶级 VFS 的 指针。sqlite3_file_control(db,SQLITE_FCNTL_VFS_POINTER,X) 中的参数 X 必须是“ sqlite3_vfs **”类型。该操作码会将 *X 设置为指向顶级 VFS 的指针。当堆栈中有多个 VFS shim 时,此操作码仅查找最上面的 shim。
- 每当解析PRAGMA语句时,都会将SQLITE_FCNTL_PRAGMA 文件控件发送到与 pragma 语句所引用的数据库文件对应的打开的sqlite3_file对象。SQLITE_FCNTL_PRAGMA文件控件的参数是指向字符串 (char**) 的指针数组,其中数组的第二个元素是 pragma 的名称,第三个元素是 pragma 的参数,如果 pragma 没有,则为 NULL争论。SQLITE_FCNTL_PRAGMA文件控件的处理程序 可以选择使 char** 参数的第一个元素指向从sqlite3_mprintf()获得的字符串 或等效项,如果编译指示失败,则该字符串将成为编译指示或错误消息的结果。如果 SQLITE_FCNTL_PRAGMA文件控件返回SQLITE_NOTFOUND,那么正常 的PRAGMA处理将继续。如果SQLITE_FCNTL_PRAGMA 文件控件返回SQLITE_OK,那么解析器假定 VFS 已经处理了 PRAGMA 本身,并且如果结果字符串为 NULL,则解析器生成一个无操作准备语句,或者如果字符串为非,则返回结果字符串的副本-无效的。如果SQLITE_FCNTL_PRAGMA文件控件返回SQLITE_OK或SQLITE_NOTFOUND以外的任何结果代码,这意味着 VFS 在处理PRAGMA时遇到错误,并且 PRAGMA的编译因错误而失败。SQLITE_FCNTL_PRAGMA文件控制出现在 pragma 语句分析的开始 ,因此它能够覆盖内置的PRAGMA语句。
- SQLITE_FCNTL_BUSYHANDLER文件控件可能会 在数据库文件句柄打开后不久被 SQLite 调用,以便为自定义 VFS 提供访问连接的繁忙处理程序回调的权限。参数的类型为 (void**) - 两个 (void *) 值的数组。第一个(void *)实际上指向一个类型为(int (*)(void *))的函数。为了调用连接的繁忙处理程序,调用此函数时应将数组中的第二个 (void *) 作为唯一参数。如果它返回非零值,则应重试该操作。如果返回零,则自定义 VFS 应放弃当前操作。
- 应用程序可以调用SQLITE_FCNTL_TEMPFILENAME文件控件让 SQLite 使用相同的算法生成临时文件名,该算法遵循为 TEMP 表和其他内部用途生成临时文件名。参数应该是一个 char** ,它将填充从sqlite3_malloc()获得的写入内存的文件名。调用者应该在结果上调用sqlite3_free()以避免内存泄漏。
- SQLITE_FCNTL_MMAP_SIZE文件控件用于查询或设置将用于内存映射 I/O 的最大字节数。该参数是一个指向 sqlite3_int64 类型值的指针,该值是文件到内存映射中建议的最大字节数。指针被旧值覆盖。如果最初指向的值是负数,则限制不会改变,因此可以通过传递一个指向负数的指针来查询当前限制。此文件控制在内部用于实现PRAGMA mmap_size。
- SQLITE_FCNTL_TRACE文件控件向VFS提供有关 SQLite 堆栈的高层正在做什么的咨询信息。此文件控制由某些 VFS 活动跟踪垫片使用。参数是一个以零结尾的字符串。如果启用了SQLITE_USE_FCNTL_TRACE编译时选项,则 SQLite 堆栈中的更高层可能会生成此文件控件的实例。
- SQLITE_FCNTL_HAS_MOVED文件控件将其参数解释为指向整数的指针,并根据文件自首次打开后是否已重命名、移动或删除,将布尔值写入该整数。
- SQLITE_FCNTL_WIN32_GET_HANDLE操作码可用于获取与文件句柄关联的底层本机文件句柄。此文件控件将其参数解释为指向本机文件句柄的指针,并将结果值写入那里。
- SQLITE_FCNTL_WIN32_SET_HANDLE操作码用于调试。此操作码导致 xFileControl 方法将文件句柄与 pArg 参数指向的句柄交换。此功能在测试期间使用,并且仅在定义 SQLITE_TEST 时才需要支持。
- SQLITE_FCNTL_WAL_BLOCK是向 VFS 层发出的信号,如果锁不是立即可用,则阻塞下一个 WAL 锁可能是有利的。WAL 子系统在极少数情况下会发出此信号,以解决优先级反转问题。应用程序不应使用此文件控件。
- SQLITE_FCNTL_ZIPVFS操作码仅由 zipvfs 实现。所有其他 VFS 都应该为此操作码返回 SQLITE_NOTFOUND。
- SQLITE_FCNTL_RBU操作码仅由 RBU 扩展使用的特殊 VFS 实现。所有其他 VFS 都应该为此操作码返回 SQLITE_NOTFOUND。
- 如果SQLITE_FCNTL_BEGIN_ATOMIC_WRITE操作码返回 SQLITE_OK,则文件描述符被置于“批写入模式”,这意味着所有后续写入操作将被推迟并在下一个SQLITE_FCNTL_COMMIT_ATOMIC_WRITE原子地完成。不支持批量原子写入的系统将返回 SQLITE_NOTFOUND。在 SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 成功之后,在关闭SQLITE_FCNTL_COMMIT_ATOMIC_WRITE或 SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 之前,SQLite 将不会对同一个sqlite3_file文件描述符进行 VFS 接口调用,除了使用 SQLITE_FCNTL_SIZE_HINT 调用 xWrite 方法和 xFileControl方法。
- SQLITE_FCNTL_COMMIT_ATOMIC_WRITE操作码导致自上次成功调用 SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 以来的所有写操作以 原子方式执行。当且仅当写入全部成功执行并已提交到持久存储时,此文件控件才返回SQLITE_OK 。不管是否成功,这个文件控制都会使文件描述符脱离批写入模式,以便所有后续的写入操作都是独立的。如果没有事先成功调用 SQLITE_FCNTL_BEGIN_ATOMIC_WRITE ,SQLite 将永远不会调用SQLITE_FCNTL_COMMIT_ATOMIC_WRITE。
- SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE操作码导致自上次成功调用 SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 以来的所有写 操作回滚。此文件控制使文件描述符脱离批写入模式,以便所有后续写入操作都是独立的。如果没有事先成功调用 SQLITE_FCNTL_BEGIN_ATOMIC_WRITE ,SQLite 将永远不会调用SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE。
- SQLITE_FCNTL_LOCK_TIMEOUT操作码用于将 VFS 配置为在尝试使用 VFS 的 xLock 或 xShmLock 方法获取文件锁失败之前最多阻塞 M 毫秒。该参数是一个指向 32 位有符号整数的指针,该整数包含 M 将要设置的值。在返回之前,32 位有符号整数被 M 的先前值覆盖。
- SQLITE_FCNTL_DATA_VERSION操作码用于检测对数据库文件的更改。参数是指向 32 位无符号整数的指针。寻呼机的“数据版本”被写入指针。每当相应的数据库文件发生任何更改时,“数据版本”都会更改,无论是通过同一数据库连接上的 SQL 语句,还是通过可能在其他进程中由单独的数据库连接提交的事务。sqlite3_total_changes()接口可用于查找连接上的 任何数据库是否已更改,但该接口响应 TEMP 和 MAIN 上的更改,并且不提供仅检测 MAIN 更改的机制。此外, sqlite3_total_changes()接口仅响应内部更改并忽略其他数据库连接所做的更改。PRAGMA data_version命令提供了一种机制来检测由于其他数据库连接而发生的 对单个附加数据库的更改,但忽略了调用它的数据库连接实现的更改。此文件控制是检测内部或外部发生的更改以及与特定附加数据库相关联的唯一机制。
- SQLITE_FCNTL_CKPT_START操作码在客户端开始将页面从 wal 文件复制到数据库文件之前从 wal 模式的检查点内调用。
- SQLITE_FCNTL_CKPT_DONE操作码在客户端完成将页面从 wal 文件复制到数据库文件之后,但在更新 * -shm文件以记录页面已被检查点的事实之前,从 wal 模式的检查点内调用。