Versão 41

Alterações significativas

Engine

  • 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

Admin

  • Foi criado o processo “Admin > 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 “Admin > 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.viewExists com o objetivo de verificar se uma visão existe na base de dados.
  • 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).

Web Framework

  • Foi criado o método UploadedFile.prototype.uploadToLobStorage com o objetivo de gravar na LobStorage os arquivos recebidos nas operações de upload iniciadas pelo método Process.prototype.upload.
  • 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.
  • A propriedade Field.prototype.charLength poderia retornar um valor incorreto em campos do tipo “combo” criados pelo método Field.prototype.clone.
  • 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.
  • O método Database.prototype.tableExists passa a retornar false caso seja informado um nome de uma visão em vez de uma tabela. Para verificar se uma visão existe, deve ser utilizado o método Database.prototype.viewExists.
  • O antigo protocolo de comunicação entre Engines raw Iap, que não usa o Http, passa a ser usado somente quando a URL do servidor possui o esquema iap.

Web Framework

  • O método Process.prototype.upload passa a realizar o upload de arquivos em uma única requisição HTTP no formato multipart/form-data.