Small. Fast. Reliable.
Choose any three.

SQLite C接口

检查数据库

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参数必须为有效检查点模式

SQLITE_CHECKPOINT_PASSIVE
在不等待任何数据库读取器或写入器完成的情况下,尽可能多地检查点框架,然后如果日志中的所有框架都被检查点,则同步数据库文件。在繁忙的处理程序回调 是从来没有在SQLITE_CHECKPOINT_PASSIVE模式调用。另一方面,如果同时存在读取器或写入器,则被动模式可能会使检查点未完成。

SQLITE_CHECKPOINT_FULL
此模式将阻塞(它调用 busy-handler回调),直到没有数据库写入器并且所有读取器都从最近的数据库快照读取数据为止。然后,它在日志文件中检查所有帧并同步数据库文件。此模式在挂起时会阻止新的数据库编写器,但允许新的数据库编写器不受阻碍地继续运行。

SQLITE_CHECKPOINT_RESTART
此模式的工作方式与SQLITE_CHECKPOINT_FULL相同,不同之处在于,在对日志文件进行检查点之后,它将阻塞(调用 busy-handler回调),直到所有读取器仅从数据库文件读取为止。这样可以确保下一个编写器从头开始重新启动日志文件。与SQLITE_CHECKPOINT_FULL一样,此模式在挂起时会阻止新的数据库编写器尝试,但不会阻止读取器。

SQLITE_CHECKPOINT_TRUNCATE
此模式的工作方式与SQLITE_CHECKPOINT_RESTART相同,不同之处在于,它也将在成功返回之前将日志文件截断为零字节。

如果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此接口。

另请参见 对象常量函数的列表