Página 3 de 4

Tabela temporária em memória

Enviado: 15 Fev 2016 13:02
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á!

Tabela temporária em memória

Enviado: 15 Fev 2016 13:06
por rmlazzari
Mas que o arquivo está no disco e não na RAM... ah, isso está, sim.

Fui...

Tabela temporária em memória

Enviado: 15 Fev 2016 13:37
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.

Tabela temporária em memória

Enviado: 15 Fev 2016 13:50
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

Tabela temporária em memória

Enviado: 15 Fev 2016 13:56
por asimoes
Quintas,

Neste seu teste tá faltando REQUEST HB_MEMIO e incluir HBMEMIO.HBC

Tabela temporária em memória

Enviado: 15 Fev 2016 14:13
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.

Tabela temporária em memória

Enviado: 15 Fev 2016 14:47
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.

Tabela temporária em memória

Enviado: 15 Fev 2016 22:51
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.

Tabela temporária em memória

Enviado: 21 Jul 2016 16:49
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

Tabela temporária em memória

Enviado: 21 Jul 2016 16:59
por asimoes
Rubens,

A criação é na máquina que executa o programa e não no servidor.

Tabela temporária em memória

Enviado: 21 Jul 2016 17:53
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

Tabela temporária em memória

Enviado: 21 Jul 2016 18:37
por asimoes
Rubens,

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

If Select("tabtemp") != 0

Endif

Tabela temporária em memória

Enviado: 21 Jul 2016 18:40
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

Tabela temporária em memória

Enviado: 22 Jul 2016 09:52
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

Tabela temporária em memória

Enviado: 22 Jul 2016 17:41
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)