我需要知道我打開的SQLite數據庫是否是隻讀的。我必須使用稍微過時的SQLite版本,其中沒有sqlite3_db_readonly()。 sqlite3_db_readonly()的實現使用私人調用,所以它不能被複制到客戶端代碼中。除了在打開之前檢查文件是否可寫之外,還可以做些什麼?確定SQLite 3數據庫是否爲只讀 - 不使用sqlite3_db_readonly()
編輯:版本是3.7.0.1。
編輯2:我正在使用合併。
我需要知道我打開的SQLite數據庫是否是隻讀的。我必須使用稍微過時的SQLite版本,其中沒有sqlite3_db_readonly()。 sqlite3_db_readonly()的實現使用私人調用,所以它不能被複制到客戶端代碼中。除了在打開之前檢查文件是否可寫之外,還可以做些什麼?確定SQLite 3數據庫是否爲只讀 - 不使用sqlite3_db_readonly()
編輯:版本是3.7.0.1。
編輯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_RDWR
的openFlags
成員測試只讀。
#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。
你使用的是什麼版本的sqlite? – 2012-04-14 16:00:14
我正在使用3.7.0.1 – user38329 2012-04-14 16:09:23