Casos do LetoDBf

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Casos do LetoDBf

Mensagem por Itamar M. Lins Jr. »

Ola!
https://groups.google.com/forum/#!topic ... zUFxNSDTsE
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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Casos do LetoDBf

Mensagem 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

Código: Selecionar todos

      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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Casos do LetoDBf

Mensagem 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.
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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Casos do LetoDBf

Mensagem 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
►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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Casos do LetoDBf

Mensagem por JoséQuintas »

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

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

Código: Selecionar todos

#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.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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Casos do LetoDBf

Mensagem 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

Código: Selecionar todos

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:

Código: Selecionar todos

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Casos do LetoDBf

Mensagem 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 247 vezes
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
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Casos do LetoDBf

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Casos do LetoDBf

Mensagem 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.
►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)
Responder