Página 1 de 1
Casos do LetoDBf
Enviado: 09 Mar 2018 16:47
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.
Casos do LetoDBf
Enviado: 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
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
Casos do LetoDBf
Enviado: 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
Enviado: 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
Enviado: 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.
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.
Casos do LetoDBf
Enviado: 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
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
Casos do LetoDBf
Enviado: 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.
Casos do LetoDBf
Enviado: 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
Enviado: 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.