我需要知道我打开的SQLite数据库是否是只读的。我必须使用稍微过时的SQLite版本,其中还没有sqlite3_db_readonly()。 sqlite3_db_readonly()的实现使用私有调用,因此无法将其复制到客户端代码中。可以做什么,除了在打开之前检查文件是否可写?
编辑:版本是3.7.0.1。
编辑2:我正在使用合并。
答案 0 :(得分: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 */
然后,您可以openFlags
成员对O_RDWR
进行只读测试。
#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在xAccess
结构中提供函数sqlite3_vfs
。我猜这个工作是否你的应用程序已经锁定了db文件。有关详细信息,请参阅http://www.sqlite.org/c3ref/vfs.html。