9f263fd48a
git-svn-id: svn://10.65.10.50/trunk@122 c028cbd2-c16b-5b4b-a496-9718f37d4682
181 lines
4.1 KiB
C
Executable File
181 lines
4.1 KiB
C
Executable File
/*
|
|
@(SH) Utility per la gestione dei file ISAM
|
|
-------------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include <ccommon.h>
|
|
#include <genconst.h>
|
|
#include <ccustio.h>
|
|
#include <cfiles.h>
|
|
#include <cbpltree.h>
|
|
#include <cbplcre.h>
|
|
#include <cisam.h>
|
|
#include <memory.h>
|
|
#include <progind.h>
|
|
|
|
/*
|
|
@(#) creorgfile ISAM
|
|
|
|
@(ID)
|
|
Compatta il file dati eliminando fisicamente i record cancellati logicamente.
|
|
Ritorna il codice di errore.
|
|
@(FD)
|
|
|
|
@(ISV)
|
|
wisfd = puntatore al descrittore del file.
|
|
|
|
rec = buffer per contenere un record.
|
|
|
|
i = contatore.
|
|
|
|
k = contatore.
|
|
|
|
oldeod = variabile che contiene il vecchio valore di End of Data.
|
|
|
|
|
|
junk = variabile spazzatura per la chiamata di varie funzioni.
|
|
|
|
w = finestra di visualizzazione.
|
|
|
|
s = stringa messaggio.
|
|
|
|
- Versione DOS e XENIX
|
|
@(FSV)
|
|
*/
|
|
|
|
int creorgfile(logicname,vis,err)
|
|
int logicname; /* numero logico del file */
|
|
BOOLEAN vis; /* se true visualizza le operazioni che sta facendo */
|
|
int *err; /* codice errore */
|
|
|
|
{
|
|
isfdptr wisfd;
|
|
RecType rec;
|
|
RecNoType i = 0L,k = 0L,oldeod;
|
|
int junk;
|
|
char s[80];
|
|
|
|
*err = NoErr;
|
|
if (cisopen(&wisfd, logicname, &rec, ExclLock, err)) return(*err);
|
|
oldeod = wisfd->d->EOD;
|
|
if (vis && (oldeod > 0))
|
|
{
|
|
sprintf(s,"Compatta - %s", wisfd->d->Des);
|
|
progind_create(wisfd->d->EOD, s, FALSE, TRUE, 10);
|
|
}
|
|
while (i < wisfd->d->EOD)
|
|
{
|
|
i++;
|
|
CRead(&wisfd->f, rec, i, NoLock);
|
|
if ((*err = wisfd->f.IOR)) break ;
|
|
if (!IRecIsDeleted(rec))
|
|
{
|
|
k++;
|
|
if (k < i) CWrite(&wisfd->f, rec, k, NoLock);
|
|
}
|
|
if (vis && (oldeod > 0) && (!(i % 10)))
|
|
progind_set_status(i);
|
|
}
|
|
if (vis && (oldeod > 0))
|
|
progind_set_status(i);
|
|
if (!*err)
|
|
{
|
|
wisfd->d->EOD = k;
|
|
#ifndef DOS
|
|
writelog(FNREORG, NULL, (RecType) &oldeod);
|
|
#endif
|
|
junk = cisupdflags(wisfd, &junk, TRUE);
|
|
}
|
|
junk = cisclose(&wisfd, &rec, &junk);
|
|
if (vis && oldeod > 0)
|
|
progind_destroy();
|
|
return(*err);
|
|
}
|
|
|
|
/*
|
|
@(#) creorgindex ISAM
|
|
|
|
@(ID)
|
|
Ricostruisce l'indice di un file.
|
|
Ritorna il codice di errore.
|
|
@(FD)
|
|
|
|
@(ISV)
|
|
wisfd = puntatore al descrittore del file.
|
|
|
|
rec = buffer per contenere un record.
|
|
|
|
j = contatore.
|
|
|
|
junk = variabile spazzatura per la chiamata di varie funzioni.
|
|
|
|
w = finestra di visualizzazione.
|
|
|
|
s = stringa messaggio.
|
|
@(FSV)
|
|
|
|
@(IN)
|
|
Deve essere usata in coppia con la "creorgfile".
|
|
@(FN)
|
|
*/
|
|
|
|
int creorgindex(logicname,vis,err)
|
|
int logicname; /* numero logico del file */
|
|
BOOLEAN vis; /* se true visualizza cio' che sta facendo */
|
|
int *err; /* codice errore */
|
|
|
|
{
|
|
isfdptr wisfd;
|
|
RecType rec;
|
|
int junk, j;
|
|
char s[80];
|
|
int werr = NoErr;
|
|
|
|
*err = NoErr;
|
|
getisfd(&wisfd, logicname);
|
|
CBInitFile(&wisfd->i);
|
|
for (j = 1; j <= wisfd->r->NKeys;j++)
|
|
{
|
|
CBInitPath(j,CCalcLenKey(wisfd->r,j),wisfd->d->EOX,
|
|
wisfd->r->Ky[j-1].DupKeys,&(wisfd->i),err);
|
|
if (*err)
|
|
{
|
|
relisfd(&wisfd);
|
|
return (*err);
|
|
}
|
|
}
|
|
junk = unlink(CGetIdxName(wisfd->d->SysName));
|
|
CBCreate(&wisfd->i, CGetIdxName(wisfd->d->SysName),err);
|
|
relisfd(&wisfd);
|
|
if (*err) return (*err);
|
|
if (cisopen(&wisfd, logicname, &rec, ExclLock, err)) return(*err);
|
|
wisfd->RecNo = 0L;
|
|
if (vis && (wisfd->d->EOD > 0))
|
|
{
|
|
sprintf(s,"Crea indice - %s", wisfd->d->Des);
|
|
progind_create(wisfd->d->EOD, s, FALSE, TRUE, 10);
|
|
}
|
|
while (wisfd->RecNo < wisfd->d->EOD)
|
|
{
|
|
wisfd->RecNo++;
|
|
CRead(&wisfd->f, rec, wisfd->RecNo, NoLock);
|
|
werr = wisfd->f.IOR;
|
|
if (!IRecIsDeleted(rec))
|
|
addkeys(wisfd,rec,1,&werr);
|
|
if (vis && (wisfd->d->EOD > 0) && (!(wisfd->RecNo % 10)))
|
|
progind_set_status(wisfd->RecNo);
|
|
if (werr != NoErr && *err == NoErr)
|
|
*err = werr;
|
|
}
|
|
if (vis && (wisfd->d->EOD > 0))
|
|
progind_set_status(wisfd->RecNo);
|
|
junk = cisclose(&wisfd, &rec, &junk);
|
|
if (vis)
|
|
progind_destroy();
|
|
if (*err != NoErr)
|
|
error_box("Si e' verificato almeno un errore n. %d\nVerificare l'archivio e ripetere il compattamento", *err);
|
|
return(*err);
|
|
}
|
|
|
|
|