SQLite C 接口
操作系统接口文件虚拟方法对象
typedef struct sqlite3_io_methods sqlite3_io_methods; struct sqlite3_io_methods { int iVersion; int (*xClose)(sqlite3_file*); int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); int (*xSync)(sqlite3_file*, int flags); int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); int (*xLock)(sqlite3_file*, int); int (*xUnlock)(sqlite3_file*, int); int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); int (*xFileControl)(sqlite3_file*, int op, void *pArg); int (*xSectorSize)(sqlite3_file*); int (*xDeviceCharacteristics)(sqlite3_file*); /* Methods above are valid for version 1 */ int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**); int (*xShmLock)(sqlite3_file*, int offset, int n, int flags); void (*xShmBarrier)(sqlite3_file*); int (*xShmUnmap)(sqlite3_file*, int deleteFlag); /* Methods above are valid for version 2 */ int (*xFetch)(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); int (*xUnfetch)(sqlite3_file*, sqlite3_int64 iOfst, void *p); /* Methods above are valid for version 3 */ /* Additional methods may be added in future releases */ };
sqlite3_vfs.xOpen方法 打开的每个文件都会填充一个 sqlite3_file对象(或者,更常见的是, sqlite3_file对象的子类),并带有指向该对象实例的指针。该对象定义了用于对sqlite3_file对象表示的打开文件执行各种操作的方法。
如果sqlite3_vfs.xOpen方法将 sqlite3_file.pMethods 元素设置为非 NULL 指针,则即使sqlite3_vfs.xOpen报告失败,也可以调用 sqlite3_io_methods.xClose 方法。阻止在sqlite3_vfs.xOpen失败后调用 xClose 的唯一方法 是让sqlite3_vfs.xOpen将 sqlite3_file.pMethods 元素设置为 NULL。
xSync 的标志参数可以是SQLITE_SYNC_NORMAL或 SQLITE_SYNC_FULL 之一。第一个选择是普通的 fsync()。第二个选择是 Mac OS X 风格的全同步。SQLITE_SYNC_DATAONLY标志可以进行ORed ,以指示只需要同步文件的数据而不是其 inode。
xLock() 和 xUnlock() 的整数值是其中之一
- SQLITE_LOCK_NONE,
- SQLITE_LOCK_SHARED,
- SQLITE_LOCK_RESERVED,
- SQLITE_LOCK_PENDING, or
- SQLITE_LOCK_EXCLUSIVE.
xFileControl() 方法是一个通用接口,允许自定义 VFS 实现使用 sqlite3_file_control()接口直接控制打开的文件。第二个“op”参数是一个整数操作码。第三个参数是一个通用指针,旨在指向一个结构,该结构可能包含参数或用于写入返回值的空间。xFileControl() 的潜在用途可能是启用超时阻塞锁、更改锁定策略(例如使用点文件锁)、查询锁的状态或打破陈旧锁的功能。SQLite 核心保留所有小于 100 的操作码供自己使用。操作码列表少于 100 个可用。定义自定义 xFileControl 方法的应用程序应使用大于 100 的操作码以避免冲突。VFS 实现应该为它们不识别的文件控制操作码返回SQLITE_NOTFOUND 。
xSectorSize() 方法返回作为文件基础的设备的扇区大小。扇区大小是在不影响文件中其他字节的情况下可以执行的最小写入。xDeviceCharacteristics() 方法返回一个描述底层设备行为的位向量:
- SQLITE_IOCAP_ATOMIC
- SQLITE_IOCAP_ATOMIC512
- SQLITE_IOCAP_ATOMIC1K
- SQLITE_IOCAP_ATOMIC2K
- SQLITE_IOCAP_ATOMIC4K
- SQLITE_IOCAP_ATOMIC8K
- SQLITE_IOCAP_ATOMIC16K
- SQLITE_IOCAP_ATOMIC32K
- SQLITE_IOCAP_ATOMIC64K
- SQLITE_IOCAP_SAFE_APPEND
- SQLITE_IOCAP_SEQUENTIAL
- SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN
- SQLITE_IOCAP_POWERSAFE_OVERWRITE
- SQLITE_IOCAP_IMMUTABLE
- SQLITE_IOCAP_BATCH_ATOMIC
SQLITE_IOCAP_ATOMIC 属性意味着任何大小的所有写入都是原子的。SQLITE_IOCAP_ATOMICnnn 值意味着写入大小为 nnn 字节且与 nnn 的整数倍地址对齐的块是原子的。SQLITE_IOCAP_SAFE_APPEND 值意味着当数据附加到文件时,首先附加数据,然后扩展文件的大小,而不是相反。SQLITE_IOCAP_SEQUENTIAL 属性意味着信息写入磁盘的顺序与调用 xWrite() 的顺序相同。
如果 xRead() 返回 SQLITE_IOERR_SHORT_READ,它还必须用零填充缓冲区的未读部分。无法对短读取进行零填充的 VFS 似乎可以工作。但是,未能对短读取进行零填充最终会导致数据库损坏。