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大小); int(* xSync)(sqlite3_file *,int标志); 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 *); / *上面的方法对版本1有效* / int(* xShmMap)(sqlite3_file *,int iPg,int pgsz,int,void volatile **); int(* xShmLock)(sqlite3_file *,int偏移量,int n,int标志); void(* xShmBarrier)(sqlite3_file *); int(* xShmUnmap)(sqlite3_file *,int deleteFlag); / *上面的方法对版本2有效* / int(* xFetch)(sqlite3_file *,sqlite3_int64 iOfst,int iAmt,void ** pp); int(* xUnfetch)(sqlite3_file *,sqlite3_int64 iOfst,void * p); / *上面的方法对版本3有效* / / *将来的版本中可能会添加其他方法* / };
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的flags参数可以是SQLITE_SYNC_NORMAL或 SQLITE_SYNC_FULL之一。首选是普通的fsync()。第二个选择是Mac OS X风格的fullsync。可以对SQLITE_SYNC_DATAONLY 标志进行OR运算,以指示仅文件数据而不是其索引节点需要同步。
xLock()和xUnlock()的整数值为以下之一
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似乎可以正常工作。但是,如果无法将短读取值填充为零,最终将导致数据库损坏。