14

我即将使用 FOpen、FRead、FWrite、FSeek 和 FClose 为 Netburner 嵌入式设备(非 Windows)实现自定义 VFS(虚拟文件系统)。我很惊讶我找不到可用的 VFS 的 FOpen* 版本。它将使其对嵌入式设备更具可移植性。

我在这里找到了一些关于为 SQLite 创建 VFS 的信息http://sqlite.org/c3ref/vfs.html 但这些信息非常详细,而且我还有很多关于实现的其他问题。

我在 Win、OS2、Linux 的 SQLite 源代码中有一些示例 VFS,但它们没有很多注释,只有源代码。

我可以使用上面链接中提供的信息和示例来创建我的自定义 VFS,但我敢肯定,如果我这样做,我会错过一些东西。

我的问题是:

  • 还有关于我缺少的 SQLite VFS 的更多文档吗?也许是实施指南?
  • 是否有可用的 SQLite VFS 的 Fopen 版本?
  • 创建自定义 SQLite VFS 后,是否有可用于测试自定义 SQLite VFS 的单元测试代码?
  • 您想分享的关于实施 SQLite VFS 的建议、评论和经验。
4

2 回答 2

5

您是否注意到头文件中有额外的文档来源sqlite3.h?此外,谷歌代码搜索是您的朋友。

不要太担心丢失的东西,这就是测试套件的用途。从名称、文档和示例实现中猜测每个方法的用途;进行初稿实施;在您的目标平台上运行测试;迭代直到条为绿色。通过粗略阅读您引用的界面文档,以下是一些有根据的猜测:

  int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*,
               int flags, int *pOutFlags);
  int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir);
  int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut);
  int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut);

这些是您常用的文件管理功能。你会注意到xOpen()它又返回一个结构sqlite3_file,它有自己的指针方法用于读取和写入。

  void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename);
  void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg);
  void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void);
  void (*xDlClose)(sqlite3_vfs*, void*);

这些用于共享库(参见dlopen()Linux 上的手册页)。在嵌入式环境中,您可能可以保留这些未实现(尝试将这些设置为 NULL)。

  int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut);

如果您的操作系统的标准库还没有提供随机数生成器,您可能必须实现一个随机数生成器。我建议使用线性反馈寄存器,它很小但很好。

  int (*xSleep)(sqlite3_vfs*, int microseconds);
  int (*xCurrentTime)(sqlite3_vfs*, double*);
  int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*);

这些是时间管理功能,用于连接您的操作系统。

  int (*xGetLastError)(sqlite3_vfs*, int, char *);

您可以通过始终在此处返回 0 来逃脱 :-) 请参阅 os_unix.c 中的 unixGetLastError(感谢 Google 代码搜索!)

祝你好运!

于 2010-09-08T11:20:37.973 回答
4

一种选择是使用基于内存的 VFS,然后在完成后简单地将内存转储到文件中。请参阅:http : //article.gmane.org/gmane.comp.db.sqlite.general/46450,了解已经支持序列化/反序列化的基于内存的 VFS。

缺点是您必须手动将文件写出才能保留。如果您的应用程序突然死机,对数据库的任何中间更改都不会被持久化。

于 2011-02-01T22:39:36.733 回答