Skip to main content
O Protocol 1 é a interface original do VEF. Ele é estável desde a v0.0.1 e continua com suporte, mas provavelmente será descontinuado em uma versão futura. Novas extensões devem usar a API do Protocol 3 — os construtores de tipos baseados em templates dos guias Criando Extensões em C++ e Desenvolvimento em C++. Esta página existe como referência ao trabalhar com extensões existentes compiladas com o Protocol 1.

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 template vsql::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.
Esta assinatura bruta por argumento — 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 de vef_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.