Skip to main content
O SDK Rust está em alpha — espere mudanças incompatíveis de API entre versões. Extensões apenas de funções e tipos personalizados (encode, decode, compare, hash) são compatíveis. Agregações, prerun(), VarArgs, variáveis de sistema e de status, acesso ao keyring e a ABI de armazenamento de coluna são exclusivos do C++ hoje — use o SDK C++ se você precisar de qualquer um desses.
Esta página é uma referência da API do crate villagesql. Para o tutorial de introdução, consulte Criando Extensões em Rust. Para tipos personalizados, consulte Tipos Personalizados em Rust.

InValue

InValue é o enum que o servidor passa para cada argumento de função. Sua função recebe args: &[InValue] e deve verificar cada argumento antes de usar seu valor.
Sempre faça a correspondência de Null explicitamente. Chamar .unwrap() ou fazer a correspondência de padrão apenas das variantes de valor é um bug — o NULL do SQL é uma entrada normal, não um erro.

VdfReturn

VdfReturn é o que sua função retorna ao servidor. Construa-o com uma das funções associadas: Aviso vs. erro: Use warning para falhas de validação de entrada do usuário em que faz sentido continuar com o restante do conjunto de resultados. No modo estrito, o MySQL promove avisos a erros em INSERT e UPDATE. Use error para condições em que prosseguir é inseguro: dados armazenados corrompidos, violações de invariantes internas. Um erro fatal aborta a instrução inteira.

macro extension!

extension! gera os pontos de entrada VEF que o servidor chama ao carregar seu arquivo VEB. Ele deve aparecer exatamente uma vez no crate.
Ambas as seções são opcionais. Uma extensão apenas de funções omite types:; uma extensão apenas de tipos omite funcs:. Um bloco extension! vazio (sem funcs, sem types) é válido, mas produz uma extensão que não faz nada.

macro func!

func! declara uma função chamável via SQL. Quatro formas (sem parâmetros, apenas buffer_size, apenas deterministic, ambos):
O parâmetro buffer_size requer o crate villagesql 0.0.2 ou posterior. A versão atual do crates.io (0.0.1) não o expõe — até que o 0.0.2 seja lançado, use as formas sem buffer_size.
Constantes de tipo para uso em func!:

macro custom_type!

custom_type! registra um novo tipo de coluna. type_name, persisted_length, max_decode_buffer_length, encode, decode e compare são obrigatórios. hash e default são opcionais, mas recomendados.
O campo default não é um valor padrão de coluna — é uma sondagem de inicialização. O servidor chama encode(default) ao carregar a extensão para verificar se o callback funciona. Se encode retornar Err para o padrão, a extensão falha ao carregar.

macro custom!

villagesql::custom!("type_name") referencia um tipo personalizado pelo nome em uma declaração func!:
Use-o em qualquer lugar onde um villagesql::Type::* apareceria em uma lista de parâmetros ou posição de tipo de retorno. A string deve corresponder ao type_name declarado no custom_type! correspondente.

campos do manifest.json

Toda extensão precisa de um manifest.json ao lado de seu Cargo.toml:
Regras de validação de name: deve começar com uma letra, terminar com uma letra ou dígito, no máximo 64 caracteres. Um manifesto inválido faz com que INSTALL EXTENSION falhe.