C++ を使用する場合は、C++ で拡張機能を作成する を参照して、C++ SDK の手順を確認してください。
villagesql クレートを使用して Rust で記述できます。SDK はすべての FFI マーシャリングを処理します。通常の Rust 型で作業し、extension! マクロが、ロード時にサーバーから呼び出される C エントリポイントを生成します。
前提条件
始める前に、VillageSQL をソースからビルドしてください。拡張機能はサーバーのビルドツリーに対してリンクします。まず ソースからビルドする ガイドに従ってください。 次のものも必要です。- Rust の安定版ツールチェーン — rustup.rs にてインストール
- Git — SDK と拡張機能リポジトリをクローンするため
- cargo-vsql — 拡張機能をパッケージ化、インストール、およびテストするための Cargo サブコマンド
- VillageSQL のビルドディレクトリ —
cargo vsql installおよびcargo vsql testのためにVillageSQL_BUILD_DIRをサーバーのビルドパスに設定します - Rust の基礎知識 — Cargo、列挙型、およびパターンマッチングに慣れていること
cargo-vsql をインストールします。
新しいクレートを作成する
新しい Rust ライブラリクレートを作成します。Cargo.toml を編集して、クレートのタイプを設定し、villagesql 依存関係を追加します。
cdylib クレートタイプは、Cargo に共有ライブラリ(Linux では .so、macOS では .dylib)を生成するように指示し、サーバーがロードできるようにします。
最初の関数を記述する
src/lib.rs を完全な拡張機能に置き換えます。
func! マクロは、rot13_impl を SQL 名 vsql_rot13 に、STRING -> STRING シグネチャで関連付けます。
関数のシグネチャは fn(&[InValue]) -> VdfReturn です。InValue は、サーバーが渡す SQL 型の列挙型です。VdfReturn は、サーバーに返す値です。args.first() をチェックして、NULL の場合と、型が間違っている場合の両方を処理してから、値にアクセスします。
関数が同じ入力に対して常に同じ出力を返す場合は、関数を決定論的として宣言します。これにより、オプティマイザーは、同じ入力に対して結果をキャッシュできます。
manifest.json を追加する
クレートのルート(Cargo.toml と同じディレクトリ)に manifest.json を作成します。
name フィールドは、INSTALL EXTENSION に渡すものと一致する必要があります。
ビルドとインストール
cargo vsql package、cargo vsql install、および cargo vsql test は、拡張機能ディレクトリ(Cargo.toml と manifest.json がある場所)から実行し、ワークスペースのルートから実行しないでください。.veb ファイルにパッケージ化します。
dist/vsql_rot13.veb が生成されます。VEB をパッケージ化して、VillageSQL のビルドディレクトリに直接コピーするには、次のようにします。
--config KEY=VALUE を渡します(繰り返し指定可能)。
テスト
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++ の拡張機能に等しく適用されます。

