함수 포인터 유형 API
프로토콜 1 사용자 정의 유형은vsql::make_type<> 템플릿 대신 명시적인 함수 포인터를 사용하여 등록됩니다. 함수 서명은 프로토콜 3의 상응하는 서명과 다릅니다 — Arg 및 Result 객체 대신 원시 포인터와 길이를 인자로 받습니다.
함수 서명
등록
이 형식은#include <villagesql/extension.h>(<villagesql/vsql.h>가 아님)와 using namespace villagesql;를 필요로 합니다.
vsql::make_type<kMyTypeName>()이 선호되는 형식입니다. 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 확장이라도 집계는 이 방식으로 등록해야 합니다. 모든 새로운 코드에 타입화된 집계 접근법을 사용하세요.

