SQLite C 接口
在历史快照上启动读取事务
int sqlite3_snapshot_open( sqlite3 *db, const char *zSchema, sqlite3_snapshot *pSnapshot );
sqlite3_snapshot_open(D,S,P) 接口要么启动一个新的读取事务,要么升级数据库连接D的模式 S 的现有 事务,以便读取事务引用历史快照P,而不是数据库的最新更改。sqlite3_snapshot_open()接口在成功时返回 SQLITE_OK 或在失败时返回适当的错误代码。
为了成功,调用sqlite3_snapshot_open(D,S,P)时数据库连接不能处于 自动提交模式。如果模式 S 上已经有一个读取事务打开,则数据库句柄必须没有活动语句(SELECT 语句已传递给 sqlite3_step() 但不是 sqlite3_reset() 或 sqlite3_finalize())。如果违反了这些条件中的任何一个,或者模式 S 不存在,或者快照对象无效,则返回 SQLITE_ERROR。
如果指定的快照已被检查点覆盖,则调用 sqlite3_snapshot_open() 将无法打开。在这种情况下,返回 SQLITE_ERROR_SNAPSHOT。
如果在调用此函数时已经有一个读取事务打开,那么如果返回 SQLITE_ERROR、SQLITE_BUSY 或 SQLITE_ERROR_SNAPSHOT,则相同的读取事务将保持打开状态(在同一数据库快照上)。如果返回另一个错误代码(例如 SQLITE_PROTOCOL 或 SQLITE_IOERR 错误代码),则读取事务的最终状态未定义。如果返回 SQLITE_OK,则读取事务现在在数据库快照 P 上打开。
如果数据库连接 D 不知道模式 S 的数据库文件处于WAL 模式,则对sqlite3_snapshot_open(D,S,P)的调用将失败。如果数据库连接上没有先前的 I/O,或者如果数据库 在数据库连接上最近的 I/O 之后进入WAL 模式,则数据库连接可能不知道数据库文件处于WAL 模式。(提示:针对新打开的数据库连接运行“ PRAGMA application_id ”,以使其准备好使用快照。)
sqlite3_snapshot_open()接口仅在使用 SQLITE_ENABLE_SNAPSHOT编译时选项时可用。