home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 2 / ctrom_ii_b.zip / ctrom_ii_b / PROGRAM / FOXPRO / PRE307 / CHKNTX.PRE next >
Text File  |  1990-01-24  |  10KB  |  230 lines

  1. note Open and Close Databases and Indexes and Reindex if Necessary
  2. *chkntx
  3. *
  4.  
  5.  
  6.  
  7. * Open Files
  8. function opfile
  9.   parameters dfile,nfiles,ntxkey,sayso,force,fig
  10.   * dfile  - Database file name without extension (Character).
  11.   * nfiles - Array of index file names without extension.
  12.   * ntxkey - Array of index keys (optional).
  13.   * sayso  - Display error messages if true (optional - default = true).
  14.   * force  - Force reindexing if true (optional - default = false).
  15.   * nfiles and ntxkey must be same length array.
  16.  
  17.   keyspassed = (type([ntxkey]) = 'A')            && Was key array passed ?
  18.  
  19.   if type([sayso]) <> 'L'                        && Set optional parameter.
  20.     sayso = .t.
  21.   endif
  22.   if type([force]) <> 'L'                        && Set optional parameter.
  23.     force = .f.
  24.   endif
  25.   if type([fig]) <> 'C'                          && Set optional parameter.
  26.     fig = 'chkntx.dte'                           && File for date/time.
  27.   endif
  28.  
  29.  
  30.   private retcode,ddate[1],dtime[1],ndate[1],ntime[1],i,tempname
  31.   private fname,nflen,isthere,dbffile,ntxname
  32.   private handle,ok,hnd
  33.   private ndxarr[15]
  34.  
  35.   if sayso
  36.     boxmsg('Wait, Opening files...')
  37.   endif
  38.  
  39.   afill(ndxarr,'')                               && For "set index to"
  40.  
  41.   handle = fopen(fig,2)                          && Try to open it.
  42.   if handle = -1                                 && If it doesn't exist,
  43.     handle = fcreate(fig)                        && try to create it.
  44.     if handle = -1                               && If create fails,
  45.       errexit("Cannot open date file: "+fig)     && exit with error.
  46.     endif
  47.   endif
  48.  
  49.   nflen = len(nfiles)                            && Number of index files.
  50.   dbffile = dfile + '.DBF'                       && Add extension to dbf name.
  51.   store blank(date()) to ddate[1],ndate[1]       && Initialize date and
  52.   store blank(time()) to dtime[1],ntime[1]       && time fields.
  53.   if adir(dbffile,'','',ddate,dtime) = 0         && Get date & time of dbf.
  54.     errexit("Cannot find "+fname)                && Error if not there.
  55.   endif
  56.   if .not. force
  57.     ok = dteread(handle,dbffile,ddate[1],dtime[1])  && check dbf timestamp.
  58.   else
  59.     ok = .f.
  60.   endif
  61.   use (dfile)                                    && Open the database.
  62.   for i = 1 to nflen                             && Check each index file.
  63.      memory(0)                                   && Avoid memory fragmentation ??
  64.     if ok
  65.       ntxname = nfiles[i]+'.NTX'
  66.       ok = (adir(ntxname,'','',ndate,ntime)<>0)  && get file's date & time
  67.       if ok                                      && if index file exists
  68.         ok = dteread(handle,nfiles[i]+'.NTX',ndate[1],ntime[1])  && check timestamp
  69.       else
  70.         if .not. keyspassed              && No index file and key not passed,
  71.           errexit("No index file or key: "+nfiles[i]) && Exit with error.
  72.         endif
  73.       endif
  74.     endif
  75.  
  76.     if ok .and. keyspassed                 && Does ntx file have right key ?
  77.       hnd = fopen(ntxname)                       && Open the index file.
  78.       fseek(hnd,22,0)                            && Go to offset 20 for key.
  79.       ok = (upper(freadstr(hnd,250)) == upper(ntxkey[i])) && Compare keys.
  80.       fclose(hnd)                                && Close the index file.
  81.     endif
  82.  
  83.     if .not. ok                  && If something's wrong or we're forcing it,
  84.       if sayso
  85.         boxmsg("Wait ... Rebuilding indexes ["+nfiles[i]+'].')
  86.       endif
  87.       if keyspassed                              && Index key was passed,
  88.         tempname = ntxkey[i]                     && so
  89.         index on &tempname to (nfiles[i])        && build new index file.
  90.       else                                       && No indexkey passed,
  91.         reindex                                  && so just reindex.
  92.       endif
  93.  
  94.     endif
  95.     ndxarr[i] = nfiles[i]                        && build set index array
  96.   next
  97.   fclose(handle)                                 && close date/time file.
  98.   set index to (ndxarr[1]),(ndxarr[2]),(ndxarr[3]),(ndxarr[4]),(ndxarr[5]), ;
  99.                  (ndxarr[6]),(ndxarr[7]),(ndxarr[8]),(ndxarr[9]),(ndxarr[10]), ;
  100.                  (ndxarr[11]),(ndxarr[12]),(ndxarr[13]),(ndxarr[14]),(ndxarr[15])
  101. return .t.
  102.  
  103.  
  104. * Close Files 
  105. function clfile
  106.   parameters dfile,nfiles,sayso,fig
  107.   private fdate[1],ftime[1],fname,nfdate[1],nftime[1]
  108.   private handle
  109.  
  110.   if type([sayso]) <> 'L'                        && set verbosity.
  111.     sayso = .t.
  112.   endif
  113.   if type([fig]) <> 'C'                          && Set optional parameter.
  114.     fig = 'chkntx.dte'                           && File for date/time.
  115.   endif
  116.  
  117.   if sayso
  118.     boxmsg('Wait, Closing files...')
  119.   endif
  120.   use
  121.   fname = dfile + '.dbf'                         && Database file name.
  122.   store blank(date()) to fdate[1],nfdate[1]      && Initialize date and
  123.   store blank(time()) to ftime[1],nftime[1]      && time variables.
  124.   if adir(fname,'','',fdate,ftime) = 0           && Get dbf timestamp.
  125.     errexit("Cannot find "+fname)                && Exit with error if no dbf.
  126.   endif
  127.  
  128.   fig = 'chkntx.dte'                             && Date/Time file name.
  129.   handle = fopen(fig,2)                          && Open it.
  130.   if handle = -1                                 && If error,
  131.     errexit("Cannot open date file: "+fig)       && exit.
  132.   endif
  133.  
  134.   if .not. dtewrite(handle,fname,fdate[1],ftime[1])  && Update dbf's time/date.
  135.     errexit("ERROR Closing "+fname)              && If error, exit.
  136.   endif
  137.  
  138.   for i = 1 to len(nfiles)                       && For each index file,
  139.     fname = trim(nfiles[i]) + '.ntx'             && Index file name.
  140.     if adir(fname,'','',nfdate,nftime) = 0       && Get timestamp.
  141.       errexit("Cannot find "+fname)              && Exit with error if no ntx.
  142.     endif
  143.     if .not. dtewrite(handle,fname,nfdate[1],nftime[1])  && update ntx time/date.
  144.       errexit("ERROR Closing "+fname)            && If error, exit.
  145.     endif
  146.   next
  147.   fclose(handle)                                 && Close Date/Time file.
  148. return .t.
  149.  
  150.  
  151. * Read the Date/Time file.
  152. function dteread
  153.   parameters handle,dtefname,dtefdate,dteftime
  154.   private rd,rdfname,rdfdate,rdftime
  155.   fseek(handle,0,0)
  156.  
  157.   do while .t.
  158.     rdfname = space(12)
  159.     rd = fread(handle,@rdfname,12)               && Read file name.
  160.     if rd <> 12                                  && If end of file,
  161.       return .f.                                 && return error.
  162.     endif
  163.     if .not. upper(trim(rdfname)) == upper(trim(dtefname))  && If wrong file,
  164.       fseek(handle,16,1)                         && skip to next filename.
  165.       loop
  166.     endif
  167.     rdfdate = '  /  /  '
  168.     rd = fread(handle,@rdfdate,8)                && Read date.
  169.     if rd <> 8                                   && If end of file,
  170.       return .f.                                 && return error.
  171.     endif
  172.     if ctod(rdfdate) <> dtefdate                 && If dates don't match,
  173.       return .f.                                 && return error.
  174.     endif
  175.     rdftime = space(8)
  176.     rd = fread(handle,@rdftime,8)                && Read time.
  177.     if rd <> 8                                   && If end of file,
  178.       return .f.                                 && return error.
  179.     endif
  180.     if rdftime <> dteftime                       && If times don't match,
  181.       return .f.                                 && return error.
  182.     else 
  183.       return .t.                                 && Date & time match.
  184.     endif
  185.   enddo
  186.  
  187. * Update the Date/Time File.
  188. function dtewrite
  189.   parameters handle,dtefname,dtefdate,dteftime
  190.  
  191.   private rd,rdfname,rdfdate,rdftime
  192.  
  193.   fseek(handle,0,0)                              && go to top of file.
  194.   do while .t.
  195.     rdfname = space(12)
  196.     rd = fread(handle,@rdfname,12)               && Read name.
  197.     if rd <> 12                                  && If not in file,
  198.       fseek(handle,0,2)                          && go to end of file,
  199.       fwrite(handle,pad(dtefname,12),12)         && write new name,
  200.       fwrite(handle,dtoc(dtefdate),8)            && write new date,
  201.       fwrite(handle,dteftime,8)                  && write new time,
  202.       return .t.                                 && and return.
  203.     endif
  204.     if .not. upper(trim(rdfname)) == upper(trim(dtefname))  && if names don't match
  205.       fseek(handle,16,1)                         && 
  206.       loop                                       && go get next name.
  207.     endif
  208.     rdfdate = '  /  /  '
  209.     rd = fread(handle,@rdfdate,8)                && Read date.
  210.     if rd <> 8                                   && If file is bad,
  211.       return .f.                                 && abort.
  212.     endif
  213.     if ctod(rdfdate) <> dtefdate                 && If dates don't match,
  214.       fseek(handle,-8,1)                         && back up 8,
  215.       fwrite(handle,dtoc(dtefdate),8)            && write date,
  216.       fwrite(handle,dteftime,8)                  && write time,
  217.       return .t.                                 && and exit.
  218.     endif   
  219.     rdftime = space(8)
  220.     rd = fread(handle,@rdftime,8)                && Read time.
  221.     if rd <> 8                                   && If file is bad,
  222.       return .f.                                 && abort.
  223.     endif
  224.     if rdftime <> dteftime                       && If times don't match,
  225.       fseek(handle,-8,1)                       && back up 8,
  226.       fwrite(handle,dteftime,8)                && write time,
  227.     endif
  228.     return .t.                               && and exit.
  229.   enddo
  230.