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对象。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5560.树的直径

蛮不错的一道题目&#xff0c;你要利用树的性质分析出&#xff0c;你只需要维护上一次的树的直径的两个端点就好了 #include<iostream>using namespace std; using ll long long; using pii pair<int,int>; const int N 6e510; const int inf 0x3f3f3f3f; cons…

算法:树形dp(树状dp)

文章目录 一、树形DP的概念1.基本概念2.解题步骤3.树形DP数据结构 二、典型例题1.LeetCode&#xff1a;337. 打家劫舍 III1.1、定义状态转移方程1.2、参考代码 2.ACWing&#xff1a;285. 没有上司的舞会1.1、定义状态转移方程1.2、拓扑排序参考代码1.3、dfs后序遍历参考代码 一…

MySQL复制拓扑4

文章目录 主要内容一.启用GUID并配置循环复制1.其中&#xff0c;UUID用来唯一标识每一个服务器&#xff0c;事务的编号记录了在该服务器上执行的事务的顺序。使用SELECT server_uuid\G命令可以查看服务器的UUID&#xff0c;sever1的UUID值显示如下&#xff1a;代码如下&#xf…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】

随笔&#xff1a;这年头工作不好找咯&#xff0c;大家有学历提升的赶快了&#xff0c;还有外出人多注意身体&#xff0c;没错我在深圳这边阳了&#xff0c;真的绝啊&#xff0c;最尴尬的还给朋友传染了&#xff01;&#xff01;&#xff01; 之前三种的监听情况&#xff0c;监听…

文本识别 OCR 解决方案

Capture2Text 便携式 OCR 工具 Capture2Text 能够使用键盘快捷键快速对屏幕的一部分进行 OCR。 默认情况下&#xff0c;生成的文本将保存到剪贴板。支持中文、英文、法文、德文、日文、韩文、俄文、西班牙文等 90 多种语言。 Capture2Text 是便携式工具&#xff0c;不需要安装…

快速了解FastAPI与Uvicorn是什么?

概念 什么是Uvicorn Python Uvicorn 是一个快速的 ASGI&#xff08;Asynchronous Server Gateway Interface&#xff09;服务器&#xff0c;用于构建异步 Web 服务。它基于 asyncio 库&#xff0c;支持高性能的异步请求处理&#xff0c;适用于各种类型的 Web 应用程序。 Uvi…

SEO超级外链工具源码

源码简介 超级外链工具&#xff0c;是一款在线全自动化发外链的推广工具。使用本工具可免费为网站在线批量增加外链&#xff0c;大大提高外链发布工作效率&#xff0c;是广大草根站长们必备的站长工具。 搭建环境 PHP 5.6 安装教程 上传源码压缩包到网站目录并解压即可 首…

Linux安装最新版Docker完整教程

参考官网地址&#xff1a;Install Docker Engine on CentOS | Docker Docs 一、安装前准备工作 1.1 查看服务器系统版本以及内核版本 cat /etc/redhat-release1.2 查看服务器内核版本 uname -r这里我们使用的是CentOS 7.6 系统&#xff0c;内核版本为3.10 1.3 安装依赖包 …

【数据结构(二)】顺序表与ArrayList

❣博主主页: 33的博客❣ ▶文章专栏分类:数据结构◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构知识 目录 1.前言2.定义IList接口3.MyArraylist实现接口3.1定义成员变量与构造方法3.2添加元素3.3…

构建未来数字化世界的统一用户中心产品架构

随着数字化时代的到来&#xff0c;用户数据管理变得愈发复杂&#xff0c;各类应用和服务的涌现使得用户信息分散存储&#xff0c;导致了数据孤岛和体验碎片化的问题。在这样的背景下&#xff0c;统一用户中心产品架构应运而生&#xff0c;为构建数字化世界提供了全新的解决方案…

S7-200 SMART 应用第003期-数字量输入模块接线

概述 S7-200 SMART作为西门子的一款高性价比PLC产品,很多工控电气工程师在选型和电路图设计时,对模块接线并不是非常清楚,为了使大家更好的了解和掌握该部分,本文从CPU本体、数字量输入(DI)、数字量输出(DQ)向大家详细介绍S7-200 SMART 详细的接线和注意事项。 不同型号C…

2023年度总结:允许迷茫,破除迷茫;专注自身,把握当下

0、前言 &#x1f4dc;为什么24年已经过了几个月&#xff0c;才提笔写这年度总结呢&#xff1f;毫不羞愧直问我的内心&#xff0c;其实就是懒罢了。直到前几天朋友看到了我去年写的总结&#xff0c;我自己点进那篇总结&#xff0c;完完整整的看了一遍&#xff0c;又翻看我23年…

ideaSSM 网上选课管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 网上选课管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

二分法题集1

1 二分查找 分析&#xff1a; 这是一道很简单的二分法题&#xff0c;定义两个指针和中间值middle&#xff0c;判断middle对应数组值与目标值的大小关系&#xff0c;从而对left和right进行修改。由于太过基础&#xff0c;代码简单基础就不多赘述。 目录 1 二分查找 分析&…

PyQt PySide6零基础入门与项目实战视频教程

目录 课程亮点课程大纲第一章&#xff1a;基础篇 PySide6开发环境安装第二章 控件与布局篇 PySide6常用控件与界面布局使用介绍第三章 信号槽与事件机制第四章 QMainWindow应用篇第五章 样式表qss与自定义控件第六章 图表与曲线第七章 数据库编程第八章 项目实战&#xff1a;高…

FJSP:小龙虾优化算法(Crayfsh optimization algorithm,COA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题&#xff08;Flexible Job Shop Scheduling Problem&#xff0c;FJSP&#xff09;&#xff0c;是一种经典的组合优化问题。在FJSP问题中&#xff0c;有多个作业需要在多个机器上进行加工&#xff0c;每个作业由一系列工序组成&a…

二叉树的介绍

学习堆排序时先了解下二叉树&#xff0c;因为堆排序中使用了二叉树。 一、二叉树介绍 二叉树&#xff08;binary tree&#xff09;树的每个节点最多有2个孩子节点。注意&#xff0c;这里是最多有2个&#xff0c;也可能只有1个&#xff0c;或者没有孩子节点。 二叉树结构如图…

极客时间: 用 Word2Vec, LangChain, Gemma 模拟全本地检索增强生成(RAG)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

「 典型安全漏洞系列 」11.身份验证漏洞详解

身份验证是验证用户或客户端身份的过程。网站可能会暴露给任何连接到互联网的人。这使得健壮的身份验证机制成为有效的网络安全不可或缺的一部分。 1. 什么是身份验证 身份验证即认证&#xff0c;是验证给定用户或客户端身份的过程。身份验证漏洞使攻击者能够访问敏感数据和功…

RobotFramework测试框架(12)--第三方库

Library 关于射频指南 |机器人框架 (robotframework.org) 使用RF需要使用Library&#xff0c;常用的第三方库如下&#xff1a; 在web浏览器中进行web应用程序测试可以使用的库是 Selenium Library 在内部使用流行的 Selenium 工具的 Web 测试库Browser Library 由 Playwri…