我将使用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代码搜索!)
祝你好运!