Skip to main content
A extensão vsql_complex é a implementação de referência do VillageSQL para tipos personalizados usando o SDK C++, demonstrando padrões de extensão prontos para produção. Fonte: villagesql/examples/vsql-complex/ no repositório do VillageSQL

O que o vsql_complex Oferece

Tipo COMPLEX para números complexos (a + bi) com aritmética, utilitários e agregação. Exemplo de Uso:

Estrutura de Diretórios


Padrão de Registro do VEF

Arquivo: src/complex.cc O vsql_complex usa o SDK C++ com VEF_GENERATE_ENTRY_POINTS():
Padrões-chave:
  • Uma única chamada de macro registra tudo, não sendo necessário nenhum SQL manual
  • Objetos de tipo são variáveis constexpr construídas com vsql::make_type<kName>(), onde kName é um static constexpr const char[] usado como parâmetro de template que não é tipo (non-type template parameter)
  • As operações de tipo (.from_string<>(), .to_string<>(), .compare<>(), .hash<>()) são incorporadas ao objeto de tipo, não sendo necessária nenhuma chamada .func() separada para elas
  • .compare() habilita ORDER BY e indexação; .hash() é opcional
  • .intrinsic_default_str("(0,0)") define o valor padrão escrito quando INSERT IGNORE ou UPDATE IGNORE atribui NULL a uma coluna NOT NULL desse tipo
  • O registro de funções usa make_func<&impl>("name") com .build()
  • O registro de agregações usa make_aggregate_func<State, &result_fn>("name") com .clear<&fn>() e .accumulate<&fn>(); a função de resultado tem a assinatura void(const State&, ResultType)

Formato de Armazenamento Binário

COMPLEX armazena 16 bytes (little-endian):
  • Bytes 0-7: Parte real (double)
  • Bytes 8-15: Parte imaginária (double)
Codificação/Decodificação (complex.cc):
Usa funções de ordem de bytes independentes de plataforma para compatibilidade multiplataforma.

Tipos de Argumento e de Resultado

As implementações trabalham com tipos de argumento e de resultado tipados em vez de structs brutos do protocol: Exemplo de Aritmética (de complex.cc):
Funções utilitárias (de complex.cc):

Estratégia de Testes

Arquivo de Teste (test/t/complex_create.test):
Gerar Resultados:
Executar Testes:

Padrões-Chave de Implementação


Manifesto

Arquivo: manifest.json

Exportando e Importando Dados com Tipos Personalizados

O VillageSQL oferece suporte a SELECT INTO OUTFILE e LOAD DATA INFILE para tipos personalizados, permitindo que você exporte e importe dados preservando os valores de tipos personalizados.

SELECT INTO OUTFILE

Tipos personalizados são serializados para sua representação em string ao serem exportados:
Conteúdo do arquivo (/tmp/signals_export.txt):

LOAD DATA INFILE

Carregue os dados exportados de volta para uma tabela:

Exportação com Delimitadores Personalizados

Você pode usar terminadores de campo e de linha personalizados:
Saída:

Exportação com Funções VDF

Exporte valores computados usando funções da extensão:
Tipos personalizados são exportados no formato de sua representação em string. A exportação binária com SELECT INTO DUMPFILE atualmente não é compatível com tipos personalizados.

Próximos Passos

Criando Extensões em C++

Compile sua própria extensão

Arquitetura de Extensões

Entenda os detalhes internos

vsql_complex Source

Veja o código-fonte completo

Extensões Disponíveis

Navegue pelo catálogo de extensões