2010-07-30 51 views
13

的SQLite VFS實現指導方針我正在使用FOpen,FRead,FWrite,FSeek和FClose爲Netburner嵌入式設備(非Windows)實現自定義VFS(虛擬文件系統)。我很驚訝,我找不到VFS的FOpen *版本。這將使它更容易移植到嵌入式設備。使用FOpen *

我發現了一些信息,SQLite的創建VFS這裏 http://sqlite.org/c3ref/vfs.html 但信息很詳細,我有很多關於執行工作的其他問題。

我在Win,OS2,Linux的SQLite源代碼中有一些示例VFS,但他們沒有很多註釋,只有源代碼。

我可以使用上面的鏈接提供的信息和示例來創建我自定義的VFS,但我確信如果我那樣做會錯過某些東西。

我的問題是:

  • 是否有關於我缺少SQLite的VFS任何更多的文檔?也許是一個實施指南?
  • 是否有可用的SQLite VFS的Fopen版本?
  • 是否有單元測試代碼可用於在創建它之後測試我的自定義SQLite VFS?
  • 建議,意見,實施SQLite VFS的經驗,你想分享。
+0

如果你在嵌入式設備上運行Linux,爲什麼你需要實現一個新的SQLite VFS? – 2010-08-08 03:19:14

+0

它不是Linux或Windows或OS2,它是http://www.freertos.org/的修改版本,不包括Linux/windows庫 – 2010-08-08 20:38:09

+1

我認爲你的意思是「實施*指導*」而不是「實施公會」。行會是一個工匠組織(有點像工會,但更多,這個,中世紀)。 我對你的問題沒有很好的答案,但我懷疑'fopen'和朋友不能用於sqlite,因爲沒有鎖定機制和語義,尤其是關於數據到達永久存儲時的語義,並不像因爲sqlite需要它們。 – zwol 2010-08-11 20:10:36

回答

4

您是否注意到頭文件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*); 

這些都是共享庫(見在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 *); 

,你可以一直在這裏os_unix.c :-)見unixGetLastError返回0(感謝谷歌代碼搜索跑不掉!)

祝你好運!

4

一種選擇是使用基於內存的VFS,然後在完成後簡單地將內存轉儲到文件。有關基於內存的VFS,請參閱:http://article.gmane.org/gmane.comp.db.sqlite.general/46450,該VFS已支持序列化/反序列化。

缺點是您必須手動將文件寫出才能保留。如果您的應用程序突然中斷,則數據庫的任何中間更改都不會被保留。

+0

非常有啓發性的鏈接與VFS的實現,但不知道我們可以按原樣使用它(請參閱http://osdir.com/ml/sqlite-users/2013-06/msg00067.html) – Tibo 2015-09-23 10:04:29