我需要知道我打开的 SQLite 数据库是否是只读的。我必须使用稍微过时的 SQLite 版本,其中还没有 sqlite3_db_readonly()。sqlite3_db_readonly() 的实现使用私有调用,因此无法复制到客户端代码中。除了在打开之前检查文件是否可写之外,还能做什么?
编辑:版本是 3.7.0.1。
编辑 2:我正在使用合并。
我需要知道我打开的 SQLite 数据库是否是只读的。我必须使用稍微过时的 SQLite 版本,其中还没有 sqlite3_db_readonly()。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 */
然后,您可以openFlags
针对O_RDWR
.
#define O_RDONLY 00000000
#define O_WRONLY 00000001
#define O_RDWR 00000002
当然,这与 newer 不同sqlite3_db_readonly()
,但在您的上下文中可能就足够了。
编辑
跟进您的评论,您可以执行以下操作来“面向未来”您的代码:
sqlite3
在 3.7.0.1 和支持的第一个版本之间变化sqlite3_db_readonly()
sqlite3
(或 的正确偏移量openFlags
)映射到相应的 3.xyz 版本。SQLITE_VERSION_NUMBER
sqlite3_db_readonly()
调用它的版本开始。请注意,如果数据库的文件只能以读取方式打开,则无论是否使用 sqlite3_open_v2 函数,数据库都将以只读方式打开SQLITE_OPEN_READONLY
。因此,除了上述之外,openFlags
您还需要单独验证文件是否可以只读方式打开。C APIxAccess
在sqlite3_vfs
结构中提供函数。我猜无论您的应用程序是否已经锁定了 db 文件,这项工作都有效。有关更多信息,请参见 http://www.sqlite.org/c3ref/vfs.html。