Versão 22

Novidades

Otimização do consumo de memória do SimpleLayout

A exibição de relatórios SimpleLayout com grupos colapsáveis, recurso habilitado pela propriedade SimpleLayout.prototype.groupExpansionLevel, poderia provocar uma alocação excessiva de memória ou erros de “Out of Memory” caso o relatório contivesse uma quantidade elevada de registros.

Essa era uma restrição conhecida e para contornar essa limitação de uso alguns relatórios disponibilizam na grade de variáveis a opção “Nível em árvore”, permitindo desligar essa funcionalidade caso fosse necessário exibir uma quantidade elevada de dados.

Essa abordagem era problemática, pois a má utilização do relatório poderia provocar um consumo elevado de recursos, afetando outros usuários no mesmo servidor. Para evitar problemas dessa natureza, o SimpleLayout foi revisto para utilizar uma estrutura interna mais eficiente que reduz em aproximadamente 90% o consumo de memória na construção desse tipo de relatório. Em um caso atípico de uso do relatório Admin > Auditoria > Consultar Alterações, foi observada uma redução de aproximadamente 1.5 GB na memória alocada durante a execução do relatório.

É importante observar que apesar do sistema tratar melhor a geração de relatórios com alto volume de dados, o navegador Web ainda terá dificuldades em renderizar o relatório HTML gerado. A exportação de dados para arquivos ou a geração de relatórios textuais continuam sendo melhores alternativas para tratar esse tipo de demanda.

Melhorias

Engine

  • O construtor da classe Uint8Array passa a aceitar instâncias de Array e Uint8Array, conforme a especificação da linguagem. Também foi implementado o método Uint8Array.prototype.join.
  • Foi criado o guia de boas práticas de desenvolvimento na plataforma do Engine em https://nginstack.com/pt/docs/best-practices/. Essa documentação tratará de assuntos ou soluções que sejam específicas da plataforma, não sendo um guia geral de boas práticas de desenvolvimento em JavaScript, material esse que já pode ser encontrado com facilidade na Internet. Inicialmente foram abordados o tratamento de números decimais e o consumo de chaves do sistema. No futuro, esse material será revisto para tratar de outros assuntos relevantes da plataforma.
  • O método VirtualFileSystem.prototype.setFileContent passa a permitir que o parâmetro content seja um File ou MemoryStream, evitando a criação de strings temporárias em memória quando o conteúdo do arquivo se encontra nesses objetos. Também passa a ser possível indicar o tipo do conteúdo por meio do novo parâmetro opcional contentType.
  • Foi criado o método DBKey.from com o objetivo de converter um valor em uma instância de DBKey. Ele é mais eficiente que o construtor DBKey, pois evita a construção de um objeto em memória quando não há conversão a ser realizada.
  • Foi criado o método DBKey.prototype.equals com o objetivo de testar se uma chave é igual a outra, seja ela um outra instância de DBKey ou uma representação numérica ou textual da chave. Este novo método é útil quando utilizado o V8, onde as chaves passam a ser representadas por instâncias de DBKey em vez de valores do tipo number.

Web Framework

  • A grade lookup passa a executar o evento onGetImages para obter a imagem associada ao registro pesquisado em vez de chamar diretamente a função getMainImageUrl. O objetivo dessa alteração é permitir que comportamento padrão do sistema possa ser customizado, permitindo inclusive a associação de imagens aos valores dos campos do tipo combo.
  • O método UploadedFile.prototype.uploadToVfs passa a receber a opção key com o objetivo de indicar o arquivo da VirtualFileSystem onde deverá ser gravado o conteúdo da operação de upload. Antes dessa alteração, somente era possível criar novos arquivos por meio dessa API.

Defeitos corrigidos

Desenvolvimento

  • A atualização do sistema via API HTTP não reinicializa o Engine quando necessário.

Engine

  • As alterações realizadas em uma instância de Uint8Array não eram refletidas no ArrayBuffer informado no construtor.
  • O serviço de execução remota de scripts, na versão 32 bits do Engine, poderia causar um erro de violação de acesso.

Web Framework

  • Ao informar o valor de um campo lookup ocorria o erro “Cannot read property editingCellId of null” se a grade perdesse o foco antes do sistema exibir a grade auxiliar com o resultado da pesquisa.
  • Os valores escritos em uma coluna de um relatório SimpleLayout com a propriedade Column.prototype.mergeDuplicatedValues ativa não eram mesclados corretamente se a duplicação fosse detectada na última linha do relatório ou se fossem escritas mais de 1000 células.

Outras alterações

Admin

  • O preenchimento das variáveis “Data Inicial” e “Data Final” do relatório Admin > Auditoria > Consultar Alterações passa a ser opcional quando informada uma versão de alteração.

Engine

  • As colunas do tipo number passam a ser criadas no banco de dados Oracle com o tipo Number(38, 10) em vez de Number, de forma similar ao comportamento já adotado nos demais bancos de dados suportados pelo Engine. A adoção de uma escala fixa torna o resultado das operações de agregação no banco de dados mais previsíveis, pois a escala deixa de flutuar com base na ordem de grandeza da parte inteira.
  • O runtime Javascript V8 foi atualizado para a versão 7.5.26.