COBOL & Mysql

Rotina EXTMYSQL

EXTMYSQL

O EXTMYSQL é um programa que ira substituir "EXTFH" ou o "FHREDIR" da mesma forma com que é feito para tratamento para arquivos acessados via "FILESHARE ".

Um aplicativo usando o EXTMYSQL pode acessar simultaneamente arquivos MF, arquivos MF via fileshare, e ainda arquivos MYSQL, adotando a mesmas e syntax para todos.

Da mesma forma que é feito no fileshare, onde é informado "$$servidor" para que o FHREDIR busque este arquivo no servidor do FILESHARE, o EXTMYSQL identifica atravéz do parametro informado no label "@IP@PORTA@USER@PASW@DB@TABEL" que se trata de um arquivo que devera ser acessado via MySql, quanto aos demais arquivos, simplesmente devolve o controle para o FHREDIR que por sua vez, se encarrega de fazer o acesso normalmente como sempre foi feito.

Em sendo assim, basta informar o label do arquivo, atendendo esta regra, para que todos recursos e beneficios descritos anterirmente, passem a estar disponíveis.

File Status.

Para manter a compatibilidade, os códigos de status, continuam os mesmos, apenas foram adicionados novos códigos para tratamento de casos específicos conforme abaixo:

Status Descrição Solução
9 e 48 Heap access failure - out of buffers

Erro no tratamento de arquivo virtual para gerenciamento interno.

9 e 49 Heap deallocated while program inactive
9 e 50 Backing-file failure: too many files
9 e 51 Backing-file failure: file access denied
9 e 52 Backing-file failure: I/O failure
51 Erro na conexão com o banco de dados atravéz da LIBMYSQL.DLL

Certifique-se de ter a LIBMYSQL.DLL disponível

53 Não foi possível interpretar campos definidos na tabela e montar correspondência na FD.

Certifique-se de que todos campos usados na tabela estão corretamente definidos, e que os mesmos possuem correspondência, de acordo com tabela fornecida anteriormente.

91 Erro na montagem da estrutura da FD, falha montando campos.

Idem 53.

200 Erro com a execução de comando da LIBMYSQL confira Logimed.log  
201 Conexão com servidor perdida. Verifique condições da rede e disponibilidade de INTERNET, cado esteja operando via WEB.
9 e 4 Não encontrou no DB tabela procurada "Illegal file name."  

Espelhamento via Log de comandos:

Adicionando "&" ao final do label do arquivo, antes de ser aberto, faz com que todos comandos de I-O sejam registrados no log "imelog". Arquivos abertos com esta configuração terão seus comandos de INSERT, DELETE e UPDATE registrados sequencialmente de forma cronológica na tabela IMELOG.
A partir deste log será possível reconstruir a tabela reexecutando os comandos préviamente salvos.
Ex.:
Arquivo aberto normalmente com o LABEL = "@127.0.0.1@3306@root@@test@cadcep", se for usado "@127.0.0.1@3306@root@@test@cadcep&", ativara a rotina de LOG deste arquivo.

Recursos adicionais:

Comando Descrição

MontaWhere

Passa ao Servidor Mysql comandos adicionais que serão usados no próximo START.

MontaOrder

Passa ao Servidor Mysql parametros adicionais afetando a classificação do resultado gerado pelo comando START.

RetornaCmd

Retorna numa variável a STRING do comando enviado ao servidor MySql.

SalvaCmd

Força a geração de um registro no LOGIMED.LOG contendo o comando enviado ao servidorMysql.

MysqlQuery

Envia ao servidor Mysql uma string contendo comandos e parametros a serem executados.

IgualaCmp

Altera configuração do comando START a ser passado para o Mysql, de modo a definir qual campo numa chave composta deve ser tratado como guia, evitando a geração de uma pesquisa extremamente longa.

GetThread

Retorna a thread da conexão onde foi executado o ultimo comando.

LimpaString

Executa o comando Mysql mysql_real_escape_string.

LockTime

Redefine o tempo de bloqueio do registro em segundos.

GetLstMsgErr

Retorna mensagem de erro.

ListTableOpen

Gera em LOGIMED.LOG a relação de todas as tabelas(arquivos) em aberto.

NumArquivos

Retorna numero de arquivos Mysql e MF abertos.

MysqlConecta

Estabelece uma conexão independente com o Mysql

MysqlComando

Envia ao Mysql, STRING contendo comando e parametros a serem executados na conexão extabelecida pelo comando MysqlConecta.

MysqlRetorna

Envia ao Mysql, STRING contendo comando e parametros a serem executados na conexão extabelecida pelo comando MysqlConecta.

MysqlLiberaCursor

Libera o cursor criado pelo MysqlComando, liberando recursos alocados, e principalmente libera memória.

MysqlDesConecta

Libera a conexão estabelecida pelo MysqlConecta, liberando recursos alocados, e principalmente libera memória.

MysqlQueryFCD

Executa um comando SQL vinculado ao FCD de um determinado arquivo.

MudaPaginacao

Possibilita configurar dinamicamente o tamanho em numero de registros da página usada em comandos de leitura.


  • MontaWhere

    Rotina que pode ser usada para passar ao LIBMYSQL comandos específicos que serão adicionados na estrutura do SELECT.

    Esta rotina tem fundamental importância, tendo em vista a filosofia adotada pelo banco de dados ser totalmente diferente da adotada pelos arquivos MF, onde no MF a filtragem é feita após a leitura de cada registro, e no banco de dados esta filtragem é feita pelo servidor, o que em uma base de dados com muitos registros, implica numa significativa demora, até concluir a montagem de todos registros selecionados.

    A vantagem da forma adotada pelo banco de dados, esta no fato de reduzir drasticamente o volume de trafego na rede, onde só serão lidos os registros válidos, por outro lago o servidor precisa montar toda a pesquisa antes de liberar o primeiro registro.

    Outra grande vantagem é o fato de se poder usar qualquer campo da tabela nesta filtragem.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.
    Possibilita com que o servidor faça a filtragem, antes de iniciar a retornar os registros, o que será feito nos comandos "READ"subsequentes.
    Neste caso o "START" manda o comando "SELECT" para o servidor MYSQL, para depois os comandos "READ" executarem o comando "FETCH", dando acesso aos registros préviamente selecionados.
    Informe na STRING W-WHERE apenas os parametros de filtragem, tendo o cuidado de manter entre "`" os nomes dos campos, e "'" os valores que serão usados como referencia para filtragem.

    Syntax

    CALL "MontaWhere" USING W-WHERE.
    Onde W-WHERE PIC X(2048).

    Ex.:

    No exemplo ao lado, após o START sertão lidos apenas os registros cujos campos MY-DTA seja = 20120202 e  MY-HST tenham a string PAGO, respeitando a classificação determinada pela chave usada no comando START.

           WORKING-STORAGE SECTION.
           77  W-WHERE            PIC X(2048).
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               MOVE Z"`MY-DTA` = '20120202' AND `MY-HST`
          -         " LIKE 'PAGO%'" TO W-WHERE
               CALL "MontaWhere" USING W-WHERE
               START ARQMYS KEY IS NOT LES MY-LAN
               PERFORM UNTIL STATUS-ERRO
                  READ ARQMYS NEXT RECORD NOT AT END
                     .
                     .
                     .
       

  • MontaOrder

    Rotina que pode ser usada para passar ao LIBMYSQL comandos específicos que serão adicionados na estrutura do SELECT.

    Esta rotina possibilita afetar a forma com que os registros serão classificados após o START. Caso não seja usada, os registros retornarão na ordem definida pela chave selecionada no START. Caso a classificação dos mesmos não seja necessária, basta chamar a rotina passando LOW-VALUES, que não será feita nenhuma classificação, compensando em ganho de velocidade na montagem inicial, este ganho só será perceptível após um determinado volume de registros.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "MontaOrder" USING W-ORDER.
    Onde W-ORDER PIC X(1024).
    Ex.:

    No exemplo, após o START sertão lidos todos os registros, mas apesar de o comando START ter definido a chave MY-DTA como chave para acessar o cadastro, os registros serão lidos na rodem definida na string W-ORDER. O acesso pelo servidor será pela chave definida pelo START, mas após selecionar os registros válidos o MYSQL classificarta os mesmos para aliberá-los na sequencia definda no W-ORDER.

           WORKING-STORAGE SECTION.
           77  W-ORDER            PIC X(1024).
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               MOVE Z"`MY-HST` ASC, `MY-DTA` DESC" TO W-ORDER
               CALL "MontaOrder" USING W-ORDER
               START ARQMYS KEY IS NOT LES MY-LAN
               PERFORM UNTIL STATUS-ERRO
                  READ ARQMYS NEXT RECORD NOT AT END
                     .
                     .
                     .
        

    A importância desta rotina esta na facilidade de já se acessar o cadastro na ordem desejada, podendo ser usado qualquer campo da tabela, ou até mesmo combinação de campos.


  • RetornaCmd

    Rotina que pode ser usada para retornar o comando passado ao MYSQL. Serve basicamente para debugar programas.

    Esta rotina retornará toda string enviada ao servidor, pode ser usada debugando um programa, ou armazenando seu conteúdo como quiser.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "RetornaCmd" USING W-CMD.
    Onde W-CMD PIC X(64000).
    Ex.:

    No exemplo, após o START o comando carrega em W-CMD a string passada para o MYSQL para executar o START.

           WORKING-STORAGE SECTION.
           77  W-CMD            PIC X(64000).
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               START ARQMYS KEY IS NOT LES MY-LAN
               CALL "RetornaCmd" USING W-CMD
               PERFORM UNTIL STATUS-ERRO
                  READ ARQMYS NEXT RECORD NOT AT END
                     .
                     .
                     .
        

    A importância desta rotina esta na facilidade em debugar determinados comando, ou aperfeiçoa-los de forma a obter melhores resultados inclusive em termos de desempenho.


  • SalvaCmd

    Rotina que pode ser usada para retornar o comando passado ao MYSQL, e forçar a garvação do comando passado no log de erros da rotina Logimed.log.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "SalvaCmd" USING W-CMD.
    Onde W-CMD PIC X(64000).
    Ex.:

    No exemplo, após o START o comando carrega em W-CMD a string passada para o MYSQL para executar o START, salva seu conteúdo no Log.

           WORKING-STORAGE SECTION.
           77  W-CMD            PIC X(64000).
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               START ARQMYS KEY IS NOT LES MY-LAN
               CALL "SalvaCmd" USING W-CMD
               PERFORM UNTIL STATUS-ERRO
                  READ ARQMYS NEXT RECORD NOT AT END
                     .
                     .
                     .
        

    A importância desta rotina esta na facilidade em debugar determinados comando, ou aperfeiçoa-los de forma a obter melhores resultados inclusive em termos de desempenho.


  • MysqlQuery

    Envia ao servidor Mysql a stringa contendo comandos e parametros a serem executados.

    Compatibilidade. Só usar caso tenha pelo menos um arquivo aberto.

    Syntax
    CALL "MysqlQuery" USING W-CMD W-HANDLE.
    Onde W-CMD PIC X(64000).
    e W-HANDLE POINTER.
    Ex.:

    Tendo acesso a esta rotina é possível executar qualquer comando do MYSQL independente dos executados via comando tradicionais, tipo READ, START ETC...

    Ao lado segue um exemplo de programa que retorna o numero de registros numa determinada tabela.

    A importância desta rotina esta na facilidade em acessar qualquer outro comando do MYSQL.

    Para executar esta rotina, é necessário ja haver um arquivo aberto (estabelece uma conexão), e o comando será executado vinculado a conexão do ultimo acesso feito via READ, START, OPEN etc...


  • IgualaCmp

    Rotina altera os parametros do comando SELECT para executar o START, possibilitando sinalizar um ou mais campos de uma chave composta para que sejam tratados pela igualdade ao valor informado na FD.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax
    CALL "IgualaCmp" USING W-IGLKEY.
    Onde W-IGLKEY PIC X(1) COMP-X.

    Valores:

    Valor Função
    1 Força com que o primeiro campo da chave seja igual.
    2 Força com que o segundo campo da chave seja igual.
    4 Força com que o terceiro campo da chave seja igual.
    8 Força com que o quarto campo da chave seja igual.
    16 Força com que o quinto campo da chave seja igual.
    32 Força com que o sexto campo da chave seja igual.
    64 Força com que o setimo campo da chave seja igual.
    128 Força com que o oitavo campo da chave seja igual.

    Ex.

    Chave

    SELECT CADASTRO ASSIGN TO DYNAMIC W-LABEL
           ORGANIZATION IS INDEXED
            ACCESS MODE IS DYNAMIC
            FILE STATUS IS ESTADO
            LOCK MODE   IS MANUAL
            RECORD KEY  IS CD-CHA = CD-COD CD-FIL CD-SET
            ALTERNATE RECORD KEY IS CD-DSC = CD-DES CD-FIL CD-GRU
                      WITH DUPLICATES
            ALTERNATE RECORD KEY IS CD-KAR = CD-COD CD-FIL CD-TAM 
                                             CD-COR CD-MAT
                      WITH DUPLICATES.
    


    Situação

    Ex.:

    Quero ler a partir do registro CD-COD=1, CD-FIL=3, CD-SET=2 da chave principal:

    Sendo que me interessam apenas os registros onde CD-FIL = 3, neste caso:

    MOVE  1 TO CD-COD
    MOVE  3 TO CD-FIL
    MOVE  2 TO CD-SET
    MOVE  2 TO W-IGLKEY
    CALL "IgualaCmp" USING W-IGLKEY
    START CADASTRO KEY IS NOT LESS THAN CD-CHA
    PERFORM UNTIL STATUS-ERRO
       READ CADASTRO NEXT RECORD NOT AT END
        .
        .
    

    equivale a

    START CADASTRO KEY IS NOT LESS THAN CD-CHA
    PERFORM UNTIL STATUS-ERRO
       READ CADASTRO NEXT RECORD NOT AT END
          IF CD-FIL NOT = 3
             MOVE  "10" TO ESTADO
          ELSE
             .
             .
    

    Também é possível a combinação de mais de um campo sendo usado para tratar a igualdade.

    Ex.:

    MOVE  1         TO W-IGLKEY
    ADD   2         TO W-IGLKEY
    ADD   8         TO W-IGLKEY
    

    Faz com que o primeiro, segundo e quarto campo da chave composta sejam tratados pela igualdade aos valores informados na FD quando for executado o START.

    O principal motivo para criaação desta rotina é reduzir o impacto da diferença da forma com que o acesso é tratado no banco de dados com relação aos arquivos MF.

    No MF, logo após o START, imediatamente é executado o comando READ, enquanto que num banco de dados, a primeira leitura só ira ocorrer após o servidor ter montado toda a pesquisa, e de acordo com a filtragem pré informada.

    Desta forma é possível, com um pequeno impacto no fonte, solucionar algumas situações que por ventura venham a surgir, onde em função de um grande numero de registros, o comando READ demore mais tempo do que o tolerável para ser executado.

    Esta rotina possibilita que se reduza significativamente o universo de registros que serão acessados pelo servidor, até que conclua a montagem da consulta solicitada.

    É óbvio que o uso destas rotinas apesar de vantajosas, afetam a compatibilidade com o projeto original, uma vez que estes recursos não estão disponíveis nos acessos via arquivos MF, apesar de o EXTMYSQL ignorá-los, no caso de o arquivo não ser MYSQL.

    Uma vez aberto pelo menos um arquivo no MYSQL, estara disponível ao usuario uma conexão com o banco de dados.


  • GetThread

    Retorna a thread em que o aplicativo esta conectado ao Mysql na conexão do ultimo comando executado.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "GetThread" USING W-THREAD.
    Onde W-THREAD PIC 9(09) COMP-5.
    Ex.:

           WORKING-STORAGE SECTION.
           77  W-THREAD            PIC 9(09) COMP-5.
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               CALL "GetThread" USING W-THREAD
                     .
                     .
                     .
        

  • LimpaString

    Rotina que tira de uma string informada os caracteres não tratados pelo comando Mysql.
    Executa o comando Mysql mysql_real_escape_string.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "LimpaString" USING W-BUFFER W-TMN.
    Onde W-TUFFER PIC X(XX).
    W-TMN PIC 9(09) COMP-5.
    Ex.:

           WORKING-STORAGE SECTION.
           77  W-TMN            PIC 9(09) COMP-5.
           77  W-BUFFER         PIC X(1024).
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               MOVE  LENGTH OF W-BUFFER TO W-TMN.
               CALL "LimpaString" USING W-BUFFER W-TMN.
                     .
                     .
                     .
        

  • LockTime

    Redefine o tempo de bloqueio do registro em acessos multi usuario.
    Informe o tempo em segundos, 1800 = 30 minutos.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "LockTime" USING W-TMP.
    Onde W-TMP PIC 9(09) COMP-5.
    Ex.:

           WORKING-STORAGE SECTION.
           77  W-TMP            PIC 9(09) COMP-5.
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               MOVE  1800 TO W-TMP.
               CALL "LockTime" USING W-TMP.
                     .
                     .
                     .
        

  • GetLstMsgErr

    Retorna a ultima mensagem de erro por parte da rotina EXTMYSQL.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "GetLstMsgErr" USING W-ERRO.
    Onde W-ERRO PIC X(1024).
    Ex.:

           WORKING-STORAGE SECTION.
           77  W-ERRO            PIC X(1024).
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               CALL "GetLstMsgErr" USING W-ERRO.
                     .
                     .
                     .
        

  • ListTableOpen

    Esta rotina gera em LOGIMED.LOG a relação de todas as tabelas(arquivos) em aberto.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "ListTableOpen".
    Onde W-THREAD PIC 9(09) COMP-5.
    Ex.:

           WORKING-STORAGE SECTION.
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               CALL "ListTableOpen".
                     .
                     .
                     .
        

  • NumArquivos

    Retorna numero de arquivos Mysql e MF abertos.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "NumArquivos" USING W-NUMF W-NUMY.
    Onde W-NUMF PIC X(04) COMP-5.
    W-NUMY PIC X(04) COMP-5.
    Ex.:

           WORKING-STORAGE SECTION.
           77  W-NUMF            PIC X(04) COMP-5.
           77  W-NUMY            PIC X(04) COMP-5.
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               CALL "NumArquivos" USING W-NUMF W-NUMY.
                     .
                     .
                     .
        

  • LogArquivos

    Controal a geração de logo dos comandos de I-O.
    1 - Força geração de log dos comandos.
    0 - Desabilita Log dos comandos de I-0.

    Sempre que o EXTMYSQL é usado para acessar uma base de dados no Mysql é criado a tabela IMELOG, que serve para armazenar o log de cada comando executado, com todos seus parametros, possibilitando a reconstrução de uma base a partir destes comandos.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "LogArquivos" USING W-TLOG.
    Onde W-TLOG PIC 9(01).
    W-NUMY PIC X(04) COMP-5.
    Ex.:

           WORKING-STORAGE SECTION.
           77  W-TLOG            PIC 9(01).
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               CALL "LogArquivos" USING W-TLOG.
                     .
                     .
                     .
        

  • MysqlConecta

    Estabelece uma conexão com o Mysql, independente da necessidade de se abrir um arquivo via comando tradicional OPEN.

    Ao estabelecer uma conexão com o servidor Mysl, retorna o handle da conexão estabelecida, que deverá ser usado nos comandos a serem executados nesta conexão.
    Retorna da mesma forma o STATUS da operação, sendo "00" caso bem sucedida.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "MysqlConecta" USING W-ARQUIVOS W-CONEXAO W-STATUS.

    Ex.: Vide programa demo

           WORKING-STORAGE SECTION.
           77  W-ARQUIVOS            PIC X(128).
           77  W-STATUS              PIC X(02).
    
           01  W-CONEXAO USAGE POINTER.
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               MOVE  "@127.0.0.1@3306@root@@test@cadtst"
                                  TO W-ARQUIVOS.
    
               CALL "MysqlConecta" USING W-ARQUIVOS  *> Variavel com os parametros para estabelecer a conexão
                                         W-CONEXAO   *> Retorna handle para encontrar a FCD-AREA da conexão
                                         W-STATUS.   *> Status de retorno
                     .
                     .
                     .
        

  • MysqlComando

    Envia ao Mysql, STRING contendo comando e parametros a serem executados na conexão extabelecida pelo comando MysqlConecta.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "MysqlComando" USING W-CONEXAO *> Handle para recuperar FCD-AREA W-COMANDO *> Comando a ser executado W-CURSOR *> Handle do retorno do comando W-QRTM *> Tamanho do comando a ser executado W-STATUS. *> Status de retorno

    Ex.: Vide programa demo

           WORKING-STORAGE SECTION.
           77  W-COMANDO             PIC X(64000).
           77  W-STATUS              PIC X(02).
           77  W-QRTM                PIC 9(09) COMP-5.
    
           01  W-CONEXAO USAGE POINTER.
           01  W-CURSOR  USAGE POINTER.
           .
           .
           .
    
           PROCEDURE DIVISION.
               .
               .
               .
               STRING "SELECT cadtst.tstlan, cadtst.tstvl1, cadtst.tstvl2, "
                      "cadtst.tstvl3, cadtst.tstvl4, cadtst.tstvl5, "
                      "cadtst.tstch1, cadtst.tstch2 FROM cadtst"
                         DELIMITED BY SIZE
                         INTO W-COMANDO WITH POINTER W-QRTM.
    
               CALL "MysqlComando" USING W-CONEXAO   *> Variavel com os parametros para estabelecer 
                                                     *> a conexão. Retornado do comando MysqlConecta
                                         W-COMANDO   *> String contendo a instrução Mysql
                                         W-CURSOR    *> Retorna handle (cursor), resultado do comando executado.
                                         W-QRTM      *> Tamanho da instrução sendo enviada ao Mysql
                                         W-STATUS    *> Retorna Status de retorno (resultado) do comando
                     .
                     .
                     .
        

  • MysqlRetorna

    Retorna em W-RESULT uma string colunada com o proximo resultado disponível.
    As colunas obdecerão os tamanhos pré estabelecidos na definição de cada coluna envolvida no Mysql.

    Retorna em W-STATUS o status do comando executado conforme tabela de FS do COBOL.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "MysqlRetorna" USING W-CONEXAO *> Handle para recuperar FCD-AREA W-CURSOR *> Endereço estrutura do retorno (cursor) W-QRTM *> Tamanho do buffer sendo retornado W-STATUS *> Status de retorno W-RESULT. *> Buffer contendo o resultado sendo retornado. Ter cuidado no programa

    Ex.: Vide programa demo

           WORKING-STORAGE SECTION.
           77  W-RESULT              PIC X(64000).
           77  W-STATUS              PIC X(02).
           77  W-QRTM                PIC 9(09) COMP-5.
    
           01  W-CONEXAO USAGE POINTER.
           01  W-CURSOR  USAGE POINTER.
           01  WS-REG.
               02 WS-LAN     PIC S9(10).
               02 WS-CL1     PIC S9(07).
               02 WS-CL2     PIC S9(06).
               02 WS-CL3     PIC S9(07)V99.
               02 WS-CL4     PIC S9(05).
               02 WS-CL5     PIC S9(05)V9999.
               02 WS-CH1     PIC X(10).
               02 WS-CH2     PIC X(50).
           .
           .
           .
           PROCEDURE DIVISION.
               .
               .
               .
               IF W-CURSOR NOT = NULL
                  CALL "MysqlRetorna" USING W-CONEXAO   *> Handle para recuperar FCD-AREA
                                                W-CURSOR    *> Endereço estrutura do retorno (cursor)
                                                W-QRTM      *> Tamanho do buffer sendo retornado
                                                W-STATUS    *> Status de retorno
                                                W-RESULT.   *> Buffer contendo o resultado sendo retornado. Ter cuidado no programa
                  MOVE  W-RESULT TO WS-REG              *> Move o resultado para uma estrututa
                     .
                     .
                     .
        

  • MysqlLiberaCursor

    Libera o cursor criado pelo MysqlComando, liberando recursos alocados, e principalmente libera memória .

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "MysqlLiberaCursor" USING W-CONEXAO *> Handle para recuperar FCD-AREA W-CURSOR. *> Endereço estrutura do retorno (cursor)

    Ex.: Vide programa demo

           WORKING-STORAGE SECTION.
           01  W-CONEXAO USAGE POINTER.
           01  W-CURSOR  USAGE POINTER.
           .
           .
           .
           PROCEDURE DIVISION.
               .
               .
               .
               CALL "MysqlLiberaCursor" USING W-CONEXAO
                                              W-CURSOR. *> Handle para encontrar a FCD-AREA desta conexão
                     .
                     .
                     .
        

  • MysqlDesConecta

    Libera a conexão estabelecida pelo MysqlConecta, liberando recursos alocados, e principalmente libera memória .

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "MysqlDesConecta" USING W-CONEXAO *> Handle para recuperar FCD-AREA W-CURSOR *> Endereço estrutura do retorno (cursor) W-STATUS *> Status de retorno do comando

    Ex.: Vide programa demo

           WORKING-STORAGE SECTION.
           01  W-CONEXAO USAGE POINTER.
           01  W-CURSOR  USAGE POINTER.
           01  W-STATUS  PIC X(02)
           .
           .
           .
           PROCEDURE DIVISION.
               .
               .
               .
               CALL "MysqlDesConecta" USING W-CONEXAO
                                              W-CURSOR  *> Handle para encontrar a FCD-AREA desta conexão
                                              W-STATUS.
                     .
                     .
                     .
        

  • MysqlQueryFCD

    Executa um comando MYSQL usando a conexão e parametros de um determinado arquivo.
    Neste caso é necessário tornar visivel ao programa a area de FCD do arquivo desejado, para tal inclua, "$set fcdreg" antes do SELECT:

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "MysqlQueryFCD" USING CADASTRO-FCD *> Passa area de parametros do arquivo "CADASTRO" W-COMANDO *> Comando SQL a ser executado W-HANDLE. *> Caso comando SQL retporne resultado, o endereço para

    Ex.:
    
          $set fcdreg
    
               SELECT CADASTRO ASSIGN TO DYNAMIC W-LABEL
                       ORGANIZATION IS INDEXED
                       ACCESS MODE  IS DYNAMIC
                       FILE STATUS  IS ESTADO
                       RECORD KEY   IS CD-KEY.
    
    .
    .
    .
           WORKING-STORAGE SECTION.
           77  W-LABEL   PIC X(128) VALUE
            Z"@127.0.0.1@3306@root@@imed@cadastro".
           77  W-COMANDO    PIC X(64000).
           77  W-QRTM       PIC 9(09) COMP-5.
    
    .
    .
    .
           01  W-HANDLE           USAGE POINTER.
    .
    .
    .
           LINKAGE SECTION.
    
           01  CADASTRO-FCD.
    
               COPY XFHFCD.CPY.    *> Estrutura usada pelo COBOL para fazer todos acessos a arquivos
    .
    .
    .
    . 
    
               OPEN I-O CADASTRO.
    
          *> Ira recuperar a area de FCD do arquivo aberto logo acima.
          *> Posiciona a estrutura no endereço fornecido acima, com isso o programa passa a ter acesso a
          *> todas informaçõs necessários para o Cobol acessar o arquivo.
    
               SET   ADDRESS OF CADASTRO-FCD TO ADDRESS OF fh--fcd
                                                OF CADASTRO.
    
    .
    .
    .
    
          *> Possibilita a leitura de registros gravados mas ainda não commitados.
    
               MOVE  1            TO W-QRTM.
               STRING "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"
                   DELIMITED BY SIZE INTO W-COMANDO WITH POINTER W-QRTM.
    
               CALL "MysqlQueryFCD"                     *> Executa MysqlQuery na conexão e usando a estrutura
                                                        *> de um arquivo préviamente aberto
                                    USING CADASTRO-FCD  *> Passa area de parametros do arquivo "CADASTRO"
                                          W-COMANDO     *> Comando SQL a ser executado
                                          W-HANDLE.     *> Caso comando SQL retporne resultado, o endereço para
    .
    .
    .
    
               CLOSE CADASTRO.
    
       
    No exemplo ascima, ao fechar o arquivo via "CLOSE", não há mais necessidade de encerrar conexão nem cursor, o que é feito pelo próprio comando CLOSE.

  • MysqlRetResult

    Retorna o resultado de um comando MysqlComando.
    São retornados os campos (colunas) resultantes do comando enviado ao Mysql, separados por um separador informado em tempo de execução.
    Esta rotina tem a vantagem sobre a rotina RetResult uma vez que possibilita manipular diversas solicitações ao MysqlComando de forma independente, uma vez que é pssível se referenciar ao CURSOR de cada um, mantendo ativa cada pesquisa.
    Pode ser informado um separador como "
    ", "" ou apenas "|", não esquecendo de que é terminado por x"00", incluir o digito terminador no tamanho informado.

    Compatibilidade. Sem efeito quando acessando arquivo MF tradicional, simplesmente sera ignorado.

    Syntax

    CALL "MysqlRetResult" USING W-CONEXAO *> Pointer retornado pelo comando MysqlConecta W-CURSOR *> Endereço estrutura onde esta cursor retornado *> pelo comando MysqlComando W-QRTM *> Tamanho do buffer sendo retornado W-STR *> Divisor do campo, terminado em X"00" W-TAM *> Tamanho do divisor W-STA *> Status de retorno W-REG. *> Buffer contendo o resultado sendo retornado. Ter cuidado no programa *> chamador para reservar espaço suficiente, para caber o retornoUSING W-CONEXAO *> Handle para recuperar FCD-AREA


  • MudaPaginacao

    Possibilita a manutenção de forma dinâmica do numero de registros usados para paginar acessos de leitura sequencial. Default é 1024 registros, o numero ideal é determinado pela capacidade tanto do servidor, conexão e terminal, o número minimo é de 50 registros.
    Para processos de leitura envolvendo inclusão, atualização e exclusão, é recomendado não usar paginação, em função de a leitura se basear na posção relativa do registro em cada chamada ao SELECT, e excluindo ou incluindo registros pode alterar a posição relativa do registro a ser usado.
    Ex.: Num acesso onde a página esta em 1024, e se deseja acessar mais de 1024 registros, ao se excluir um registro classificado entra a posição 1 e 1024, fara com que ao acessar a segunda página o registro 1025 não seja mais considerado, pois passara a ocupar a posição 1024, que foi montado na primeira página. Para evitar este tipo de problema use o seguinte comando:
           77  W-QRTM       PIC 9(09) COMP-5.
               .
               .
               .
    
               MOVE  99999        TO W-QRTM.
               CALL "MudaPaginacao" USING W-QRTM.
    
    Fara com que a rotina não mais adote a paginação a partir dos prósimos START.


  • Programa demo acesso direto ao Mysql.


  • Dicas:

    Abaixo vamos relacionar algumas dicas, de como se obter melhores resultados, mas que antes de serem adotadas recomendamos estudo mais aprofundado quanto as consequencias de suas implementações.

    Procure não usar nome de campo muito extenso, o espaço ocupado pelos nomes é compartilhado na string enviada ao Mysql, que além de trafegar na rede, tem uma limitação de 64000 posições.

    Tratamento de Erro:

    Todo erro não tratado pela rotina gera um registro no log "LOGIMED.LOG", onde fica registrado o que se tentou fazer e o motivo informado pelo LIBMYSQL, na tentativa de facilitar a correção do mesmo.

    Comandos úteis.

    • CHECK table nomedatabela; Verifica a integridade da tabela.
    • REPAIR table nomedatabela; Repara caso esteja danificada.

    Desempenho.

    Apesar da necessidade de que todas as chaves definidas no SELECT do COBOL estarem correspondentemente definidas na Tabela do MYSQL, o fato de termos mais chaves definidas nas tabelas do que no SELECT, não interfere na compatibilidade operacional do sistema. Neste caso, poderão ser definidas novas chaves sem que as mesmas estejam no SELECT do arquivo, desde que estejam depois da ultima chave definida no SELECT.

    Dependendo da necessidade de acesso a uma tabela usando determinado campo (coluna), é recomendável inclui-lo como chave, tornando as pesquisas, onde houver filtragem por este campo, muito mais eficientes e rápidas.

    A rotina "MontaOrder" tem se mostrado eficiente em pesquizas onde não ha necessidade de classificação do resultado, principalmente em rotinas que usam o SORT para classificar os registros lidos. Neste caso, antes de chamar a rotina, inicialize W-ORDER com Low-values.

    Valem as mesmas regras para tratamento do desempenho das aplicadas no Mysql, mesmo que acessadas via comandos do COBOL, uma vez que internamente todo acesso é feito via banco de dados.

    Funcionalidade.

    As rotinas aqui apresentadas foram desenvolvidas de tal forma que obtenham o mesmo resultado, caso passando ao Servidor Mysql. Para debugar o que esta sendo enviado para o Servidor, use a rotina ";SalvaCmd", que tem como finalidade deixar registrado o comando passado ao Servidor Mysql no arquivo LogImd.log.

    Observações.

    Sempre que encontrar um erro, o mesmo será registrafo no arquivo LOGIMED.LOG, facilitando localizar a causa do erro.

    A rotina EXTMYSQL faz validação dos campos não numéricos zerando sempre que encontrar valores fora do RANGE previamente estabelecido para o campo. Como em muitos caso de converção de dados do MF para o MYSQL, foram encontrados sugeuira, e o banco de dados não aceita tais situações, a rotina passou a tratar estes casos evitando desta forma interrupção sumária da execução

    Limitações

    Vale todas limitações do banco de dados, no caso o o Mysql.

    Bloqueio de registro é feito por tempo determinado, como não encontramos uma técnica padrão fornecida pelo banco de dados, o bloqueio de registro é feito por uma rotina desenvolvida por nós, o que mais se aproximou da forma com que tradicionalmente é feita pelo COBOL.

    Tamanho do nome do campo na tabela não pode ser maior que 64 posições, o mesmo ocorre com o nome da chave.

    Tamanho máximo da string de comunicaçãoo com o Mysql é de 64000 posições, compartilhado com o comando, nome da variável, e conteúdo da variável.

    Caracteres especiais ou sugeira nos Campos CHAR, VARCHAR e BLOB tratam caracteres especiais com tamanho multiplicado por 3. Ex. campo contendo X"01", trafegara ocupando 3 posições na STRING de comando.

    READ NEXT, READ PREVIOUS em sequencia. Da forma com que o SQL trata leitura de registros, é desaconselhavel o uso de comando READ ARQ NEXT RECORS com READ ARQ PREVIOUS, ou contrário.

    Ex. Um START NOT LESS, no Mysql o servidor vai ler todos registros com chave = ou maior, para depois liberar o primeiro READ, e se logo após vc der um READ PREVIOUS, tudo denovo ao inverso.

    Por outro lado, voce pode se valer do recurso "LIKE %STRING%" que é muito eficiente.


    Franco Stringari Pudler, email franco@imediata.com.br