関数ポインタ型 API
プロトコル 1 のカスタム型は、vsql::make_type<> テンプレートの代わりに、明示的な関数ポインタを使用して登録されます。関数シグネチャは、プロトコル 3 の同等物とは異なり、Arg および Result オブジェクトではなく、生のポインタと長さを引数として受け取ります。
関数シグネチャ
登録
この形式では、#include <villagesql/extension.h>(<villagesql/vsql.h> ではありません)と using namespace villagesql; が必要です。
vsql::make_type<kMyTypeName>() (コンパイル時の文字列 NTTP を使用) が推奨される形式です。make_type(MYTYPE) (テンプレートパラメータなし) はプロトコル 1 の形式であり、引き続きサポートされていますが、将来のリリースで非推奨になる可能性があります。
生の ABI スタイル (関数)
プロトコル 1 の VDF 実装では、型付きラッパーを使用する代わりに、生の C 構造体を直接渡すことができます。このスタイルは引き続きサポートされていますが、将来のリリースで非推奨になる可能性があります。すべての新しいコードでは、型付き引数/結果 API を使用してください。void(vef_context_t*, vef_invalue_t* arg0, ..., vef_vdf_result_t*) — は、<villagesql/extension.h> の make_func<>() によってのみ検出されます。<villagesql/vsql.h> の make_func<>() は、生の vef_context_t*/vef_invalue_t*/vef_vdf_result_t* シグネチャをコンパイル時にすべて拒否します。
結果定数
生の ABI は、result->type に設定された vef_return_value_type_t を介して結果の状態を伝達します。
プロトコル 3 では、
out.set()、out.set_null()、out.warning()、out.error() がこれを自動的に処理します。
プロトコル 1 における集計関数の登録
生の ABI による集計関数の登録パスはありません。make_func<>() には .clear<>() や .accumulate<>() のメンバーはありません。これらのメソッドは、<villagesql/vsql.h> にある別のビルダー make_aggregate_func<State, &result_fn>() にのみ存在し、生の vef_context_t*/vef_vdf_args_t* ポインタではなく、State& ベースの型付きシグネチャを使用します。プロトコル 1 の拡張機能であっても、この方法で集計関数を登録する必要があります。すべての新しいコードでは、型付き集計関数のアプローチ を使用してください。

