零、概要

SQLite3 操作系统接口层,虚拟文件系统交互接口设计。本文不涉及具体操作系统实现,仅引出接口之间关系,更为现实的 Unix 操作系统中的 VFS 实现见下篇文章。

VFS 的接口功能具体为:由sqlite3_vfs中的xOpen方法构造sqlite3_file类,sqlite3_file类记录一些文件状态以及操作文件的具体方法sqlite3_io_methods

/*
** 操作系统接口封装
** 例如:调用删除,创建,打开,关闭读写文件接口
*/
struct sqlite3_vfs {
};
/*
** 表示当前打开文件状态
** 由 sqlite3_vfs 中 xOpen 方法构造
** 每个 sqlite3_file 中包含 sqlite3_io_methods
*/
struct sqlite3_file {
    /* 操作文件的具体方法 */
    const struct sqlite3_io_methods *pMethods;
};
/*
** 包含读写 sqlite3_file 等功能
*/
struct sqlite3_io_methods {
    int (*xClose)(sqlite3_file*);
};

一、准备

接口设计如下图所示:

sqlite3_vfs

sqlite3_file

接下来是对文件 test_demovfs.c 的代码剖析,该文件是对接口的简单实现,更现实的实现在 os_unix.c 源码文件中,将在下篇文章中剖析。本文仅分析sqlite3_vfssqlite3_filesqlite3_io_methods之间的关系。

二、剖析

注:省去大量不必要的实现细节,请读者自行参考源码。

/* 继承自 sqlite3_file 的文件类 */
struct DemoFile {
  sqlite3_file base; /* 基类 */
  int fd;            /* 文件描述符 */
  /* 缓冲区和偏移 */
  /* 具体在 base.pMethods 中使用到 */
  char *aBuffer;     
  int nBuffer;       
  sqlite3_int64 iBufferOfet;  
};
/* 对 sqlite3_vfs 的构造 */
sqlite3_vfs *sqlite3_demovfs(void) {
  static sqlite3_vfs demovfs = { ... };
  return &demovfs;
}
/* xOpen 方法中构造 sqlite3_file 文件类 */
static int demoOpen(
  sqlite3_vfs *pVfs,  /* VFS */
  const char *zName,  /* 打开文件名 */
  sqlite3_file *pFile,/* sqlite3_file 文件 */
  int flags,          /* Input SQLITE_OPEN_XXX flags */
  int *pOutFlags      /* Output SQLITE_OPEN_XXX flags (or NULL) */
){
  static const sqlite3_io_methods demoio = { ... };
  DemoFile *p = (DemoFile*)pFile; 
  /* 初始化 sqlite3_file 类型 */
  memset(p, 0, sizeof(DemoFile));
  /* 打开文件 */
  p->fd = open(zName, oflags, 0600);
  /* 添加buffer */
  p->aBuffer = aBuf;
  /* sqlite3_file 中相应方法 */
  p->base.pMethods = &demoio;
  return SQLITE_OK;
}

总结:

首先由函数sqlite3_demovfs构造sqlite3_vfs,在由统一接口sqlite3_vfs_register注册。当打开文件时调用注册的sqlite3_vfs对象中的xOpen方法,由该方法构造sqlite3_file并返回。

三、参考

Last modification:May 26th, 2020 at 05:41 pm