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

时间:2012-04-14 15:54:10

标签: sqlite

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

编辑:版本是3.7.0.1。

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

1 个答案:

答案 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