我将使用fopen、fread、fwrite、fseek和fclose为NetBurner嵌入式设备(非Windows)实现自定义vfs(虚拟文件系统)。我很惊讶我找不到一个fopen*版本的vfs。这将使它更易于移植到嵌入式设备上。
我在这里找到了一些有关为sqlite创建vfs的信息
http://sqlite.org/c3ref/vfs.html
但是信息非常详细,我还有很多关于实现的其他问题。
我在win、os2、linux的sqlite源代码中有一些示例vfs,但是它们没有很多注释,只有源代码。
我可以使用上面链接中提供的信息和示例来创建我的自定义VFS,但我确信如果这样做的话,我会错过一些东西。
我的问题是:
有没有关于我丢失的sqlite vfs的更多文档?也许是实施指南?
是否有可用的sqlite vfs的fopen版本?
是否有一个单元测试代码可以在创建后测试我的自定义sqlite vfs?
建议,评论,实现您想要分享的sqlite vfs的经验。

最佳答案

您是否注意到头文件中有其他文档来源?另外,谷歌代码搜索是你的朋友。
不要太担心丢失的东西,这就是测试套件的用途。从每个方法的名称、文档和示例实现中猜测它们的用途;进行第一个草稿实现;在目标平台上运行测试;迭代直到条为绿色。从您引用的接口文档的粗略阅读中,可以得出一些有根据的猜测:

  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);

这些是您的工厂文件管理功能。您会注意到,sqlite3.h反过来返回一个结构,它有自己的指针方法用于读写。
  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*);

这些是用于共享库的(请参见Linux上的xOpen()手册页)。在嵌入式环境中,您可能会让这些未实现(尝试将其设置为空)。
  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代码搜索!)
祝你好运!

10-06 05:33