Pular para o conteúdo principal

Extensão explícita por motor (ESP-016)

O núcleo do FluentSQL continua focado em SQL amplamente portável e uma API fluente coerente entre motores. Recursos que não são universais (por exemplo RETURNING, dicas de otimizador específicas, extensões de um SGBD) entram apenas pela extensão opt-in documentada em ADR-016. Fecho formal e rastreio: issue #27 (ESP-016).

Contrato

NúcleoExtensão (ForDialectOnly)
PortabilidadeMesma API tende a produzir SQL utilizável em vários motores (com o dialeto escolhido em CreateFluentSQL)Não há promessa de portabilidade: o texto é emitido só para o TFluentSQLDriver indicado
ResponsabilidadeComportamento previsível da biblioteca na serializaçãoQuem chama valida semântica, versão do servidor e integração ao mudar de banco
ParâmetrosIFluentSQLParams nos fluxos suportadosSobrecarga com array of const usa o mesmo Params da consulta; texto livre permanece por conta do consumidor

API

  • ForDialectOnly(const ADialect: TFluentSQLDriver; const ASqlFragment: string) — regista um sufixo textual aplicado apenas quando o dialeto da instância (CreateFluentSQL) é ADialect. Noutros motores o trecho é omitido (comportamento vazio, alinhado a RB-EXT-3).
  • ForDialectOnly(const ADialect: TFluentSQLDriver; const AExpression: array of const) — igual ao anterior, com fragmento gerado por TUtils.SqlArrayOfConstToParameterizedSql e placeholders no AST (:pN antes da substituição por ? no MySQL, etc.).

O nome ForDialectOnly deixa explícito que o trecho não é SQL “universal”.

Exemplos

Núcleo portável (sem extensão)

CreateFluentSQL(dbnFirebird)
.Select.All
.From('CLIENTES')
.Where('ATIVO').Equal(1);

Extensão por motor (PostgreSQL RETURNING)

CreateFluentSQL(dbnPostgreSQL)
.Insert
.Into('LOGS')
.SetValue('MSG', 'ok')
.ForDialectOnly(dbnPostgreSQL, ' RETURNING ID');

Na serialização Firebird, o mesmo encadeamento com .ForDialectOnly(dbnPostgreSQL, …) não acrescenta o RETURNING (trecho omitido).

Dois motores para o mesmo ponto (um vazio)

CreateFluentSQL(dbnFirebird)
.Insert.Into('T').SetValue('A', 1)
.ForDialectOnly(dbnPostgreSQL, ' RETURNING ID')
.ForDialectOnly(dbnMySQL, '');

Em Firebird, apenas o INSERT base é emitido; as variantes PostgreSQL e MySQL não aplicam-se ao dialeto atual.

Leitura no código

  • FluentSQL.Interfaces.pasTDialectOnlyFragment, IFluentSQLAST, métodos em IFluentSQL.
  • FluentSQL.Serialize.pasDialectOnlySqlSuffix, ComposeSqlCore.
  • FluentSQL.Ast.pas — armazenamento e GetSerializationDialect.