Usar postgres

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

escreveassado
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 12 Set 2024 18:26
Localização: SÃO PAULO/SP

Usar postgres

Mensagem por escreveassado »

Boa noite Pessoal,

Eu uso o Harbour 3.2 com DBF ainda.
Agora estamos migrando o banco para postgres.
Preciso mudar a versão para ter mais compatibilidade, mas não sei onde e qual mudar.
Alguém pode me dar uma dica. Pode ser gráfico também.
O Importante eh que tenham as libs para trabalhar com o dataBase.

Obrigado !
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usar postgres

Mensagem por JoséQuintas »

Não existe uma resposta direta pra isso.
Saiu de DBF não existe um uso padrão, há diversas possibilidades.
E entrou em ambiente gráfico, aí multiplicou tudo de vez.

Não sei se consegue ser mais específico nisso.
Por exemplo, se espera manter fonte ou refazer tudo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Usar postgres

Mensagem por clodoaldomonteiro »

Uso no xHarbou no ambiente Windows, criando um objeto ADO para manipular DB com SQL, segue abaixo meus códigos de conexão (com ajuda do Quintas).

Código: Selecionar todos

#define AD_USE_CLIENT 3
#include "Gas.ch"
#include "Fileio.ch"
#include "ADO.CH"     // inicializa constantes manifestas

/////////////////////////////////////////////////////////////////////////////
FUNCTION PostgreSQLConnection( cServer, cUser, cPassword, cDatabase, cPort )
   LOCAL cnConnection

   Default( @cPort, '5432')

   If InternetCheca()
   
      cnConnection := CreateObject( "ADODB.Connection" )

      cnConnection:ConnectionString := "Driver={PostgreSQL ODBC Driver(UNICODE)}"+;
       ";Server="    + cServer +;
       ";Port="      + cPort+;
       ";Database="  + cDatabase +;
       ";Uid="       + cUser +;
       ";Pwd="       + cPassword

      cnConnection:CursorLocation    := AD_USE_CLIENT
      cnConnection:CommandTimeOut    := 600 // seconds
      cnConnection:ConnectionTimeOut := 600 // seconds

      Try

         cnConnection:open()

      CATCH oError

         cnConnection := CreateObject( "ADODB.Connection" )
         cnConnection:ConnectionString := "Driver={PostgreSQL Unicode}"+;
          ";Server="    + cServer +;
          ";Port="      + cPort+;
          ";Database="  + cDatabase +;
          ";Uid="       + cUser +;
          ";Pwd="       + cPassword

         cnConnection:CursorLocation    := AD_USE_CLIENT
         cnConnection:CommandTimeOut    := 600 // seconds
         cnConnection:ConnectionTimeOut := 600 // seconds

         Try
            cnConnection:open()
         CATCH oError

            msg := 'ADODB: 905'+HB_Eol()
            msg += 'Aviso..: Não consegui Abrir com o Banco de dados PostgreSQL.'+HB_Eol()
            msg += '- Verifique em Fontes ODBC se existr os Driver "PostgeSQL Unicode" ou "PostGreSQL ODBC Driver(UNICODE)".'+HB_Eol()
            msg += '- Acesse a central de downloads (central.simplesinformatica.com) e baixe na aba de "Utilitários" o Driver de Conexão e instale-o para completar esta ação.'+HB_Eol()
            msg += HB_Eol()+cl_getError(oError, .t., cnConnection)

            MsgAtencao ( msg )

            cnConnection := nil

         End
      End

   Endif

   RETURN cnConnection

   ////////////////////////////////////////////////////////////////////////////////
   //Abre a conexão
Function OpenConexaoPGSql()
   Local msg := '', r := .t., oError

   Begin Sequence

      If Type( 'oCn' ) <> 'O'

         oCN := PostgreSQLConnection( mServerDB, mDbUser, mSenhaPG, mDbName, mServerPort )

         If Ocn = Nil
            r := .f.
         Endif

      Else

         If oCn:state <> adStateOpen

            oCN := PostgreSQLConnection( mServerDB, mDbUser, mSenhaPG, mDbName, mServerPort )

            If Ocn = Nil
               r := .f.
            Endif

         EndIf

      EndIf

      If Valtype(oCn) = 'O'
         GetActiveState()
      EndIf

   End Sequence

   Return r


Function GetStatusConexaoDB()
   Local r := 'OFF'

   If Type( 'oCn' ) = 'O'
      If oCn:state = adStateOpen
         r := 'ON'
      EndIf
   Else
      r := 'NUL'
   EndIf

   Return r


   //Busca dados dos IPs
   //https://raphaleao.medium.com/monitorando-conex%C3%B5es-no-postgresql-com-pg-stat-activity-daf4ae171d47
Procedure GetActiveState()
   //Local mExecute, oRs, msg, mRet, i
   Local mJson, mHash := {=>}, x

   aActiveState := {}
   mJson := SendGetPing( mApiUtilitarioAuthorization )
   hb_jsonDecode(mJson, @mHash)

   If mHash <> nil

      If Len( mHash ) > 0
         AAdd(aActiveState, {;
          HGet(mHash, 'remote_ip'),;
          HGet(mHash, 'timestamp');
          })
      Else
         AAdd(aActiveState, {;
          '',;
          '';
          })
      Endif

   Else
      AAdd(aActiveState, {;
       '',;
       '';
       })
   Endif
   /*
   Begin Sequence
      aActiveState := {}

      //mExecute := "SELECT * FROM pg_stat_activity;"
      mExecute := "WITH current_connection AS ("
      mExecute += "  SELECT pg_backend_pid() AS pid"
      mExecute += ") "
      mExecute += "SELECT"
      mExecute += "  a.pid,"
      mExecute += "  a.client_addr,"
      mExecute += "  a.state,"
      mExecute += "  a.query_start "
      mExecute += "FROM"
      mExecute += "  pg_stat_activity a "
      mExecute += "JOIN"
      mExecute += "  current_connection c ON a.pid = c.pid;"

      Try
         oRs := oCn:Execute( mExecute )
      CATCH oError
         msg := 'ADODB: 007' + CRLF
         msg += 'Aviso..: Não consegui a espressão SQL para verificar os IPs.' + CRLF
         msg += CRLF + cl_getError(oError, .t., oCn)
         msgError ( msg, .t. )
         mRet := .f.
         Break
      End

      oRs:MoveFirst()

      For i := 1 To oRs:RecordCount()
         If !Empty( oRs:Fields("query_start"):Value)

            AAdd(aActiveState, {;
             oRs:Fields("pid"):Value,;          //Número do processo que está em execução
             oRs:Fields("query_start"):Value,;  //Data e hora de início da execução do processo.
             oRs:Fields("client_addr"):Value,;  //Endereço ip de onde está sendo solicitado o comando.
             oRs:Fields("state"):Value;         //Status do comando
             })

         EndIf

         oRs:MoveNext()

      Next

      aSort(aActiveState,,, { |x, y| x[2] > y[2]} )

      If oRs:state = adStateOpen
         oRs:Close()
      EndIf

   End Sequence
   */

   Return

PS. Vá mudando conforme sua necessidade, tipo, se vai abrir um banco de dados ou dois, se vai permanecer com o mesmo banco aberto, essas coisas.
Abraços
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Responder