int sqlite3_wal_checkpoint_v2( sqlite3 *db, /* Database handle */ const char *zDb, /* Name of attached database (or NULL) */ int eMode, /* SQLITE_CHECKPOINT_* value */ int *pnLog, /* OUT: Size of WAL log in frames */ int *pnCkpt /* OUT: Total number of frames checkpointed */ );
sqlite3_wal_checkpoint_v2(D,X,M,L,C) 接口在模式 M 下对数据库连接 D 的数据库 X 执行检查点操作。状态信息写入 L 和 C 指向的整数。M 参数必须是有效的检查点模式。
如果 pnLog 不为 NULL,则 *pnLog 将设置为日志文件中的总帧数,或者设置为 -1(如果检查点由于错误或数据库不在 WAL 模式下而无法运行)。如果 pnCkpt 不为 NULL,则 *pnCkpt 将设置为日志文件中检查点的帧总数(包括在调用函数之前已检查点的任何帧),或者设置为 -1(如果检查点由于错误或数据库不在 WAL 模式下而无法运行)。请注意,在成功完成 SQLITE_CHECKPOINT_TRUNCATE 后,日志文件将被截断为零字节,因此 *pnLog 和 *pnCkpt 都将设置为零。
所有调用都会在数据库文件上获取独占“检查点”锁。如果任何其他进程正在同时运行检查点操作,则无法获取锁,并且会返回 SQLITE_BUSY。即使配置了忙碌处理程序,在这种情况下也不会调用它。
SQLITE_CHECKPOINT_FULL、RESTART 和 TRUNCATE 模式也会获取数据库文件的独占“写入器”锁。如果无法立即获取写入器锁,并且配置了忙碌处理程序,则会调用它,并且会重试写入器锁,直到忙碌处理程序返回 0 或成功获取锁。在等待数据库读取器时也会调用忙碌处理程序,如上所述。如果忙碌处理程序在获取写入器锁之前或在等待数据库读取器时返回 0,则检查点操作将从该点开始以与 SQLITE_CHECKPOINT_PASSIVE 相同的方式继续 - 检查点尽可能多的帧,而不阻塞任何进一步操作。在这种情况下,会返回 SQLITE_BUSY。
如果参数 zDb 为 NULL 或指向零长度字符串,则指定的操作将尝试对连接到数据库连接 db 的所有 WAL 数据库执行。在这种情况下,写入输出参数 *pnLog 和 *pnCkpt 的值是未定义的。如果在处理一个或多个附加的 WAL 数据库时遇到 SQLITE_BUSY 错误,则操作仍会尝试在任何剩余的附加数据库上执行,并在最后返回 SQLITE_BUSY。如果在处理附加数据库时发生任何其他错误,则处理将被放弃,并且错误代码将立即返回给调用者。如果没有遇到错误(SQLITE_BUSY 或其他错误)来处理附加的数据库,则会返回 SQLITE_OK。
如果数据库 zDb 是附加数据库的名称,并且该数据库不在 WAL 模式下,则会返回 SQLITE_OK,并且 *pnLog 和 *pnCkpt 都设置为 -1。如果 zDb 不为 NULL(或零长度字符串)并且不是任何附加数据库的名称,则会返回 SQLITE_ERROR 给调用者。
除非它返回 SQLITE_MISUSE,否则 sqlite3_wal_checkpoint_v2() 接口将设置由 sqlite3_errcode() 和 sqlite3_errmsg() 查询的错误信息。
可以使用 PRAGMA wal_checkpoint 命令从 SQL 调用此接口。
另请参阅对象、常量和函数列表。