1介绍
本文描述了SQLite操作系统可移植层或“VFS”-SQLite实现堆栈底部的模块提供跨操作系统的可移植性。
2与SQLite其余部分相关的VFS
SQLite库的内部组织可以被视为右侧显示的模块堆栈。Tokenizer、Parser和Code Generator组件用于处理SQL语句并将其转换为可执行程序在虚拟机语言或字节码中。大致来说,这三个顶层实现sqlite3_prepare_v2()前三位生成的字节码层是一个准备好的报表.虚拟机模块负责运行SQL语句字节码。B树模块将数据库文件组织为多个键/值存储有序键和对数性能。寻呼机模块负责加载数据库的页面文件到内存中,用于实现和控制事务,以及用于创建和维护阻止数据库的日志文件崩溃或停电后的腐败。OS接口是一个精简抽象,它提供了一组通用的用于调整SQLite在不同操作系统上运行的例程。大致来说,下面四层实现sqlite3_step().
这篇文章是关于底层的。
操作系统接口(也称为“VFS”)是SQLite的组成部分可跨操作系统移植。任何其他模块在SQLite中需要与操作系统中调用VFS中的方法。然后VFS调用满足请求所需的特定于操作的代码。因此,将SQLite移植到新的操作系统只需编写一个新的操作系统接口层或“VFS”。
三。多个VFSE
标准SQLite源代码树包含用于unix的内置VFSE和窗口。替代VFSE可以是在启动时或运行时使用sqlite3_vfs_register()接口。
可以同时注册多个VFS。每个VFS都有一个唯一的名称。分开数据库连接在同一过程中可以使用同时使用不同的VFS。就这一点而言,如果数据库连接使用打开了多个数据库文件这个附件命令,则每个附加的数据库可能使用不同的VFS。
3.1.标准Unix VFSe
Unix构建带有多个内置VFS。默认VFSfor unix被称为“unix”,在大多数应用程序中使用。可能在unix中找到的其他VFSE(取决于编译时间选项)包括:
unix-dotfile文件-使用点文件锁定,而不是POSIX提示锁。
unix不包括-获得并持有上的独占锁数据库文件,阻止其他进程访问数据库。还保留墙-拱在堆中而不是在共享内存。
unix-无-所有文件锁定操作都是no-op。
unix命名的sem-使用命名信号量进行文件锁定。仅VXWorks。
各种unix VFS的不同之处在于它们处理文件锁定的方式-它们彼此共享大部分实现都位于同一SQLite源文件中:os_unix。c(c).注意,除了“unix”和“unix-excl”之外,各种unix VFS都使用不兼容的锁定实现。如果两个进程正在访问相同的SQLite数据库使用不同的unix VFSE,它们可能看不到彼此锁定,可能会相互干扰,导致数据库损坏。特别是“unix-none”VFS根本没有锁定,如果由两个或多个数据库连接同时使用。鼓励程序员仅使用“unix”或“unix-excl”,除非有令人信服的理由不这样做。
3.2.标准Windows VFS
Windows版本还附带多个内置VFS。默认值Windows VFS称为“win32”,在大多数应用程序中使用。windows构建中可能找到的其他VFS包括:
win32-longpath-类似于“win32”,除了路径名可以长度最多为65534字节,而路径名最大为“win32”中的1040字节。
win32-无-所有文件锁定操作都是no-op。
win32-longpath-none-“win32-longpath”组合和“win32 none”-支持长路径名,并且所有路径名都锁定操作是no-ops。
与unix一样,各种Windows VFS的大多数代码都是共享的。
3.3.指定要使用的VFS
始终有一个VFS是默认的VFS。在unix系统上,默认设置为“unix”VFS,在windows上为“win32”。如果没有采取其他操作,则将使用新的数据库连接默认VFS。
可以通过注册或重新注册VFS使用sqlite3_vfs_register()具有第二个参数的接口第页,共页。因此,如果(unix)进程希望始终使用“unix-nolock”VFS代替“unix”的是以下代码:
sqlite3_vfs_register(sqlite3~vfs_find(“unix-nolock”),1);
也可以将备用VFS指定为sqlite3_open_v2()功能。例如:
int rc=sqlite3_open_v2(“demo.db”,&db,SQLITE_open_READWRITE,“unix-nolock”);
最后,如果URI文件名已启用,然后选择可以使用URI上的“VFS=”参数指定VFS与一起使用sqlite3_open(),sqlite3_open16(),sqlite3_open_v2()、和当新数据库附件-ed到现有数据库连接。例如:
附件'文件:demo2.db?vfs=unix-none’AS演示2;
URI指定的VFS具有最高优先级。在那之后指定为第四个参数的VFSsqlite3_open_v2(). The如果未另行指定VFS,则使用默认VFS。
3.4.VFS垫片
从SQLite堆栈的上层来看,每个打开的数据库文件只使用一个VFS。但实际上,特定的VFS可能只是在另一个执行实际工作的VFS周围做一个薄薄的包装。我们称包装器VFS为“垫片”。
垫片的一个简单示例是“vfstrace”VFS。这是一个VFS(实施于test_vfstrace。c(c)源文件),写入与每个VFS方法调用关联的消息然后将控制权传递给另一个VFS来执行实际操作工作。
3.5.其他VFSE示例
以下是其他公开的VFS实现SQLite源树:
appendvfs。c(c)-这个VFS允许将SQLite数据库附加到一些其他文件。例如,可以使用它来附加SQLite数据库在可执行文件的末尾,以便在运行时可以轻松地找到附加的数据库。这个命令行shell将使用此如果使用--append选项及其.archive命令启动VFS将在给定--append标志的情况下使用它。
测试删除。c(c)- 这个文件实现了一个名为“demo”的非常简单的VFS,它使用POSIX功能,如打开(),读取(),写入(),fsync(),关闭(),等等。此VFS仅适用于unix系统。但事实并非如此用于替代默认使用的标准“unix”VFS在unix平台上。“演示”VFS故意保持非常简单因此它可以用作学习辅助工具或建筑模板其他VFS或用于将SQLite移植到新操作系统。
测试配额。c(c)- 此文件实现了一个名为“quota”的填充程序,该填充程序强制执行累积数据库文件集合的文件大小限制。辅助设备接口用于定义“配额组”。配额组是一组文件(数据库文件、日志和临时文件),其名称都匹配地球仪模式。所有文件大小的总和在每个配额组中跟踪,如果总和超过阈值为配额组定义了一个回调函数。那个回调可以增加阈值或导致操作如果失败,就会超过配额SQLITE_FULL公司错误。此垫片的一个用途是用于强制Firefox中应用程序数据库的资源限制。
测试多路复用。c(c)- 此文件实现了一个填充程序,该填充程序允许数据库文件超过底层文件系统的最大文件大小。此垫片显示SQLite上六层的接口,使其看起来像正在使用非常大的文件,而实际上每个文件都是如此大在底层系统上被拆分为许多较小的文件。例如,此填充程序已用于允许数据库增长FAT16文件系统上大于2 GB。
test_one文件。c(c)- 这个文件实现了一个名为“fs”的VFS演示,展示了SQLite如何可以在缺少文件系统的嵌入式设备上使用。内容是直接写入底层媒体。由此导出的VFS演示代码可以由具有有限数量的闪存,使SQLite充当闪存的文件系统在设备上。
测试日志。c(c)- 该文件实现了SQLite测试期间使用的填充程序,用于验证数据库和回滚日志以正确的顺序写入在适当的时间“同步”,以保证数据库可以随时从断电或硬重置中恢复。垫片检查数据库操作和回滚的几个不变量日志并在违反任何这些不变量时引发异常。这些不变量反过来确保数据库始终是可恢复的。使用此填充程序运行一组大型测试用例可以增加确保SQLite数据库不会被意外损坏电源故障或设备重置。
测试vfs。c(c)- 该文件实现了一个填充程序,可用于模拟文件系统故障。测试期间使用此填充程序来验证SQLite响应是否正常硬件故障或其他错误情况,如耗尽难以在实际系统上测试的文件系统空间。
在核心SQLite源代码中还有其他VFS实现库和可用扩展中的。上面的列表并不意味着详尽但仅仅代表了可以使用VFS接口实现。
4VFS实施
通过子类化三个对象来实现新的VFS:
安sqlite3_vfs语言对象定义VFS和核心的名称实现操作系统接口的方法,例如作为检查文件是否存在、删除文件、创建文件和打开,用于读取和/或写入,转换文件名它们的标准形式sqlite3_vfs对象还包含从操作系统获取随机性的方法,用于暂停进程(休眠)并查找当前日期和时间。
这个sqlite3_文件对象表示打开的文件。的xOpen方法sqlite3_vfs构造sqlite3_文件对象。这个sqlite3_文件保持跟踪文件打开时的状态。
这个sqlite3_io_方法对象包含用于交互的方法带有打开的文件。每个sqlite3_文件包含指向的指针一个sqlite3_io_方法对象,该对象适用于该文件代表。这个sqlite3_io_方法对象包含要执行的方法从文件中读取和写入,以截断文件,刷新对持久存储的任何更改,以查找文件,锁定和解锁文件,关闭文件并销毁这个sqlite3_文件对象。
为新的VFS编写代码涉及到为这个sqlite3_vfs对象,然后使用注册该VFS对象打电话给sqlite3_vfs_register().VFS实施也为提供子类sqlite3_文件和sqlite3_io_方法但是这些对象不是直接向SQLite注册的。相反sqlite3_文件对象的xOpen方法返回sqlite3_vfs和sqlite3_文件对象指向实例的sqlite3_io_方法对象。
此页面上次修改时间2024-02-22 15:53:45联合技术公司