int sqlite3_wal_checkpoint_v2( sqlite3 * db,/ *数据库句柄* / const char * zDb,/ *附加数据库的名称(或NULL)* / int eMode,/ * SQLITE_CHECKPOINT_ *值* / int * pnLog,/ * OUT:WAL登录帧的大小* / int * pnCkpt / * OUT:已检查点的帧总数* / );
sqlite3_wal_checkpoint_v2(D,X,M,L,C)接口在模式M下对数据库连接D的数据库X运行检查点操作。状态信息写回到L和C所指向的整数。M参数必须为有效检查点模式:
如果pnLog不为NULL,则* pnLog设置为日志文件中的总帧数;如果由于错误或数据库未处于WAL模式而无法运行检查点,则将* pnLog设置为-1 。如果pnCkpt不为NULL,则将* pnCkpt设置为日志文件中检查点帧的总数(包括调用该函数之前已被检查点的帧)或如果检查点由于错误或错误而无法运行,则设置为-1。因为数据库不在WAL模式下。请注意,成功完成SQLITE_CHECKPOINT_TRUNCATE后,日志文件将被截断为零字节,因此* pnLog和* pnCkpt都将设置为零。
所有调用都会在数据库文件上获得排他的“检查点”锁。如果任何其他进程同时在运行检查点操作,则无法获取锁定,并返回SQLITE_BUSY。即使配置了忙处理程序,在这种情况下也不会调用它。
SQLITE_CHECKPOINT_FULL,RESTART和TRUNCATE模式还获得了数据库文件上的独占“写入器”锁定。如果无法立即获得写入器锁,并且已配置了繁忙处理程序,则会调用该写入器锁,并重试写入器锁,直到繁忙处理程序返回0或成功获取该锁为止。如上所述,在等待数据库读取器时也会调用busy-handler。如果繁忙处理程序在获得写程序锁之前或在等待数据库读取器时返回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此接口。