home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C!T ROM 2
/
ctrom_ii_b.zip
/
ctrom_ii_b
/
PROGRAM
/
FOXPRO
/
PRE307
/
CHKNTX.PRE
next >
Wrap
Text File
|
1990-01-24
|
10KB
|
230 lines
note Open and Close Databases and Indexes and Reindex if Necessary
*chkntx
*
* Open Files
function opfile
parameters dfile,nfiles,ntxkey,sayso,force,fig
* dfile - Database file name without extension (Character).
* nfiles - Array of index file names without extension.
* ntxkey - Array of index keys (optional).
* sayso - Display error messages if true (optional - default = true).
* force - Force reindexing if true (optional - default = false).
* nfiles and ntxkey must be same length array.
keyspassed = (type([ntxkey]) = 'A') && Was key array passed ?
if type([sayso]) <> 'L' && Set optional parameter.
sayso = .t.
endif
if type([force]) <> 'L' && Set optional parameter.
force = .f.
endif
if type([fig]) <> 'C' && Set optional parameter.
fig = 'chkntx.dte' && File for date/time.
endif
private retcode,ddate[1],dtime[1],ndate[1],ntime[1],i,tempname
private fname,nflen,isthere,dbffile,ntxname
private handle,ok,hnd
private ndxarr[15]
if sayso
boxmsg('Wait, Opening files...')
endif
afill(ndxarr,'') && For "set index to"
handle = fopen(fig,2) && Try to open it.
if handle = -1 && If it doesn't exist,
handle = fcreate(fig) && try to create it.
if handle = -1 && If create fails,
errexit("Cannot open date file: "+fig) && exit with error.
endif
endif
nflen = len(nfiles) && Number of index files.
dbffile = dfile + '.DBF' && Add extension to dbf name.
store blank(date()) to ddate[1],ndate[1] && Initialize date and
store blank(time()) to dtime[1],ntime[1] && time fields.
if adir(dbffile,'','',ddate,dtime) = 0 && Get date & time of dbf.
errexit("Cannot find "+fname) && Error if not there.
endif
if .not. force
ok = dteread(handle,dbffile,ddate[1],dtime[1]) && check dbf timestamp.
else
ok = .f.
endif
use (dfile) && Open the database.
for i = 1 to nflen && Check each index file.
memory(0) && Avoid memory fragmentation ??
if ok
ntxname = nfiles[i]+'.NTX'
ok = (adir(ntxname,'','',ndate,ntime)<>0) && get file's date & time
if ok && if index file exists
ok = dteread(handle,nfiles[i]+'.NTX',ndate[1],ntime[1]) && check timestamp
else
if .not. keyspassed && No index file and key not passed,
errexit("No index file or key: "+nfiles[i]) && Exit with error.
endif
endif
endif
if ok .and. keyspassed && Does ntx file have right key ?
hnd = fopen(ntxname) && Open the index file.
fseek(hnd,22,0) && Go to offset 20 for key.
ok = (upper(freadstr(hnd,250)) == upper(ntxkey[i])) && Compare keys.
fclose(hnd) && Close the index file.
endif
if .not. ok && If something's wrong or we're forcing it,
if sayso
boxmsg("Wait ... Rebuilding indexes ["+nfiles[i]+'].')
endif
if keyspassed && Index key was passed,
tempname = ntxkey[i] && so
index on &tempname to (nfiles[i]) && build new index file.
else && No indexkey passed,
reindex && so just reindex.
endif
endif
ndxarr[i] = nfiles[i] && build set index array
next
fclose(handle) && close date/time file.
set index to (ndxarr[1]),(ndxarr[2]),(ndxarr[3]),(ndxarr[4]),(ndxarr[5]), ;
(ndxarr[6]),(ndxarr[7]),(ndxarr[8]),(ndxarr[9]),(ndxarr[10]), ;
(ndxarr[11]),(ndxarr[12]),(ndxarr[13]),(ndxarr[14]),(ndxarr[15])
return .t.
* Close Files
function clfile
parameters dfile,nfiles,sayso,fig
private fdate[1],ftime[1],fname,nfdate[1],nftime[1]
private handle
if type([sayso]) <> 'L' && set verbosity.
sayso = .t.
endif
if type([fig]) <> 'C' && Set optional parameter.
fig = 'chkntx.dte' && File for date/time.
endif
if sayso
boxmsg('Wait, Closing files...')
endif
use
fname = dfile + '.dbf' && Database file name.
store blank(date()) to fdate[1],nfdate[1] && Initialize date and
store blank(time()) to ftime[1],nftime[1] && time variables.
if adir(fname,'','',fdate,ftime) = 0 && Get dbf timestamp.
errexit("Cannot find "+fname) && Exit with error if no dbf.
endif
fig = 'chkntx.dte' && Date/Time file name.
handle = fopen(fig,2) && Open it.
if handle = -1 && If error,
errexit("Cannot open date file: "+fig) && exit.
endif
if .not. dtewrite(handle,fname,fdate[1],ftime[1]) && Update dbf's time/date.
errexit("ERROR Closing "+fname) && If error, exit.
endif
for i = 1 to len(nfiles) && For each index file,
fname = trim(nfiles[i]) + '.ntx' && Index file name.
if adir(fname,'','',nfdate,nftime) = 0 && Get timestamp.
errexit("Cannot find "+fname) && Exit with error if no ntx.
endif
if .not. dtewrite(handle,fname,nfdate[1],nftime[1]) && update ntx time/date.
errexit("ERROR Closing "+fname) && If error, exit.
endif
next
fclose(handle) && Close Date/Time file.
return .t.
* Read the Date/Time file.
function dteread
parameters handle,dtefname,dtefdate,dteftime
private rd,rdfname,rdfdate,rdftime
fseek(handle,0,0)
do while .t.
rdfname = space(12)
rd = fread(handle,@rdfname,12) && Read file name.
if rd <> 12 && If end of file,
return .f. && return error.
endif
if .not. upper(trim(rdfname)) == upper(trim(dtefname)) && If wrong file,
fseek(handle,16,1) && skip to next filename.
loop
endif
rdfdate = ' / / '
rd = fread(handle,@rdfdate,8) && Read date.
if rd <> 8 && If end of file,
return .f. && return error.
endif
if ctod(rdfdate) <> dtefdate && If dates don't match,
return .f. && return error.
endif
rdftime = space(8)
rd = fread(handle,@rdftime,8) && Read time.
if rd <> 8 && If end of file,
return .f. && return error.
endif
if rdftime <> dteftime && If times don't match,
return .f. && return error.
else
return .t. && Date & time match.
endif
enddo
* Update the Date/Time File.
function dtewrite
parameters handle,dtefname,dtefdate,dteftime
private rd,rdfname,rdfdate,rdftime
fseek(handle,0,0) && go to top of file.
do while .t.
rdfname = space(12)
rd = fread(handle,@rdfname,12) && Read name.
if rd <> 12 && If not in file,
fseek(handle,0,2) && go to end of file,
fwrite(handle,pad(dtefname,12),12) && write new name,
fwrite(handle,dtoc(dtefdate),8) && write new date,
fwrite(handle,dteftime,8) && write new time,
return .t. && and return.
endif
if .not. upper(trim(rdfname)) == upper(trim(dtefname)) && if names don't match
fseek(handle,16,1) &&
loop && go get next name.
endif
rdfdate = ' / / '
rd = fread(handle,@rdfdate,8) && Read date.
if rd <> 8 && If file is bad,
return .f. && abort.
endif
if ctod(rdfdate) <> dtefdate && If dates don't match,
fseek(handle,-8,1) && back up 8,
fwrite(handle,dtoc(dtefdate),8) && write date,
fwrite(handle,dteftime,8) && write time,
return .t. && and exit.
endif
rdftime = space(8)
rd = fread(handle,@rdftime,8) && Read time.
if rd <> 8 && If file is bad,
return .f. && abort.
endif
if rdftime <> dteftime && If times don't match,
fseek(handle,-8,1) && back up 8,
fwrite(handle,dteftime,8) && write time,
endif
return .t. && and exit.
enddo