Atribuir uma string com tamanho maior que a capacidade de um campo de um DataSet passa a
gerar um erro em vez do valor ser truncado silenciosamente. Por causa dessa mudança, erros que
antes eram silenciados podem passar a ser apresentados para os usuários. A recomendação é que
os códigos afetados por essa alteração sejam revistos para utilizar um tamanho de campo adequado
ou passem a truncar o valor antes da atribuição, deixando explícito que o truncamento de dados é
intencional. Caso seja necessário, o comportamento anterior pode ser restaurado por meio do comando
DataSet.setStringOverflowMode('truncate').
Essa configuração é global para todos os scripts executados em um Engine e deve ser feita
preferencialmente em um script de inicialização do Engine.
Melhorias
Administração do sistema
Foi criado o processo “Administração do sistema > Base de dados > Migração chaves 64 bits” com
o objetivo de auxiliar a migração das bases de dados para utilizar inteiros de 64 bits na
representação das chaves e versões do sistema. Atualmente, esses valores são representados como
inteiros de 32 bits, mas, em versões futuras do Engine, será permitido o uso de inteiros de
64 bits, ampliando a quantidade máxima de registros em uma base de dados. Mais detalhes
dessa migração podem ser obtidos no manual
Migração chaves de 64 bits.
Foram realizadas as seguintes melhorias no processo
“Administração do sistema > Bases de dados > Análise do esquema da base de dados”:
Adicionada a opção de filtro pelo tipo das colunas.
As grades e os campos que exibem as classes de origem da configuração passam a contar
com o botão “Abrir no VSCode”, agilizando a visualização da definição da tabela, coluna ou
índice.
Na grade “Tabelas”, passa a ser exibido o campo “Tipo inteiro padrão”. Esse campo exibirá
o tipo que será utilizado na base de dados para os campos declarados com o tipo legado
“integer”.
Desenvolvimento
Os processos de atualização passam a suportar a conversão de colunas do tipo “char” para
“varchar”. Nas versões mais recentes do sistema, o tipo “char” é utilizado exclusivamente em
colunas que armazenam apenas um caractere, pois há divergências entre os SGBDs no suporte ao
tipo “char” com tamanho maior. No entanto, colunas criadas antes de 2017 ainda poderiam utilizar
o tipo “char” para armazenar textos maiores, comportamento esse que será revisto a partir desta
versão. A conversão de colunas do tipo “char” para “varchar” em tabelas com elevada quantidade de
registros pode ser demorada. Caso haja conversões a serem realizadas em tabelas de movimentação, é
recomendado que elas sejam feitas antes na base de homologação a fim de calcular o tempo necessário
para a atualização do ambiente de produção.
Os processos de atualização passam a agrupar em uma única operação apenas os comandos de
alteração de colunas que são conhecidos por serem aceitos por todos os SGBDs suportados pelo Engine,
evitando que a falha na alteração de uma coluna impeça a alteração das demais.
Engine
Foi criada a propriedade
ModelDef.prototype.integerDatabaseType
com o objetivo de indicar o tipo a ser utilizado na base de dados para os campos declarados com o
tipo “integer”.
A atualização do esquema das tabelas do cache local que ocorre na inicialização do Engine foi
otimizada, reduzindo a janela de manutenção necessária nas atualizações de sistema.
Campos de qualquer tipo que tenham a propriedade options ou o evento getOptions definidos
serão tratados de forma similar aos campos do tipo “combo”, permitindo assim que combos possam
ter o seu tipo e tamanho declarados de forma estática. Na definição das classes de dados, passa
a ser recomendada a declaração do tipo real dos combos, evitando assim que as mudanças nas opções
gerem alterações desnecessárias no esquema da base de dados e também para determinar o
tipo adequado (int64 ou int32) dos combos cujas opções são valores inteiros.
Campos combo com tipo definido também têm a vantagem de eliminarem o comportamento errático de
aceitar o índice da opção como valor válido, comportamento esse mantido apenas para os campos
declarados explicitamente com o tipo “combo”. Mais detalhes dessa distinção podem ser observadas
na documentação do método
GridField.prototype.setValue.
Tokens de autorização passam a suportar chaves de 64 bits.
A classe HtmlToPdf
foi convertida em módulo. O script anterior, da UFS, foi preservado para manter a compatibilidade
dos includes nos códigos clientes desta classe. Foi adicionada a possibilidade da impressão em PDF
ser feita remotamente, no Engine servidor ou via serviço HTTP.
A classe EngineAppStore foi convertida em módulo e renomeada para
NativeAppPackageManager.
O script anterior, da UFS, foi preservado para manter a compatibilidade dos includes nos códigos
clientes desta classe.
Foi criado o método
Database.prototype.columnExists
com o objetivo de verificar se uma coluna existe em uma tabela ou visão da base de dados.
Extensão VS Code
Execuções de código que retornem um DataSet que possua SQL Statement passam a exibir
no resultado o plano de execução da query.
Passa a ser possível abrir mais de uma aba de execução para um mesmo arquivo.
Abas de execução agora contam com o botão “Go to File”, que exibe o arquivo que foi executado.
A extensão passa a contar com o comando Engine DevTools: Show Execution Plan, que exibe
em uma aba lateral o plano de execução do arquivo ou seleção corrente.
A extensão passa a ter suporte completo a Resource Strings. Agora é possível criar
(comando Engine DevTools: Create Resource String), remover (opção “Delete This Resource String”
no menu de contexto do editor) e editar (como um arquivo padrão no editor do VS Code).
Os tipos “int64” e “int32” passam a ser suportados nas definições de campos no modelo de dados e
nas grades do sistema. Eles também passam a ser suportados nas definições de colunas e filtros
das fontes de dados.
Defeitos corrigidos
Desenvolvimento
A criação de índices com colunas com nomes reservados, como “time”, poderia falhar nos processos
de atualização do sistema quando era utilizado o PostgreSQL.
Engine
Esporadicamente ocorria um erro de Access Violation no término da execução de um script
invocado através do Database.runScript.
A leitura da propriedade Connection.prototype.isOnline
poderia gerar um erro caso fosse informado um endereço de servidor inválido.
Ao modificar a propriedade options de um campo duplicado criado pelo método
Field.prototype.clone
poderia ocorrer a modificação dessa mesma propriedade no campo que originou a cópia.
Quando um Engine, em modo edge, era iniciado sem conexão com o servidor, ele passava a
usar o antigo protocolo raw Iap, não voltando a sincronizar o cache local quando a conexão com
o servidor era restaurada se ele não estivesse com esse protocolo habilitado.
Web Framework
Ao clicar no botão “Ok” do processo auxiliar de preenchimento de campo lookup, aberto ao dar
dois cliques em um campo lookup, ocorria o erro “TabControl.sanityCheckForId(): unknown sheet id”
se o processo original fosse encerrado pelo usuário antes de confirmar ou cancelar a seleção.
O sincronismo da grade poderia falhar durante o preenchimento de um campo lookup, podendo
provocar uma divergência entre os valores exibidos ao usuário e os dados da grade no servidor.
Outras alterações
Engine
Foi criado o parâmetro de comando de linha --noProxy que desabilita no Engine o uso da configuração
de proxy do sistema operacional. Mais detalhes disponíveis no manual
Configuração do Engine.
Ao criar um campo do tipo “integer” no DataSet passa a ser utilizado por padrão o tipo
“int64” em vez de “int32”. O tipo associado ao “integer” pode ser configurado pela função
DataSet.setIntegerDataType.
Foi criada a propriedade engine.smallTempDir que indica a pasta
mais otimizada para a criação de arquivos temporários de tamanho reduzido.