Skip to main content
协议 1 是原始 VEF 接口。自 v0.0.1 版本起稳定,并仍受支持,但可能在未来版本中被弃用。新的扩展应使用协议 3 API——基于模板的类型构建器,请参阅 使用 C++ 创建扩展C++ 开发 指南。 本页面用于在处理基于协议 1 构建的现有扩展时提供参考。

函数指针类型 API

协议 1 中的自定义类型使用显式函数指针进行注册,而不是使用 vsql::make_type<> 模板。函数签名与协议 3 的等效签名不同——它们接受原始指针和长度,而不是 ArgResult 对象。

函数签名

注册

这种形式需要 #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 扩展也必须以这种方式注册聚合。对于所有新代码,请使用 类型化聚合方法