我即将使用FOpen,FRead,FWrite,FSeek和FClose为Netburner嵌入式设备(非Windows)实现自定义VFS(虚拟文件系统)。我很惊讶我找不到可用的VFS的FOpen *版本。这将使嵌入式设备的便携性更高。
我在这里找到了有关为SQLite创建VFS的一些信息 http://sqlite.org/c3ref/vfs.html 但信息非常详细,我还有很多关于实施的问题。
我在Winite,OS2,Linux的SQLite源代码中有一些示例VFS,但它们没有很多注释,只有源代码。
我可以使用上面链接中提供的信息和示例来创建我的自定义VFS,但我确信如果我这样做,我会错过一些东西。
我的问题是:
答案 0 :(得分:4)
您是否注意到标头文件sqlite3.h
中还有其他文档来源?此外,Google代码搜索是您的朋友。
不要过于担心丢失的东西,这就是测试套件的用途。从他们的名字,文档和示例实现中猜测每个方法的目的;寻求初稿实施;在目标平台上运行测试;迭代直到条形为绿色。通过粗略阅读您引用的界面文档,这里有一些有根据的猜测:
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*);
这些用于共享库(请参阅Linux上的dlopen()
手册页)。在嵌入式环境中,您可能会将这些未实现(尝试将这些设置为NULL)。
int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut);
如果您的操作系统标准库尚未提供随机数生成器,则可能必须实现随机数生成器。我建议linear feedback register,虽然小而且好。
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 Code Search!)
祝你好运!答案 1 :(得分:4)
一种选择是使用基于内存的VFS,然后在完成后将内存转储到文件中。有关已支持序列化/反序列化的基于内存的VFS,请参阅:http://article.gmane.org/gmane.comp.db.sqlite.general/46450。
缺点是您必须手动将文件写出来才能保留。如果您的应用程序突然死亡,则不会保留对DB的任何中间更改。