Informação de versão de r-codes

Escrito por Marcos Kirchner em 22 de setembro de 2008, 08:20h

ATENÇÃO: as informações apresentadas neste post baseiam-se em observações e testes. Não existe garantia de veracidade ou funcionalidade. Qualquer informação apresentada neste post pode ser alterada pela Progress ou Datasul sem prévio aviso.

Uma das regras para que um r-code seja portável para outros ambientes está relacionada a versão de Progress utilizada para gerar o r-code e recursos utilizados no programa.

Quando um r-code é gerado, o compilador do Progress coloca no cabeçalho (header) do r-code a versão para o qual ele foi compilado. Esta informação de versão é armazenada em um formato de número inteiro de 16 bits, nos bytes 14 e 15.

Abaixo um exemplo de como extrair a versão do r-code, com um programa C#.NET. Este mesmo código pode facilmente ser convertido para qualquer linguagem.

byte[] versionBytes = new byte[2];
FileStream fs = new FileStream(rcodeFile, FileMode.Open, FileAccess.Read);
fs.Seek(14, SeekOrigin.Begin);
fs.Read(versionBytes, 0, 2);
fs.Close();
fs.Dispose();
int rcodeVersion = BitConverter.ToInt16(versionBytes, 0);

A versão contida no r-code varia de acordo com a versão do Progress utilizada para compilação e os recursos de Progress que foram utilizadas no programa.

Considere o código abaixo:

DEF VAR h AS HANDLE.
CREATE CLIENT-PRINCIPAL h.
DELETE OBJECT h.

O r-code gerado a partir deste código apresenta a versão 1005, independente de ter sido compilado com 10.1A, 10.1B ou 10.1C. Como a versão do r-code é a mesma, este programa é portável entre estas três plataformas.

Em contrapartida, o programa abaixo utiliza um recurso novo do 10.1C e não compila em versões anteriores.

DEFINE VARIABLE hStream AS HANDLE NO-UNDO.
DEFINE STREAM myStream.
hStream = STREAM mySTream:HANDLE.

O r-code gerado a partir deste código apresenta a versão 1009, e não executará em versões anteriores.

A tabelinha abaixo apresenta um sumário do número de programas para cada versão de r-code. As informações foram obtidas na expedição da Datasul, no dia 18/09/2008, para o produto EMS 2.06B Multi-idioma Progress 10.1B com SQL Server.

Versão  Contagem de programas
------- -----------
1005    45219
1008    459

Categorias: Internals | Progress

Tags: , ,

Comentários (5) -

em 23 de setembro de 2008, 15:41h

Existe alguma tabela para o retorno do Código?
Exemplo se o retorno foi 908, então é o Progress 9.1E.
Isso seria interessante, pois poderia ser criado um retorno e explicitar qual é a versão de Progress....

Sds,
Vithor da Silva e Silva

Vithor da Silva e Silva

em 24 de setembro de 2008, 16:25h

Não existe uma documentação da Progress sobre versões de r-codes X versões de Progress.

O KBase P114335 informa que versão 1005 é 10.1A, e versão 908 é 9.1E.

Já no KBase P27054 temos a informação de que r-codes com múltiplos segmentos (multiple action code segments) têm a versão 909.

Estou fazendo mais testes sobre estas versões, se encontrar informações adicionais eu publico aqui ou em um novo post.

Marcos Kirchner

em 25 de setembro de 2008, 08:48h

Segue uma código .NET que fiz... baseado neste post.

private void verificaRCode(string rcodeFile)
        {
            byte[] versionBytes = new byte[2];
            FileStream fs = new FileStream(rcodeFile, FileMode.Open, FileAccess.Read);
            fs.Seek(14, SeekOrigin.Begin);
            fs.Read(versionBytes, 0, 2);
            fs.Close();
            fs.Dispose();
            int rcodeVersion = BitConverter.ToInt16(versionBytes, 0);
            rtbPrompt.Text +=
                "Caminho Leitura    : " + rcodeFile.ToString()                  + "\n" +
                "Versão R-Code      : " + rcodeVersion.ToString()               + "\n" +
                "Versão Progress    : " + tabelaVersoesProgress(rcodeVersion)   + ".";
        }
        private string tabelaVersoesProgress(int codigo)
        {
            string nomeVersao;
            switch (codigo)
            {
                case 908:
                    nomeVersao = "Progress 9.1E";
                    break;
                case 1005:
                    nomeVersao = "Progress 10.1A";
                    break;
                default:
                    nomeVersao = " ";
                    break;
            }
            return nomeVersao;
        }

Sds,
Vithor da Silva

Vithor da Silva e Silva

em 25 de setembro de 2008, 14:36h

Vithor,

Uma sugestão ainda seria alterar o método verificaRCode para que retorne um struct do tipo:

struct RCodeInfo {
    string FileName;
    int RCodeVersion;
    string ProgressVersion;
}

Desta forma você desacopla o código que verifica a versão do código que exibe as versões, e pode reutilizar o método verificaRCode.

Marcos Kirchner

em 26 de setembro de 2008, 11:50h

Acabei de criar um novo post chamado Versões de R-Code X versões de Progress, que contém alguns testes e informa quais versões de progress executam quais versões de r-code.

O post está em processo de aprovação e deve ser publicado ainda hoje.

Marcos Kirchner

Comentar

biuquote
  • Comentário
  • Pré-visualização
Loading

Acesso LogMeIn

Informe o código PIN: