Clipper On Line • Ver Tópico - Casos do LetoDBf

Casos do LetoDBf

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

Casos do LetoDBf

Mensagempor Itamar M. Lins Jr. » 09 Mar 2018 16:47

Ola!
https://groups.google.com/forum/#!topic/harbour-users/GzUFxNSDTsE
Pelo que estou entendendo o cara trocou um P4 com 2Mb e placa de rede de 10Mb por um servidor nas nuvens, mas ele foi enganado.
Old setting: pentium 4 with 2gb memory, windows 7, 10 mb/s upload internet connection
New setting: Virtual cloud server, 4gb memory, dual processor, 270! mb/s upload internet connection
Same software, same dbf's and same letodbf.

Levava 26 segundos para abrir no velho P4 e aumentou para 205 segundos na nova máquina virtual no "CÉU" mas a performance caiu por terra! kkkk
Time spent on the old setting to open and traverse 7 dbf's: 26 secs
Time spent on the new setting to open and traverse same 7 dbf's: 205 secs
The only change between the 2 situations is the real pc for a virtual pc with higher performance.


A decisão final parece que é essa ai de baixo. Quando eu digo que Linux é Linux!
Next step in my job is to learn linux in order to install a linux server w/samba, letodbf and dbf´s, and throw the f****ing windows through the window.
Thanks a lot

Muita gente usando DBF´s, e vamos continuar usando por um bom tempo graças ao Letodb[f]

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3555
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 114 vezes
Mens.Curtidas: 176 vezes

Casos do LetoDBf

Mensagempor asimoes » 30 Mar 2018 11:20

Itamar,

Voltei pro LetoDb, agora LetoDbf, fui direto ao ponto, uma situação que me fez "abandonar" por um tempo até que a solução fosse dada.
No exemplo abaixo mesmo fazendo ordlistclear estava "afetando" o indice da tabela quando usado o temporary additive
E é significativamente mais rápido que o hbnetio, não sei o que aconteceu com a última versão de dezembro/2017 ( 3.4 fork) que está caindo a conexão.
Enfim, já finalizei uma versão usando o LetoDbf, gostei muito do recurso udf, apanhei um pouco pra entender um erro que estava acontecendo em um begin sequence (não entendi), derrubava o letodb

BEGIN SEQUENCE WITH { | e | break( e ) } derrubara o letodb usando assim
BEGIN SEQUENCE assim funcionou sem erro ???

Embora tenho pego uma cola de uma outra função do letoudf.prg

      USE ( cServidorDB + "test1" ) New
      TEST1->(OrdListClear())
     
      FOR I:=1 TO test1->(OrdCount())
         ? test1->(OrdName(i))
         ? test1->(OrdKey(i))
         ? test1->(OrdFor(i))
          inkey(0)
      NEXT     
     
      INDEX ON DESCRI TAG IND02 TEMPORARY ADDITIVE
      COMMIT
     
      FOR I:=1 TO test1->(OrdCount())
         ? test1->(OrdName(i))
         ? test1->(OrdKey(i))
         ? test1->(OrdFor(i))
          inkey(0)
      NEXT
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4126
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 288 vezes
Mens.Curtidas: 206 vezes

Casos do LetoDBf

Mensagempor JoséQuintas » 30 Mar 2018 13:03

O LetoDbf é multitread?
Em multithread seria impossível (ou quase) derrubar o servidor, porque cada thread é um processo em separado.

Nota: não sei se uma rotina de erros não preparada poderia derrubar o servidor.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11045
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 8 vezes
Mens.Curtidas: 699 vezes

Casos do LetoDBf

Mensagempor asimoes » 30 Mar 2018 13:05

É Quintas, mas derrubou.
Faça o teste!

O hrb é carregado na inicialização do letodb, vira uma função para ser usada pela aplicação cliente, fiz uma função que faz exatamente o que uma outra
que já existe faz: UDF_Trans

BEGIN SEQUENCE WITH { | e | break( e ) }

Criei a Minha UDF_Backup

BEGIN SEQUENCE WITH { | e | break( e ) } derruba o letodb

BEGIN SEQUENCE funciona sem erro

Onde está o problema ?????

O fonte é letoudf.prg fica na pasta tests
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4126
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 288 vezes
Mens.Curtidas: 206 vezes

Casos do LetoDBf

Mensagempor JoséQuintas » 30 Mar 2018 13:14

Sei lá.... talvez só GTWVG pra dar certo kkkkk

Rotina com erro forçado, só derruba a janela com erro.

#include "hbgtinfo.ch"
#include "inkey.ch"

FUNCTION Main()

   hb_ThreadStart( { || tela1() } )
   hb_ThreadStart( { || tela2() } )
   hb_ThreadStart( { || tela3() } )
   hb_ThreadWaitForAll()

   RETURN NIL

FUNCTION Tela1()

   LOCAL mTela1 := Space(10), GetList := {}

   hb_gtReload( "WVG" )
   SetMode( 35, 85 )
   CLS
   Statusbar2()
   @ 1, 0 SAY "Tela1" GET mTela1
   READ

   ? "A" / 2

   RETURN NIL

FUNCTION Tela2()

   LOCAL mTela2 := Space(10), GetList := {}

   hb_gtReload( "WVG" )
   SetMode( 30, 80 )
   CLS
   Statusbar2()
   @ 1, 0 SAY "Tela2" GET mTela2
   READ

   ? "A" / 2

   RETURN NIL

FUNCTION Tela3()

   LOCAL mTela3 := Space(10), GetList := {}

   hb_gtReload( "WVG" )
   SetMode( 25, 75 )
   CLS
   Statusbar2()
   @ 1, 0 SAY "Tela3" GET mTela3
   READ

   ? "A" / 2

   RETURN NIL

STATIC FUNCTION Statusbar2()

   LOCAL oThisButton

   oThisButton := wvgTstText():New()
   oThisButton:cText := "Teste usando tstText"
   oThisButton:Create( ,, { -MaxRow(), 0 }, { -1, -(MaxCol()+1) } )

   RETURN NIL


Ia postar o EXE, mas surgiu outro problema, infelizmente relacionado ao Harbour.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11045
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 8 vezes
Mens.Curtidas: 699 vezes

Casos do LetoDBf

Mensagempor asimoes » 30 Mar 2018 13:15

Função que já existe no fonte letoudf.prg

Estamos falando de funções de servidor de banco de dados (letodbf)

Provavelmente se for usar essa função UDF_Trans vai dar o mesmo erro

FUNCTION UDF_Trans( cTo )
/*
* UDF_Trans copy all records from current area to area with <cTo> client alias
   with conversion between numeric and character fields.
*/
   LOCAL cArea := Alias()
   LOCAL cAliasTo := leto_Alias( cTo )
   LOCAL lSetDel
   LOCAL lRes := .T., oError

   dbSelectArea( cArea )
   IF ! Empty( cAliasTo )
      lSetDel := Set( _SET_DELETED, .f. )
      BEGIN SEQUENCE WITH { | e | break( e ) }
         OrdSetFocus( 0 )
         GO TOP
         WHILE ! eof()
            UDF_TransRec( cAliasTo )
            SKIP
         ENDDO
         (cAliasTo)->(dbCommit())
      RECOVER
         WUsLog( "UDF_Trans error: " + cArea + "-->" + cTo + " " +;
                oError:description + if( ! Empty( oError:operation ), ":" + oError:operation, "" ) +;
                " recno " + LTrim(Str(RecNo())))
         lRes := .F.
      END SEQUENCE
      Set( _SET_DELETED, lSetDel )
   ENDIF
   RETURN lRes


A minha função:
FUNCTION UDF_Backup( cArquivo, cPasta, cRotina ) 
LOCAL lErro:=.F.
   
   hb_Default( @cRotina, "" )
   hb_Default( @cArquivo, "" )
   hb_Default( @cPasta, "C:\BACKUP" + [\] + ;
                        cRotina + "_DB_ " + ;
                        hb_DTOC( Date(), "YYYY_MM_DD") + ;
                        "-" + Left( StrTran( Time(), ":" ), 4 ) )
   //WUsLog("1")                     
   BEGIN SEQUENCE //WITH { | e | break( e ) } // se descomentar da erro ?????
      //WUsLog(cPasta)
      IF ! hb_DirExists( cPasta )
         WUsLog("2")
         IF hb_DirCreate( cPasta ) != 0
            //WUsLog("3")
            cPasta := "C:\BACKUP" + [\] + ;
                      cRotina + "_DB_" + ;
                      StrTran( hb_TTOC( hb_DateTime(), 'YYYY_MM_DD', 'HHMM' ), ' ', '_' )
            IF hb_DirCreate( cPasta ) != 0
               BREAK
            ENDIF
         ENDIF
      ENDIF
      Copy_Arq( "DB" + [\] + cArquivo, cPasta, .T. )
      //WUsLog("3")
   RECOVER
      //WUsLog( "UDF_error: " + " " + oError:description + if( ! Empty( oError:operation ), ":" + oError:operation, "" ) )
      lErro:=.T.
   END SEQUENCE
   
RETURN lErro
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4126
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 288 vezes
Mens.Curtidas: 206 vezes

Casos do LetoDBf

Mensagempor JoséQuintas » 30 Mar 2018 13:55

Veja um exemplo forçando erro, e usando GTWVG.
Vão ser abertas 3 janelas com GET, após ENTER no get dá erro.
Fechar uma janela não fecha a outra, porque são threads diferentes.

Mas é lógico, dependendo da rotina, é melhor derrubar o servidor propositalmente.
Se tem a ver com gerenciamento de arquivos/informações, sinal de que tudo pode estar com problema.

Nota:
Se for compilado como console, não vai ter multithread, e qualquer erro derruba.
O mesmo se não compilar usando -mt.
A Main() é oculta, com certeza se fosse visível e fechasse Main(), fecharia TUDO de uma vez.
Não sei se gerou manualmente o letodbf.

test.zip
(477.56 KiB) Baixado 50 vezes
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 11045
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 8 vezes
Mens.Curtidas: 699 vezes

Casos do LetoDBf

Mensagempor Itamar M. Lins Jr. » 05 Abr 2018 11:19

Ola!
Use o git do letodbf, para reportar esse BO.
Ele responde rápido.
Ou use o harbour-user do google mesmo.
Não estou com tempo, nem para reler essas msgs, não entendi nada, mas fica a dica de conversar direto com o Elch.

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 3555
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 114 vezes
Mens.Curtidas: 176 vezes

Casos do LetoDBf

Mensagempor asimoes » 05 Abr 2018 11:50

Itamar,

To igual a você sem tempo, como eu informei na minha função só estou usando "BEGIN SEQUENCE" que tá funcionando assim.
Assim "BEGIN SEQUENCE WITH { | e | break( e ) } " o letodb aborta. embora letoudf.prg tenha uma função exemplo que usa assim.
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4126
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 288 vezes
Mens.Curtidas: 206 vezes




Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro