Skip to main content
Rust SDK 处于 alpha 阶段 — 各版本之间可能会有破坏性的 API 变更。 仅支持函数扩展和自定义类型(encode、decode、compare、hash)。聚合函数、 prerun()VarArgs、系统变量和状态变量、密钥环访问以及列存储 ABI 目前仅支持 C++ — 如果您需要其中任何一项,请使用 C++ SDK
如果您更喜欢 C++,请参阅 使用 C++ 创建扩展,了解 C++ SDK 的操作指南。
可以使用 villagesql crate 用 Rust 编写 VillageSQL 扩展。SDK 处理所有 FFI 编组 — 您可以使用普通的 Rust 类型,extension! 宏会在加载时生成服务器调用的 C 入口点。

先决条件

在开始之前,请先从源代码构建 VillageSQL — 扩展会链接到服务器的构建树。请先按照 从源代码构建 指南操作。 您还需要:
  • Rust 稳定工具链 — 在 rustup.rs 上安装
  • Git — 用于克隆 SDK 和您的扩展仓库
  • cargo-vsql — Cargo 的子命令,用于打包、安装和测试扩展
  • VillageSQL 构建目录 — 将 VillageSQL_BUILD_DIR 设置为服务器的构建路径,以便 cargo vsql installcargo vsql test 正常工作
  • 基本的 Rust 知识 — 熟悉 Cargo、枚举和模式匹配
从 SDK 仓库安装 cargo-vsql
验证它是否可用:

创建一个新的 crate

创建一个新的 Rust 库 crate:
编辑 Cargo.toml 以设置 crate 类型并添加 villagesql 依赖项:
cdylib crate 类型告诉 Cargo 生成一个共享库(Linux 上的 .so,macOS 上的 .dylib),服务器可以加载它。

编写您的第一个函数

src/lib.rs 替换为完整的扩展:
func! 宏将 rot13_impl 绑定到 SQL 名称 vsql_rot13,签名是 STRING -> STRING 函数签名是 fn(&[InValue]) -> VdfReturnInValue 是服务器传递的 SQL 类型枚举。VdfReturn 是您返回的内容。在访问值之前,检查 args.first() 以处理 NULL 情况和类型错误的情况。 如果您的函数对于相同的输入始终返回相同的输出,请声明为确定性函数 — 优化器可以缓存相同输入的结果:

添加 manifest.json

在 crate 根目录(Cargo.toml 旁边)创建 manifest.json
服务器会在安装时读取此文件。name 字段必须与您传递给 INSTALL EXTENSION 的内容匹配。

构建和安装

从扩展目录(Cargo.tomlmanifest.json 所在的位置)运行 cargo vsql packagecargo vsql installcargo vsql test,而不是从工作区根目录运行。
将扩展打包到 .veb 文件中:
这将生成 dist/vsql_rot13.veb。要将 VEB 打包并直接复制到您的 VillageSQL 构建目录:
要在开发期间使用本地副本覆盖依赖项,请传递 --config KEY=VALUE(可重复):
您应该看到 VEB 复制到扩展目录。验证其是否已正确放置:

测试

mysql-test/t/rot13_basic.test 中编写一个测试文件:
生成预期的结果:
运行测试套件:
在修改函数的行为后,重新运行 cargo vsql test --record 以更新预期的结果,然后运行 cargo vsql test 以确认。

在 SQL 中安装

VEB 位于扩展目录中后,安装它:
验证:
调用它:

后续步骤

Rust 中的自定义类型

定义具有二进制存储、排序和哈希的新列类型。

Rust API 参考

InValue、VdfReturn、extension!、func! 和 custom_type! — 所有字段。

C++ SDK(创建扩展)

C++ 方案 — 类型化包装器、构建器 API 和 CMake 设置。

扩展架构

VEB 文件如何加载、生命周期钩子和符号隔离。

测试依赖网络的扩展

针对会启动 HTTP 服务器或外部监听器的扩展的 MTR 端口模式 — 同样适用于 Rust 和 C++ 扩展。