【Rust日报】2022-05-20 - 用 Rust 扩展 SQLite

本文介绍了如何使用 Rust 编写 SQLite 用户定义函数(UDF),通过创建一个可加载扩展,使得 SQLite 能够调用 Rust 函数。文章详细讲解了 Cargo 配置、入口函数、注册函数到 SQLite 以及在 SQLite 中使用新函数的步骤,并提供了相应的代码示例。
摘要由CSDN通过智能技术生成
用 Rust 扩展 SQLite

作为进程内数据库,SQLite 具有其他扩展机制,例如 用户定义函数(简称 UDF)。但是UDF有一些缺点:

  • UDF 在 SQLite 连接中是当前生效的,而不是为所有连接共享;

  • UDF 必须在程序中定义。这意味着您需要在与您的应用程序相同的作用域内使用该功能。

这就是 UDF 的用武之地。UDF 可以用任何可以编译为共享库或者 DLL 的编程语言编写。然后,您可以共享已编译的对象并从任何应用程序或编程语言中加载它们。在这篇文章中,我们将看到如何使用Rust编写 SQLite 可加载扩展。

借鉴

我们可以从 phiresky/sqlite-zstd 学到的 SQLite UDF 简化版本技术。这是一个在 SQLite 上启用 zstd 压缩的 SQLite 扩展,如果您想查看比这篇文章更高级的示例,我强烈建议您查看它。

Cargo.toml
  • 需要依赖:https://github.com/Genomicsplc/rusqlite/tree/loadable-extensions 原因是 #910

  • 合并版本为:https://github.com/litements/rusqlite/tree/loadable-extensions-release-2

  • crate-type 标记为:["cdylib"]。这将告诉 rust 编译器我们正在构建一个共享库。

[package]
name = "sqlite-regex"
version = "0.1.0"
edition = "2021"

[features]

default = []
build_extension = ["rusqlite/bundled", "rusqlite/functions"]

[lib]
crate-type = ["cdylib"]

[dependencies]
regex = "1.5.4"
log = "0.4.14"
env_logger = "0.9.0"
anyhow = "1.0.54"


[dependencies.rusqlite]
package = "rusqlite"
git = "https://github.com/litements/rusqlite/"
branch = "loadable-extensions-release-2"
default-features = false
features = ["loadable_extension", "vtab", "functions", "bundled"]
编写扩展和入口函数

函数 ah 作用是会将一个 anyhow 错误转换为 rusqlite 错误;函数 init_logging 则将设置 env_logger。

#![allow(clippy::missing_safety_doc)]

use crate::ffi::loadable_extension_init;
use an
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值