SQLITE_DBPAGE 虚拟表

、概述

SQLITE_DBPAGE 扩展实现了一个同名虚拟表,它通过与寻呼机交互提供对底层数据库文件的直接访问。SQLITE_DBPAGE 能够读取和写入数据库的任何页面。因为交互是通过寻呼层进行的,所以所有更改都是事务性的。

警告:写入 SQLITE_DBPAGE 虚拟表很容易导致不可恢复的数据库损坏。不允许不受信任的组件访问 SQLITE_DBPAGE 表。使用 SQLITE_DBPAGE 表时要适当小心。在试验 SQLITE_DBPAGE 表之前备份重要数据。当设置了SQLITE_DBCONFIG_DEFENSIVE标志 时,将禁用对 SQLITE_DBPAGE 虚拟表的写入。

SQLITE_DBPAGE 扩展包含在合并中,但默认情况下它是禁用的。使用SQLITE_ENABLE_DBPAGE_VTAB编译时选项启用 SQLITE_DBPAGE 扩展。SQLITE_DBPAGE 扩展使用未发布的内部接口并且不可在运行时加载。将 SQLITE_DBPAGE 添加到应用程序的唯一方法是使用 SQLITE_ENABLE_DBPAGE_VTAB编译时选项对其进行编译。

SQLITE_DBPAGE 扩展在命令行 shell的默认构建中启用。

2.用法

SQLITE_DBPAGE 虚拟表读/写表,逐页提供对底层磁盘文件的直接访问。虚拟表似乎具有这样的架构:

CREATE TABLE sqlite_dbpage(
  pgno INTEGER PRIMARY KEY,
  data BLOB
);

SQLite 数据库文件分为页面。第一页为 1,第二页为 2,依此类推。没有第 0 页。每个页面的大小都相同。每页的大小是 2 的幂,介于 512 和 65536 之间。有关详细信息,请参阅文件格式文档。

SQLITE_DBPAGE 表允许应用程序查看或替换数据库文件每一页的原始二进制内容。不会尝试解释页面的内容。内容在磁盘上出现时逐字节返回。

SQLITE_DBPAGE 表在数据库文件中的每一页都有一行。SQLITE_DBPAGE 允许读取或覆盖页面。但是数据库文件的大小不能改变。无法通过对该表运行 DELETE 或 INSERT 操作来更改 SQLITE_DBPAGE 表中的行数。

2.1. 在 ATTACH-ed 数据库上使用 SQLITE_DBPAGE

上面显示的 SQLITE_DBPAGE 表模式不完整。第三个隐藏列名为“schema”,用于确定 应该读取或写入哪个ATTACH-ed 数据库。因为“schema”列是隐藏的,所以当SQLITE_DBPAGE作为表值函数被调用时,它可以作为参数使用

例如,假设使用如下语句将一个附加数据库附加到数据库连接:

ATTACH 'auxdata1.db' AS aux1;

然后读取该数据库文件的第一页,只需运行:

SELECT data FROM sqlite_dbpage('aux1') WHERE pgno=1;

如果省略“schema”,则默认为主数据库(通常称为“main”,除非使用SQLITE_DBCONFIG_MAINDBNAME重命名)。因此,以下两个查询通常是等价的:

SELECT data FROM sqlite_dbpage('main') WHERE pgno=1;
SELECT data FROM sqlite_dbpage WHERE pgno=1;

SQLITE_DBPAGE 表可以像任何其他表一样参与连接。因此,要查看所有连接的数据库文件的第一页内容,可以运行如下语句:

SELECT dbpage.data, dblist.name
  FROM pragma_database_list AS dblist
  JOIN sqlite_dbpage(dblist.name) AS dbpage
 WHERE dbpage.pgno=1;