函数指针类型 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>() 上,该构建器使用基于 State& 的类型化签名,而不是原始的 vef_context_t*/vef_vdf_args_t* 指针。即使是协议 1 扩展也必须以这种方式注册聚合。对于所有新代码,请使用 类型化聚合方法。

