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_NORMALSQLITE_SYNC_FULL 之一第一个选择是普通的 fsync()。第二个选择是 Mac OS X 风格的全同步。SQLITE_SYNC_DATAONLY标志可以进行ORed ,以指示只需要同步文件的数据而不是其 inode。

xLock() 和 xUnlock() 的整数值是其中之一

xLock() 增加锁。xUnlock() 减少锁定。xCheckReservedLock() 方法检查此进程或其他进程中的任何数据库连接是否持有文件上的 RESERVED、PENDING 或 EXCLUSIVE 锁。如果存在这样的锁,则返回 true,否则返回 false。

xFileControl() 方法是一个通用接口,允许自定义 VFS 实现使用 sqlite3_file_control()接口直接控制打开的文件。第二个“op”参数是一个整数操作码。第三个参数是一个通用指针,旨在指向一个结构,该结构可能包含参数或用于写入返回值的空间。xFileControl() 的潜在用途可能是启用超时阻塞锁、更改锁定策略(例如使用点文件锁)、查询锁的状态或打破陈旧锁的功能。SQLite 核心保留所有小于 100 的操作码供自己使用。操作码列表少于 100 个可用。定义自定义 xFileControl 方法的应用程序应使用大于 100 的操作码以避免冲突。VFS 实现应该为它们不识别的文件控制操作码返回SQLITE_NOTFOUND 。

xSectorSize() 方法返回作为文件基础的设备的扇区大小。扇区大小是在不影响文件中其他字节的情况下可以执行的最小写入。xDeviceCharacteristics() 方法返回一个描述底层设备行为的位向量:

SQLITE_IOCAP_ATOMIC 属性意味着任何大小的所有写入都是原子的。SQLITE_IOCAP_ATOMICnnn 值意味着写入大小为 nnn 字节且与 nnn 的整数倍地址对齐的块是原子的。SQLITE_IOCAP_SAFE_APPEND 值意味着当数据附加到文件时,首先附加数据,然后扩展文件的大小,而不是相反。SQLITE_IOCAP_SEQUENTIAL 属性意味着信息写入磁盘的顺序与调用 xWrite() 的顺序相同。

如果 xRead() 返回 SQLITE_IOERR_SHORT_READ,它还必须用零填充缓冲区的未读部分。无法对短读取进行零填充的 VFS 似乎可以工作。但是,未能对短读取进行零填充最终会导致数据库损坏。

另请参阅 对象常量函数的列表。