2012-04-14 89 views
2

我需要知道我打開的SQLite數據庫是否是隻讀的。我必須使用稍微過時的SQLite版本,其中沒有sqlite3_db_readonly()。 sqlite3_db_readonly()的實現使用私人調用,所以它不能被複制到客戶端代碼中。除了在打開之前檢查文件是否可寫之外,還可以做些什麼?確定SQLite 3數據庫是否爲只讀 - 不使用sqlite3_db_readonly()

編輯:版本是3.7.0.1。

編輯2:我正在使用合併。

+0

你使用的是什麼版本的sqlite? – 2012-04-14 16:00:14

+0

我正在使用3.7.0.1 – user38329 2012-04-14 16:09:23

回答

2

您可能已經掌握了sqlite3「數據庫連接句柄」對象。它在sqliteInt.h定義:

struct sqlite3 { 
    sqlite3_vfs *pVfs;   /* OS Interface */ 
    int nDb;      /* Number of backends currently in use */ 
    Db *aDb;      /* All backends */ 
    int flags;     /* Miscellaneous flags. See below */ 
    int openFlags;    /* Flags passed to sqlite3_vfs.xOpen() */ 
    int errCode;     /* Most recent error code (SQLITE_*) */ 
    int errMask;     /* & result codes with this before returning */ 

您可以再與對O_RDWRopenFlags成員測試只讀。

#define O_RDONLY  00000000 
#define O_WRONLY  00000001 
#define O_RDWR   00000002 

爲了確保這是不一樣的新sqlite3_db_readonly(),但它可能是不夠你的背景。

編輯

跟進您的評論,你可以做以下的爲「面向未來」的代碼:

  • 檢查,如果sqlite3結構3.7.0.1和第一個版本之間變化支持sqlite3_db_readonly()
  • 使用一些宏將sqlite3結構(或右邊偏移openFlags)的右邊映射與相應的3.xyz版本映射,因爲SQLITE_VERSION_NUMBER是在sqlite3.h中定義的。
  • 從支持sqlite3_db_readonly()的版本開始調用它。

注意,數據庫將打開只讀如果文件只能讀被打開,sqlite3_open_v2功能是否使用與SQLITE_OPEN_READONLY與否。所以除了前面提到的openFlags之外,您還需要單獨驗證文件是否可以以只讀方式打開。 C API在sqlite3_vfs結構中提供了函數xAccess。我猜測,這個工作是否你的應用程序已經在數據庫文件上有一個鎖。有關更多信息,請參閱http://www.sqlite.org/c3ref/vfs.html

+0

謝謝。我正在使用合併,所以很遺憾,我不能在客戶端代碼中包含'struct sqlite3'聲明來檢查'openFlags'。當然,我可以修改合併本身,但我希望有另一種方式。 – user38329 2012-04-16 21:39:41

+0

難道你不能抓住一個指針來保存標誌的字節嗎? – 2012-04-16 21:42:32

+0

你問我是否可以使用偏移量,而不是按名稱引用結構成員?我可以,但如果'struct sqlite3'由於更新到更新版本的sqlite而發生變化,則行爲可能變得不確定。 – user38329 2012-04-17 17:37:57

相關問題