Clipper On Line • Ver Tópico - Casos do LetoDBf
Página 1 de 1

Casos do LetoDBf

MensagemEnviado: 09 Mar 2018 16:47
por Itamar M. Lins Jr.
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.

Casos do LetoDBf

MensagemEnviado: 30 Mar 2018 11:20
por asimoes
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

Casos do LetoDBf

MensagemEnviado: 30 Mar 2018 13:03
por JoséQuintas
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.

Casos do LetoDBf

MensagemEnviado: 30 Mar 2018 13:05
por asimoes
É 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

Casos do LetoDBf

MensagemEnviado: 30 Mar 2018 13:14
por JoséQuintas
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.

Casos do LetoDBf

MensagemEnviado: 30 Mar 2018 13:15
por asimoes
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

Casos do LetoDBf

MensagemEnviado: 30 Mar 2018 13:55
por JoséQuintas
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 112 vezes

Casos do LetoDBf

MensagemEnviado: 05 Abr 2018 11:19
por Itamar M. Lins Jr.
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.

Casos do LetoDBf

MensagemEnviado: 05 Abr 2018 11:50
por asimoes
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.