SQlite源码分析

功能的主要实现

       该文件对于功能的实现主要是通过一系列的函数和结构体。该文件的主线函数是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(),得到其主线流程如下图所示:

图1.1 unixOpen()程序流程图