Tabela temporária em memória

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

Moderador: Moderadores

rmlazzari
Usuário Nível 2
Usuário Nível 2
Mensagens: 64
Registrado em: 09 Dez 2013 14:18
Localização: são paulo

Tabela temporária em memória

Mensagem por rmlazzari »

O recurso do Harbour é pra criar um arquivo temporário na memória.
Se está no disco, é arquivo temporário em disco, não é em memória.
Se fosse pra criar em disco, nem precisava existir o recurso, então algo está errado aí.
A única diferença é que se a gente criar arquivo normal, explicitamente no disco, quando chamar o programa de novo e tentar recriá-lo, vai dar pau, dizer que o arquivo já existe. Criando como stream, a dbcreate() apenas dá um zap... ou recria em cima, vai saber... Deve recriar em cima...

Mas o gozado foi descobrir que o termo "mem:" pode ser trocado, sem problema algum, rs...

Aguardo o retorno de vocês.
Xeretarei, asimoes.

Té já!
rmlazzari
Usuário Nível 2
Usuário Nível 2
Mensagens: 64
Registrado em: 09 Dez 2013 14:18
Localização: são paulo

Tabela temporária em memória

Mensagem por rmlazzari »

Mas que o arquivo está no disco e não na RAM... ah, isso está, sim.

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

Tabela temporária em memória

Mensagem por JoséQuintas »

Que tal isto:

Se isso é recurso do NTFS, o programa vai dar erro se usar FAT32 ou se o servidor não tiver esse recurso.
Se rodar em CD, o recurso de criar arquivo na memória também vai dar erro, por tentar gravar no CD.
Pen drive, também geralmente é FAT32.

E por aí vai.

Passou de temporário na memória, para sujeito a problemas.
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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tabela temporária em memória

Mensagem por JoséQuintas »

Testado no pen drive em fat32:
d:\cdrom\fontes\integra>H:

H:\>d:\temp\test

Error DBFNTX/1004 Create error: mem:test.dbf (OS Error 123)
Called from DBCREATE(0)
Called from MAIN(5)
H:\>

Código: Selecionar todos

      PROC main()
        LOCAL nI
        FIELD F1

        DBCREATE("mem:test", {{"F1", "N", 9, 0}},, .T., "memarea")
        FOR nI := 1 TO 1000
          DBAPPEND();  F1 := HB_RANDOM() * 1000000
        NEXT
        INDEX ON F1 TAG f1
        DBEVAL({|| QOUT(F1)})
        DBCLOSEAREA()
        // Inkey(0)
        // DBDROP("mem:test")  // Free memory resource
      RETURN
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

Tabela temporária em memória

Mensagem por asimoes »

Quintas,

Neste seu teste tá faltando REQUEST HB_MEMIO e incluir HBMEMIO.HBC
►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

Tabela temporária em memória

Mensagem por JoséQuintas »

Peguei o fonte no changelog.

Fazendo o que indicou, nenhum arquivo é criado em disco.
E funciona normal no pendrive.

Então, se aparece alguma coisa em disco, estão compilando errado.... rs

É preciso muito cuidado nisso, porque se fizer errado, como aconteceu nas postagens, nem dá pra perceber o erro.
Coindiciu com um recurso do Windows.

Curioso que foi você mesmo que iniciou o post, por estar gravando no disco... rs
Não gostei, muito perigoso.
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

Tabela temporária em memória

Mensagem por asimoes »

Quintas,

Usando o REQUEST HB_MEMIO e tendo o cuidado de informar o driver no dbcreate acredito que vai funcionar, agora se o arquivo gerado fica escondido em algum lugar não deu pra saber, pelo menos com o alternatestreamview não encontrei nada.
►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)
rmlazzari
Usuário Nível 2
Usuário Nível 2
Mensagens: 64
Registrado em: 09 Dez 2013 14:18
Localização: são paulo

Tabela temporária em memória

Mensagem por rmlazzari »

Copiei do "C:\hb32\contrib\hbmemio\tests\test.prg" que você indicou, asimoes...

Código: Selecionar todos

#require "hbmemio"
REQUEST HB_MEMIO
e agora parece funcionar. Não encontrei nenhum arquivo "stream" com aquele utilitário, o Alternate Stream View, e também não encontrei nenhum arquivo de zero bytes, como era aquele "mem...

Parece que REQUEST HB_MEMIO sozinho é que não funcionou, deu o erro que falei no começo:
.hbmk/win/mingw/sudoku.o:sudoku.c:(.data+0x4c8): undefined reference to `HB_FUN_HB_MEMIO'
collect2: ld returned 1 exit status
Tanto que, só para confirmar, se tirar o #require "hbmemio", o erro volta.

Mas voltando o #require... que o arquivo está "lá" (aonde é que não sei), está, sim...

Código: Selecionar todos

use mem:rollback alias rollback new
?header()
194

Vai ver está na RAM mesmo, ué... e sem a chamada a HB_MEMIO, quem cuida dessa parte do Harbour, prá não "deixar na mão", criou esse "mem" no disco em forma de stream.
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Tabela temporária em memória

Mensagem por rubens »

Na minha rotina de lançamento de compras eu uso um arquivo icomprast.dbf. Fica mais fácil para eu manuseiar os itens daquela compra específica, só no final é que eu gravo os itens no arquivo de itens de compras definitivo.
Já havia pesquisado sobre o arquivo em memoria e acho que dá pra encaixar meu icomprast.dbf nesse esquema.
A minha dúvida éh: Esse arquivo mem é criado na memória da máquina que o sistema está rodando ou no servidor? (Digo servidor para compartilhamento e não TS)
Porque se dois usuários entrarem na rotina ao mesmo tempo, vão trabalhar com o arquivo criado na memória da máquina? senão vai dar pau, porque o usuário A já está com o arquivo na memória aberto em modo exclusivo.

Sabem me dizer onde é criado o arquivo mem?

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Tabela temporária em memória

Mensagem por asimoes »

Rubens,

A criação é na máquina que executa o programa e não no servidor.
►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
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Tabela temporária em memória

Mensagem por rubens »

Asimoes...
Pelo que eu vi quando cria o arquivo ele já abre.. tentei abrir com o use e deu erro, daí fiz teste e segui o exemplo acima percebi que ele cria e abree o arquivo..
E tem função para saber se o arquivo existe ou só pelo teste do alias?
Tipo para testar o icomprast.dbf usa o file('icomprast.dbf') e para testar se existe um arquivo na memória? tentei file('mem:icomprast.dbf') e deu erro...

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Tabela temporária em memória

Mensagem por asimoes »

Rubens,

Você tem como testar se a tabela está criada usando

If Select("tabtemp") != 0

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

Tabela temporária em memória

Mensagem por asimoes »

Exemplo da pasta contrib/hbmemio/tests

Código: Selecionar todos

#require "hbmemio"

REQUEST HB_MEMIO

PROCEDURE Main()

   LOCAL tmp

   dbCreate( "mem:test", { { "F1", "N", 9, 0 } }, , .T., "memarea" )
   FOR tmp := 1 TO 1000
      dbAppend()
      FIELD->F1 := hb_randNum( 1000000 )
   NEXT
   INDEX ON FIELD->F1 TAG f1
   dbEval( {|| QOut( FIELD->F1 ) } )
   dbCloseArea()
   dbDrop( "mem:test" )  /* Free memory resource */

   RETURN
►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
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Tabela temporária em memória

Mensagem por rubens »

Obrigado aSimoes...

Sabe quais o argumentos da função dbDrop() ?

Eu Tô fazendo assim

Código: Selecionar todos

Function haver()
    ...
    cDbf := CriaDBFMem('IHT')
    ...
   dbCloseArea()
   dbDrop( cDbf )
Return nil

**********************************************************************************************************
FUNCTION CriaDBFMem(cAlias)  
	LOCAL cTela 	:= SaveScreen()  
	LOCAL GetList 	:= {}  
	LOCAL cDbf		:= ''
	LOCAL aStru		
	LOCAL cIndice	:= ''

	*----------------------------------------------------------------------------  
	If cAlias = 'IHT'
	
		cDbf 		:= 'mem:IHAVERT.DBF'
		cIndice 	:= 'mem:IHAVERT.CDX'
		
		// Verifica se o alias esta  aberto se tiver fecha e apaga o arquivo da memoria
		If Select('IHAV')>0
                       zap
		Else
	
		aStru :=	{;
				{"CODPRO_"	,"C",05,00},;
				{"NOMPRO_"	,"C",40,00},;
				{"QTDE_"		,"N",12,03},;
				{"UND_"		,"C",02,00}}
	
		DbCreate(cDbf, aStru,, .T., cAlias)		
		Index on codpro_ tag codpro to (cIndice)
		DbSetIndex(cIndice)
	EndIf  
	*----------------------------------------------------------------------------
  
RETURN cDbf
Onde eu coloco dbDrop( cDbf ) na linha 06 poderia colocar dbDrop( select() ) ou dbDrop( dbSelectArea()) ?

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Tabela temporária em memória

Mensagem por asimoes »

Rubens,

Quanto ao nome da tabela não é necessário a extensão .DBF

E quanto índice faça como no exemplo que eu postei sem o " to (cIndice) "

O parâmetro da Dbdrop é o nome da tabela ex.

cTabela:="mem:tabela"

DbDrop(cTabela)
►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