该文件对于功能的实现主要是通过一系列的函数和结构体。该文件的主线函数是sqlite3_os_init(),初始化操作系统接口,这个程序为所有类Unix操作系统的VFS实现注册。这个程序和紧随其后的sqlite3_os_end()程序是本文件中对其他文件可见的唯一程序,这个程序在SQLite初始化时便会通过单线程调用。
这个文件挂载了一些VFS(虚拟文件系统),每个VFS都包含一套系统调用的接口:
#define UNIXVFS(VFSNAME, FINDER) {
3, /* iVersion */
sizeof(unixFile), /* szOsFile */
MAX_PATHNAME, /* mxPathname */
0, /* pNext */
VFSNAME, /* zName */
(void*)&FINDER, /* pAppData */
unixOpen, /* xOpen */
unixDelete, /* xDelete */
unixAccess, /* xAccess */
unixFullPathname, /* xFullPathname */
unixDlOpen, /* xDlOpen */
unixDlError, /* xDlError */
unixDlSym, /* xDlSym */
unixDlClose, /* xDlClose */
unixRandomness, /* xRandomness */
unixSleep, /* xSleep */
unixCurrentTime, /* xCurrentTime */
unixGetLastError, /* xGetLastError */
unixCurrentTimeInt64, /* xCurrentTimeInt64 */
unixSetSystemCall, /* xSetSystemCall */
unixGetSystemCall, /* xGetSystemCall */
unixNextSystemCall, /* xNextSystemCall */
}
这是一套虚拟文件系统的标准系统调用接口,为一个sqlite3_vfs对象定义了一个初始化器,通过这些接口可以操作VFS下的文件。而挂载是在如下代码中完成的:
for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){
sqlite3_vfs_register(&aVfs[i], i==0);
}
return SQLITE_OK;
}
所有为Unix的默认VFS都包含了如下数组:
static sqlite3_vfs aVfs[]
初始化的虚拟文件系统列表在这个数组中。
而在如下代码中,定义了一套标准的系统调用接口组件:
static struct unix_syscall {
const char *zName; /* Name of the system call */
sqlite3_syscall_ptr pCurrent; /* Current value of the system call */
sqlite3_syscall_ptr pDefault; /* Default value */
}
我们顺着主要的接口之一unixOpen(),得到其主线流程如下图所示: