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():
- Uma única chamada de macro registra tudo, não sendo necessário nenhum SQL manual
- Objetos de tipo são variáveis
constexprconstruídas comvsql::make_type<kName>(), ondekNameé umstatic 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 assinaturavoid(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)
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):Estratégia de Testes
Arquivo de Teste (test/t/complex_create.test):Padrões-Chave de Implementação
Manifesto
Arquivo:manifest.json
Exportando e Importando Dados com Tipos Personalizados
O VillageSQL oferece suporte aSELECT 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:/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: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

