SQLite 4.9的 OS 接口或“VFS”(十三)

返回:SQLite—系列文章目录   

上一篇:SQLite字节码引擎(十二)

下一篇:SQLite 4.9的虚拟表机制(十四)

1. 引言

本文介绍了 SQLite OS 可移植性层或“VFS” - 模块位于 SQLite 实现堆栈底部 提供跨操作系统的可移植性。

VFS是Virtual File System(虚拟文件系统)的缩写,是一个计算机文件系统的概念。它允许用户在操作系统中通过不同的协议和存储形式访问文件,而不必考虑底层文件系统的物理实现。这些协议可以是本地文件系统、网络文件系统、FTP、WebDAV、数据库等等。它的作用是为不同的文件系统提供一个统一的接口,使得开发人员能够更轻松地处理和使用文件系统。许多操作系统和软件都使用VFS来管理文件系统,例如Linux操作系统、Windows操作系统等。

2. VFS 与 SQLite 其余部分的关系

SQLite库的内部组织可以看作是 右侧显示的模块堆栈。 Tokenizer、Parser 和 Code Generator 组件用于 处理 SQL 语句并将其转换为可执行程序 使用虚拟机语言或字节码。 粗略地说,这前三层实现了 sqlite3_prepare_v2()。前三名生成的字节码 layers 是一个准备好的语句。 虚拟机模块负责运行 SQL 语句 字节码。B-Tree 模块将数据库文件组织成多个 具有有序键和对数性能的键/值存储。 Pager 模块负责加载数据库的页面 文件存入内存,用于实现和控制事务,以及 用于创建和维护阻止数据库的日志文件 崩溃或电源故障后的损坏。 操作系统接口是一个精简抽象,它提供了一组通用的 用于调整 SQLite 以在不同操作系统上运行的例程。 粗略地说,最底层的四层实现了sqlite3_step()。

这篇文章是关于底层的。

操作系统接口 - 也称为“VFS” - 是SQLite的组成部分 跨操作系统可移植。每当任何其他模块 在SQLite中需要与操作进行通信 系统,它们调用 VFS 中的方法。然后,VFS 调用 满足请求所需的特定于操作的代码。 因此,将 SQLite 移植到新的 操作系统只是编写一个新的操作系统接口层的问题 或“VFS”。

3. 多个 VFS

标准 SQLite 源代码树包含用于 unix 的内置 VFS 和窗户。替代 VFS 可以是 使用 sqlite3_vfs_register() 接口在 start-time 或 run-time 添加。

可以同时注册多个 VFS。 每个 VFS 都有唯一的名称。 同一进程中的单独数据库连接可以使用 同时使用不同的 VFS。就此而言,如果单个 数据库连接打开了多个数据库文件,使用 ATTACH 命令,则每个附加的数据库可能都使用 不同的 VFS。

3.1. 标准 Unix VFS

Unix 构建带有多个内置 VFS。默认 VFS 因为 UNIX 被称为“UNIX”,用于大多数应用程序。 在 unix 中可能找到的其他 VFS(取决于编译时 选项)包括:

  1. unix-dotfile - 使用点文件锁定而不是 POSIX 咨询锁。

  2. unix-excl - 获取并持有独占锁 数据库文件,阻止其他进程访问 数据库。还将 wal-index 保持在堆中而不是 共享内存。

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

  4. unix-namedsem - 使用命名信号量进行文件锁定。 仅限 VXWorks。

各种 unix VFS 的区别仅在于它们处理文件锁定的方式 - 它们彼此共享大部分共同的实现,并且 都位于同一个 SQLite 源文件中:os_unix.c。 请注意,除了 “unix” 和 “unix-excl” 之外,各种 unix VFS 都 使用不兼容的锁定实现。如果两个进程正在访问 使用不同 unix VFS 的同一 SQLite 数据库,它们可能 看不到彼此的锁,最终可能会相互干扰, 导致数据库损坏。特别是“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-None - 所有文件锁定操作都是无操作的。

  3. win32-longpath-none - “win32-longpath”的组合 和“win32-none” - 支持长路径名,并且全部锁定 操作是无操作的。

与 unix 一样,各种 Windows VFS 的大部分代码都是共享的。

3.3. 指定要使用的 VFS

始终有一个 VFS 是默认的 VFS。在 unix 系统上, “unix”VFS 作为默认值出现,在 Windows 上它是“win32”。 如果未执行其他操作,则将使用新的数据库连接 默认 VFS。

可以通过注册或重新注册 VFS 使用带有第二个参数的 sqlite3_vfs_register() 接口 的 1.因此,如果 (unix) 进程想要始终使用“unix-nolock”VFS 代替“UNIX”,以下代码将起作用:

sqlite3_vfs_register(sqlite3_vfs_find("unix-nolock"), 1);

也可以将备用 VFS 指定为 sqlite3_open_v2() 函数的第 4 个参数。例如:

int rc = sqlite3_open_v2("demo.db", &db, SQLITE_OPEN_READWRITE, "unix-nolock");

最后,如果启用了 URI 文件名,则替代方法 可以使用 URI 上的“vfs=”参数指定 VFS。这种技术 适用于 sqlite3_open()、sqlite3_open16()、sqlite3_open_v2() 和 当新数据库通过 ATTACH 连接到现有数据库连接时。 例如:

ATTACH 'file:demo2.db?vfs=unix-none' AS demo2;

URI 指定的 VFS 具有最高优先级。在那之后 指定为 sqlite3_open_v2() 的第四个参数的 VFS。这 如果未指定 VFS,则使用默认 VFS。

3.4. VFS垫片

从 SQLite 堆栈的上层来看,每个 打开数据库文件仅使用一个 VFS。 但在实践中,特定的 VFS 可能会 只是成为另一个做真正工作的 VFS 的薄包装器。 我们将包装器 VFS 称为“填充码”。

填充码的一个简单示例是“vfstrace”VFS。这是一个 VFS (在 test_vfstrace.c 源文件中实现),用于写入与每个 VFS 方法调用关联的消息 到日志文件中,然后将控制权传递给另一个 VFS 以执行实际操作 工作。

3.5. 其他示例 VFS

以下是公开提供的其他 VFS 实现 SQLite源代码树:

  • appendvfs.c - 此 VFS 允许将 SQLite 数据库附加到某些 其他文件。例如,这可用于追加 SQLite 数据库 到可执行文件的末尾,这样,当运行时,它可以很容易地 找到追加的数据库。命令行 shell 将使用此 VFS(如果使用 --append 选项启动)及其 .archive 命令 将在给定 --append 标志的情况下使用它。

  • test_demovfs.c - 此文件实现了一个名为“demo”的非常简单的 VFS,它使用 POSIX 功能,例如 open(), read(), write(), fsync(), close(), fsync(), fsync(), sleep(), time(), 等等。此 VFS 仅适用于 unix 系统。但事实并非如此 旨在替代默认使用的标准“unix”VFS 在 UNIX 平台上。“演示”VFS刻意保持非常简单 这样它就可以用作学习辅助工具或构建模板 其他 VFS 或用于将 SQLite 移植到新的操作系统。

  • test_quota.c - 此文件实现一个名为“quota”的填充码,该填充码强制执行累积 数据库文件集合的文件大小限制。辅助 接口用于定义“配额组”。配额组是一个 文件集(数据库文件、日志和临时文件),其 名称都与 GLOB 模式匹配。所有文件大小的总和 在每个配额组中跟踪,以及该总和是否超过阈值 为配额组定义后,将调用回调函数。那 回调可以增加阈值,也可以导致操作 这将超过配额,并因SQLITE_FULL错误而失败。此填充码的用途之一用于强制执行 Firefox 中应用程序数据库的资源限制。

  • test_multiplex.c - 此文件实现一个填充码,该填充码允许数据库文件超过 底层文件系统的最大文件大小。这个垫片呈现 SQLite 上六层的接口,使其看起来像 正在使用非常大的文件,而实际上每个这样的大文件 在底层系统上拆分为许多较小的文件。 例如,此填充码已用于允许数据库增长 FAT16 文件系统上大于 2 GB。

  • test_onefile.c - 此文件实现了一个名为“fs”的演示 VFS,它显示了 SQLite 如何 可以在缺少文件系统的嵌入式设备上使用。内容是 直接写入基础媒体。派生自 VFS 演示代码可以由数量有限的小工具使用 闪存,使 SQLite 充当闪存的文件系统 在设备上。

  • test_journal.c - 此文件实现了 SQLite 测试期间使用的填充码,用于验证 数据库和回滚日志按正确的顺序写入,并且 在适当的时间“同步”,以保证数据库 可以随时从断电中恢复硬复位。垫片 检查数据库操作和回滚的几个不变量 日志,并在违反任何这些不变量时引发异常。 反过来,这些不变量确保数据库始终是可恢复的。 使用此填充码运行大量测试用例可提供额外的 保证SQLite数据库不会因意外而损坏 电源故障或设备重置。

  • test_vfs.c - 此文件实现了可用于模拟文件系统故障的填充码。 此填充码在测试期间用于验证 SQLite 的响应是否合理 硬件故障或其他错误情况,例如用完 的文件系统空间,难以在实际系统上进行测试。

在核心 SQLite 源代码中还有其他 VFS 实现 库和可用的扩展。上面的列表并不意味着 详尽无遗,但仅代表可以 使用VFS接口实现。

4. VFS实现

新的 VFS 是通过子类化三个对象来实现的:

  • sqlite3_vfs
  • sqlite3_io_methods
  • sqlite3_file

sqlite3_vfs对象定义 VFS 和内核的名称 实现操作系统接口的方法,例如 如检查文件是否存在、删除文件、创建文件 以及打开和用于读取和/或写入、转换文件名 变成他们的规范形式。sqlite3_vfs对象还包含 从操作系统获取随机性的方法,用于 暂停进程(休眠)并查找当前日期和 时间。

sqlite3_file 对象表示打开的文件。 sqlite3_vfs 的 xOpen 方法在打开文件时构造一个 sqlite3_file 对象。sqlite3_file跟踪 打开文件时的状态。

sqlite3_io_methods对象保存用于交互的方法 使用打开的文件。每个sqlite3_file都包含一个指向 适合于文件的 sqlite3_io_methods 对象 代表。sqlite3_io_methods对象包含要执行的方法 诸如从文件中读取和写入,以截断文件之类的操作, 要刷新对持久性存储的任何更改,请查找 file,以锁定和解锁文件,以及关闭文件并销毁 sqlite3_file对象。

为新 VFS 编写代码涉及构造 sqlite3_vfs对象,然后使用 对 sqlite3_vfs_register() 的调用。VFS 实现还 为 sqlite3_file 和 sqlite3_io_methods 提供子类,但 这些对象不会直接注册到 SQLite。相反,sqlite3_file 对象是从 sqlite3_vfs 的 xOpen 方法返回的,并且 sqlite3_file 对象指向实例 sqlite3_io_methods对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/798956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TiDB 慢查询日志分析

导读 TiDB 中的慢查询日志是一项 关键的性能监控工具,其主要作用在于协助数据库管理员追踪执行时间较长的 SQL 查询语句。 通过记录那些超过设定阈值的查询,慢查询日志为性能优化提供了关键的线索,有助于发现潜在的性能瓶颈,优化…

libVLC 音频立体声模式切换

在libVLC中,可以使用libvlc_audio_set_channel函数来设置音频的立体声模式。这个函数允许选择不同的音频通道,例如立体声、左声道、右声道、环绕声等。 /*** Set current audio channel.** \param p_mi media player* \param channel the audio channel…

Java | Leetcode Java题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int n nums.length;int best 10000000;// 枚举 afor (int i 0; i < n; i) {// 保证和上一次枚举的元素不相等if (i > 0 && nums…

【精品整理】最新数据安全评估标准合集

最新数据安全评估标准合集&#xff0c;以下是资料的目录&#xff0c;共12份。如需下载&#xff0c;请前往星球查阅和获取&#xff1a;https://t.zsxq.com/18JrHhWtQ 1、网络安全标准实践指南 2、数据安全风险评估方法 3、个人信息安全影响评估指南 4、数据出境安全评估指南 5、…

HAL STM32 定时器PWM DMA输出方式

HAL STM32 定时器PWM DMA输出方式 &#x1f9e8;遗留问题&#xff1a;当配置RCR重复计数器&#xff0c;配置为2时&#xff0c;在定义了3组PWM参数情况下&#xff0c;只能输出第二组参数的PWM波形。&#xff08;HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, aCCValue_Buff…

模块化——如何导入模块?(内置模块与自定义模块)

在Node.js中&#xff0c;要导入另一个模块&#xff0c;我们可以使用require函数。这个函数接受一个文件路径参数&#xff0c;并返回导入的模块。 一、require使用注意事项&#xff1a; (1)自己创建的模块&#xff0c;导入时建议写相对路径&#xff0c;不能省略./和../ //我把…

golang web 开发 —— gin 框架 (gorm 链接 mysql)

目录 1. 介绍 2. 环境 3. gin 3.1 gin提供的常见路由 3.2 gin的分组 main.go router.go 代码结构 3.3 gin 提供的Json方法 main.go route.go common.go user.go order.go 3.4 gin框架下如何获取传递来的参数 第一种是GET请求后面直接 /拼上传递的参数 第二种是…

【Lavavel框架】——各目录作用的介绍

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

css anminate 加载中三个点点动态出现

期待效果&#xff1a; 核心代码&#xff1a; css3 anminate方法 //html <div>加载中<span id"dot">...</span></div>//css <style>   #dot {display: inline-block;width: 1.5em;vertical-align: bottom;overflow: hidden;animati…

xilinx 7系列fpga上电配置

一、前言 Xilinx FPGA通过加载比特流到内部存储单元来进行配置。 Xilinx FPGA存在两种数据配置路径&#xff0c;一种是满足最小引脚需求的串行路径&#xff0c;一种是可用8位、16位或32位来连接到行业的高性能通用接口&#xff0c;如处理器&#xff0c;8位或者16位并行的闪存…

在linux服务器上安装anaconda

遇到问题&#xff1a; 在linux服务器中查看当前有哪些虚拟环境&#xff0c;conda环境用不了&#xff0c;anaconda没有安装&#xff0c;所以要在linux服务器中安装虚拟环境 解决步骤如下&#xff1a; 1.首先下载anaconda的Linux版本的安装包 方法1&#xff1a;官网下载&#…

【蓝桥杯嵌入式】Cubemx新建工程引脚配置与点亮LED

【蓝桥杯嵌入式】Cubemx新建工程引脚配置与点亮LED cubemx基础配置LED 引脚配置按键配置按键引脚配置定时器扫描配置 工程管理配置点亮LED程序设计keil配置与程序下载 参考博文1&#xff1a;STM32 | 利用STM32CubeMX初始化一个STM32工程 参考博文1&#xff1a;点亮LED灯&#x…

【C#】版本号

&#x1f4bb; 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp16 {internal class Program{static void Main(string[] args){Version version01 new Version("4.0.0…

Web后端搭建

目录 一 搭建服务器端 1.1安装服务器软件 1.2检查环境是否配置 1.3安装Tomcat 二 创建并发Web项目 2.1创建一个java项目 三 创建Servlet 前端程序如何才能访问到后端程序呢&#xff0c;这时候我们就需要web服务器来解决&#xff1a;将后端程序部署到服务器中&#xff0c…

计算机网络实验——学习记录四(TCP协议)

1. 打开TCP服务&#xff1a; nc -e /bin/sh -lv 4499 注释&#xff1a; &#xff08;1&#xff09;nc是Linux下启动通讯服务的命令&#xff1b; &#xff08;2&#xff09;-e表示在nc命令后再执行bin文件夹下的shell命令&#xff0c;启动shell命令会导致所有从TCP连接传递到…

【JavaScript】原型链/作用域/this指针/闭包

1.原型链 参考资料&#xff1a;Annotated ES5 ECMAScript起初并不支持如C、Smalltalk 或 Java 中“类”的形式创建对象&#xff0c;而是通过字面量表示法或者构造函数创建对象。每个构造函数都是一个具有名为“prototype”的属性的函数&#xff0c;该属性用于实现基于原型的继…

【Java+Springboot】------ 通过JDBC+GetMapping方法进行数据select查询、多种方式传参、最简单的基本示例!

一、JDBC如何使用、PostGresql数据库 1、在pom.xml 先引用jdbc组件。 <!--jdbc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency> 2、在pom.xml 再引用p…

嵌入式Linux驱动开发——汇编点灯

嵌入式Linux驱动开发——汇编点灯 本文章开始记录学习嵌入式Linux的过程&#xff0c;使用的开发板是正点原子的阿尔法&#xff0c;以及左老师的书籍和视频。然后这个系列不会介绍基础知识&#xff08;书上都有&#xff09;&#xff0c;主要是记录思考过程以及需要注意的点。 代…

Ceph学习 -3.存储简介

文章目录 1.存储简介1.1 存储类型1.1.1 储备知识1.1.2 三种存储1.1.3 块存储1.1.4 文件存储1.1.5 对象存储1.1.6 三种存储之间的关系1.1.7 总结 1.2 Ceph简介1.2.1 官方介绍1.2.2 软件特点1.2.3 基本结构1.2.4 应用场景 1.3 小结 1.存储简介 学习目标&#xff1a;这一节&#x…

抖音引流私域转化模式1.0现场视频,从抖音源源不断把人加到私域买单

抖音-引流私域转化模式1.0现场视频&#xff0c;从抖音源源不断把人加到私域&#xff0c;让加到私域的粉丝买单 课程内容&#xff1a;抖音引流私域转化模式1.0现场视频&#xff0c;从抖音源源不断把人加到私域买单 - 百创网-源码交易平台_网站源码_商城源码_小程序源码 01.第一…