确定SQLite 3数据库是否为只读-不使用SQLite 3_db_readonly()

确定SQLite 3数据库是否为只读-不使用SQLite 3_db_readonly(),sqlite,Sqlite,我需要知道我打开的SQLite数据库是否是只读的。我必须使用一个稍微过时的SQLite版本,其中还没有sqlite3_db_readonly()。sqlite3_db_readonly()的实现使用私有调用,因此无法将其复制到客户端代码中。除了在打开之前检查文件是否可写之外,还可以做什么 编辑:版本为3.7.0.1 编辑2:我正在使用合并。您可能已经掌握了sqlite3“数据库连接句柄”对象。定义如下: 然后,您可以使用openFlags成员对O_RDWR进行只读测试 #define O_RDO

我需要知道我打开的SQLite数据库是否是只读的。我必须使用一个稍微过时的SQLite版本,其中还没有sqlite3_db_readonly()。sqlite3_db_readonly()的实现使用私有调用,因此无法将其复制到客户端代码中。除了在打开之前检查文件是否可写之外,还可以做什么

编辑:版本为3.7.0.1


编辑2:我正在使用合并。

您可能已经掌握了
sqlite3
“数据库连接句柄”对象。定义如下:

然后,您可以使用
openFlags
成员对
O_RDWR
进行只读测试

#define O_RDONLY        00000000
#define O_WRONLY        00000001
#define O_RDWR          00000002
当然,这与较新的
sqlite3\u db\u readonly()
不同,但在您的上下文中可能已经足够了

编辑

根据您的评论,您可以执行以下操作来“证明”您的代码:

  • 检查
    sqlite3
    结构是否在3.7.0.1和支持
    sqlite3\u db\u readonly()的第一个版本之间变化
  • 使用一些宏将
    sqlite3
    结构的右副本(或
    openFlags
    的右偏移量)映射到相应的3.x.y.z版本,因为在sqlite3.h中定义了
    SQLITE\u版本号
  • 从支持
    sqlite3\u db\u readonly()的版本开始,只需调用它即可

请注意,如果数据库的文件只能为读取而打开,则该数据库将以只读方式打开,无论sqlite3\u open\u v2函数是否与
SQLITE\u open\u READONLY一起使用。因此,除了前面提到的
openFlags
之外,您还需要单独验证文件是否可以以只读方式打开。C API在
sqlite3\u vfs
struct中提供函数
xAccess
。我猜想,无论您的应用程序是否已经锁定了db文件,这都是有效的。有关更多信息,请参阅。

您使用的是什么版本的sqlite?谢谢。我正在使用合并,因此不幸的是,我无法在客户端代码中包含
struct sqlite3
的声明,以检查
openFlags
。当然,我可以修改合并本身,但我希望有另一种方法。你是在问我是否可以使用偏移量,而不是按名称引用结构成员?我可以,但如果
struct sqlite3
由于更新到较新版本的sqlite而发生更改,则行为可能会变得未定义。我补充了我的答案,以处理其他版本。我正在尝试检测数据库是否以只读方式打开-出于任何原因。是的,两者都有。
#define O_RDONLY        00000000
#define O_WRONLY        00000001
#define O_RDWR          00000002