2

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

编辑:版本是 3.7.0.1。

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

4

1 回答 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.h 中定义,使用一些宏将结构的正确副本sqlite3(或 的正确偏移量openFlags)映射到相应的 3.xyz 版本。SQLITE_VERSION_NUMBER
  • 从支持sqlite3_db_readonly()调用它的版本开始。

请注意,如果数据库的文件只能以读取方式打开,则无论是否使用 sqlite3_open_v2 函数,数据库都将以只读方式打开SQLITE_OPEN_READONLY。因此,除了上述之外,openFlags您还需要单独验证文件是否可以只读方式打开。C APIxAccesssqlite3_vfs结构中提供函数。我猜无论您的应用程序是否已经锁定了 db 文件,这项工作都有效。有关更多信息,请参见 http://www.sqlite.org/c3ref/vfs.html

于 2012-04-15T11:33:25.293 回答