小。速度很快。可靠。
选择任意三个选项。
SQLite OS接口或“VFS”

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(取决于编译时间选项)包括:

  1. unix-dotfile文件-使用点文件锁定,而不是POSIX提示锁。

  2. unix不包括-获得并持有上的独占锁数据库文件,阻止其他进程访问数据库。还保留墙-拱在堆中而不是在共享内存。

  3. unix-无-所有文件锁定操作都是no-op。

  4. 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包括:

  1. win32-longpath-类似于“win32”,除了路径名可以长度最多为65534字节,而路径名最大为“win32”中的1040字节。

  2. win32-无-所有文件锁定操作都是no-op。

  3. 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源树:

在核心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_vfssqlite3_文件对象指向实例sqlite3_io_方法对象。

此页面上次修改时间2024-02-22 15:53:45联合技术公司