API de Tipos Baseada em Pointers de Função
Os tipos personalizados do Protocol 1 são registrados usando pointers de função explícitos em vez do templatevsql::make_type<>. As assinaturas das funções diferem das equivalentes do Protocol 3 — elas recebem pointers brutos e comprimentos em vez de objetos Arg e Result.
Assinaturas de Funções
Registro
Esta forma exige#include <villagesql/extension.h> (não <villagesql/vsql.h>) e using namespace villagesql;.
vsql::make_type<kMyTypeName>() (com um NTTP de string em tempo de compilação) é a forma preferida. make_type(MYTYPE) (sem parâmetro de template) é a forma do Protocol 1 — ela continua com suporte, mas provavelmente será descontinuada em uma versão futura.
Estilo de ABI Bruta (Funções)
As implementações de VDF do Protocol 1 podem passar as structs C brutas diretamente em vez de usar wrappers tipados. Este estilo continua com suporte, mas provavelmente será descontinuado em uma versão futura — use a API tipada de argumento/resultado para todo código novo.void(vef_context_t*, vef_invalue_t* arg0, ..., vef_vdf_result_t*) — é detectada apenas pelo make_func<>() de <villagesql/extension.h>. O make_func<>() de <villagesql/vsql.h> rejeita em tempo de compilação qualquer assinatura bruta vef_context_t*/vef_invalue_t*/vef_vdf_result_t*.
Constantes de Resultado
A ABI bruta comunica o estado do resultado por meio devef_return_value_type_t definido em result->type:
No Protocol 3,
out.set(), out.set_null(), out.warning() e out.error() tratam disso automaticamente.
Registro de Agregados no Protocol 1
Não existe caminho de registro de agregados com ABI bruta.make_func<>() não possui os membros .clear<>() ou .accumulate<>() — esses métodos existem apenas no construtor separado make_aggregate_func<State, &result_fn>() de <villagesql/vsql.h>, que usa assinaturas tipadas baseadas em State& em vez de pointers brutos vef_context_t*/vef_vdf_args_t*. Mesmo uma extensão do Protocol 1 deve registrar agregados dessa forma. Use a abordagem tipada de agregados para todo código novo.

