FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour CreateIndex does not erase temporary files
Posts: 107
Joined: Tue Sep 15, 2009 07:52 AM
CreateIndex does not erase temporary files
Posted: Wed Feb 13, 2019 08:07 PM
I have the following problem when using CreateIndex to create temporary indexes:

Code (fw): Select all Collapse
//1st function

       USE Clients Alias clients SHARED NEW
       DATABASE oDbfC
       //temporary index CreateIndex( [cFile], cTag, cKey, [lUnique], [lDescend], [lMemory] )
       
       oDbfC:CreateIndex( nil, "Clients", "Client->Name" , nil, nil, .T.)
       oDbfH:LOAD()
       oDbfH:GoTop()
       
       BrowseTable( oDbfC )
       oDbfC:CLOSE()


// 2nd function:

  SELECT animals
  DATABASE oDbfG

   //create temporary index CreateIndex( [cFile], cTag, cKey, [lUnique], [lDescend], [lMemory] )
  oDbfG:CreateIndex( nil,"Main",    "animals->number"                                            , nil, nil,.T.)    //error here since tmp.cdx exist
  oDbfG:CreateIndex( nil,"Name",    "Left(PADR(ALLTRIM(animals->Name),25),25)"  , nil, nil,.T.)
  oDbfG:CreateIndex( nil,"Color",     "Left(PADR(ALLTRIM(animals->Color),25),25)" , nil, nil,.T.)
  oDbfG:CreateIndex( nil,"Brand",    "Left(PADR(ALLTRIM(animals->Brand),3),3)"    , nil, nil,.T.)
  oDbfG:CreateIndex( nil,"Born",      "DTOS(animals->Born)"                                   , nil, nil,.T.)
  oDbfG:CreateIndex( nil,"BornNum", "DTOS(animals->Born) + animals->number"     , nil, nil,.T.)
...


Since the temporary index file is not erased at the end of the process, I forced it by adding the following code to erase it manually:

Code (fw): Select all Collapse
//1st function

       USE Clients Alias clients SHARED NEW
       DATABASE oDbfC
       //temporary index CreateIndex( [cFile], cTag, cKey, [lUnique], [lDescend], [lMemory] )
       if File( GetcurDir()+"\tmp.cdx" )  //should have been done by Fivewin since this is a temp index
          FErase( GetcurDir()+"\tmp.cdx" )
       endif
       oDbfC:CreateIndex( nil, "Clients", "Client->Name" , nil, nil, .T.)
       oDbfH:LOAD()
       oDbfH:GoTop()
       
       BrowseTable( oDbfC )

       oDbfC:CLOSE()
       oDbfC:End() //this was added to see if the temporary index file was erased (did not work)


// 2nd program:

  SELECT animals
  DATABASE oDbfG

   //create temporary index CreateIndex( [cFile], cTag, cKey, [lUnique], [lDescend], [lMemory] )
  if File( GetcurDir()+"\tmp.cdx" )
     FErase( GetcurDir()+"\tmp.cdx" )
  endif
  oDbfG:CreateIndex( nil,"Main",    "animals->number"                                            , nil, nil,.T.)    //No error since I erased tmp.cdx 
  oDbfG:CreateIndex( nil,"Name",    "Left(PADR(ALLTRIM(animals->Name),25),25)"  , nil, nil,.T.)
  oDbfG:CreateIndex( nil,"Color",     "Left(PADR(ALLTRIM(animals->Color),25),25)" , nil, nil,.T.)
  oDbfG:CreateIndex( nil,"Brand",    "Left(PADR(ALLTRIM(animals->Brand),3),3)"    , nil, nil,.T.)
  oDbfG:CreateIndex( nil,"Born",      "DTOS(animals->Born)"                                   , nil, nil,.T.)
  oDbfG:CreateIndex( nil,"BornNum", "DTOS(animals->Born) + animals->number"     , nil, nil,.T.)

...


Isn't FW supposed to erase the temporary index file by itself?

Emiliano Llano Díaz
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: CreateIndex does not erase temporary files
Posted: Thu Feb 14, 2019 01:38 AM
Temporary (memory) indexes are automatically erased by the system. We need not manually delete them.

The real problem here is that there is a bug in the method CreateIndex(...) of TDatabase. Though you wanted to create Memory Index, the method is creating it is a normal index on the disk due to this bug.

Please apply this fix to your copy of the database.prg.
Please locate this line of code in the METHOD td_CreateIndex( ... )
Code (fw): Select all Collapse
OrdCondSet(,,,,,,0,,,,lDescend,lAdditive,,,,,lMemory,,)


Please replace this line with the correct code as below:
Code (fw): Select all Collapse
OrdCondSet(,,,,,,0,,,,lDescend,nil,lAdditive,,,,,lMemory,,)


With this fix, the index is created in memory and not on disk. There will be no need to manually erase those index files.

This bug is fixed at our end in version FWH 1902.
Regards



G. N. Rao.

Hyderabad, India

Continue the discussion