Riportate modifiche dalla R9702 per quanto riguarda l'apertura di

files senza indice, utile per scaricare un file con indice danneggiato.

Tolta fatal_box() nel caso si tenti di scrivere una stringa piu'
lunga del campo: ora tronca i valori alfanumerici alla lunghezza
massima, mentre quelli numerici vengono azzerati.


git-svn-id: svn://10.65.10.50/trunk@5389 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1997-10-16 14:06:40 +00:00
parent f77367a05d
commit 569760adf1
2 changed files with 28 additions and 24 deletions

View File

@ -199,12 +199,8 @@ void __putfieldbuff(byte l, byte d, byte t, const char* s, char* recout)
len = strlen(s);
if (len > l)
{
yesnofatal_box("Impossibile scrivere %d caratteri su di un campo di %d", (int)len, (int)l);
return;
}
const bool exceeded = len > l;
if ((t == _intfld) ||
(t == _longfld) ||
(t == _wordfld) ||
@ -213,7 +209,7 @@ void __putfieldbuff(byte l, byte d, byte t, const char* s, char* recout)
(t == _longzerofld)
)
{
if (len == 0)
if (len == 0 || exceeded)
{
strcpy(s2, "0");
s = s2;
@ -226,6 +222,8 @@ void __putfieldbuff(byte l, byte d, byte t, const char* s, char* recout)
}
else
{
if (exceeded)
len = l;
strncpy(recout, s, len) ;
for (i = l - 1; i >= len; i--) recout[i] = ' ';
}
@ -1292,19 +1290,24 @@ void TBaseisamfile::indexoff()
// @rdesc Ritorna NOERR se e' riuscita ad aprire il file, altrimenti ritorna il numero di errore
// generato (vedi <t TIsamerr>).
int TBaseisamfile::_open(
unsigned int mode) // @parm Indica il modo di apertura del file (default _manulock)
unsigned int mode, // @parm Indica il modo di apertura del file (default _manulock)
bool index) // @parm Indica se aprire con indici o meno (default TRUE)
// @comm Il parametro <p mode> puo' assumere i valori:
//
// @flag _manulock | Il lock dei record viene fatto manualmente
// @flag _exclock | Il file viene aperte in modo esclusivo
// @flag _autolock | Il lock dei record viene fatto in modo automatico
// @comm Il parametro <p index> puo' assumere i valori:
//
// @flag TRUE | Il file viene aperto con indici
// @flag FALSE | Il file viene aperto senza indici
{
CHECKS(filehnd() == NULL, "File already open ", (const char*)filename());
getisfd(_isamfile,num());
if ((filehnd()->fhnd = DB_open(filehnd()->d->SysName,mode==_excllock)) >= 0)
if ((filehnd()->fhnd = DB_open(filehnd()->d->SysName,mode==_excllock,index)) >= 0)
{
TRecnotype n=DB_reccount(filehnd()->fhnd);
TDir d;
@ -1398,7 +1401,7 @@ int TBaseisamfile::is_valid()
CHECKS(filehnd() == NULL, "File already open ", (const char*)filename());
int err = NOERR;
getisfd(_isamfile,num());
if ((filehnd()->fhnd = DB_open(filehnd()->d->SysName,0)) >= 0)
if ((filehnd()->fhnd = DB_open(filehnd()->d->SysName,0,TRUE)) >= 0)
{
if (DB_tagget(filehnd()->fhnd) == -1) err = _ispatherr;
DB_close(filehnd()->fhnd);
@ -1509,7 +1512,7 @@ int TLocalisamfile::open(unsigned int mode)
}
else
{
err = _open();
err = _open(mode, TRUE);
_was_open = TRUE;
}
@ -1689,7 +1692,7 @@ int TIsamtempfile::open(
}
else
filehnd()->d->EOD = eod;
filehnd()->fhnd = DB_open(filehnd()->d->SysName, 0);
filehnd()->fhnd = DB_open(filehnd()->d->SysName, 0, TRUE);
if (filehnd()->fhnd < 0)
err = get_error(filehnd()->fhnd);
if (err != NOERR)
@ -1765,7 +1768,7 @@ int TIsamtempfile::close()
///////////////////////////////////////////////////////////
// TExternisamfile
///////////////////////////////////////////////////////////
TExternisamfile::TExternisamfile(const char* name, bool exclusive)
TExternisamfile::TExternisamfile(const char* name, bool exclusive, bool index)
: TLocalisamfile(name)
{
_name = name;
@ -1780,7 +1783,7 @@ TExternisamfile::TExternisamfile(const char* name, bool exclusive)
_name.ltrim(1);
_name.format("%s/%s",__ptprf,(const char*)_name);
}
open(exclusive);
open(exclusive, index);
}
TExternisamfile::~TExternisamfile()
@ -1788,11 +1791,11 @@ TExternisamfile::~TExternisamfile()
close();
}
int TExternisamfile::open(bool exclusive)
int TExternisamfile::open(bool exclusive, bool index)
{
int err=NOERR;
filehnd()->fhnd = DB_open(_name, exclusive);
filehnd()->fhnd = DB_open(_name, exclusive, index);
if (filehnd()->fhnd < 0)
err = get_error(filehnd()->fhnd);
if (err != NOERR)
@ -2099,7 +2102,7 @@ int TSystemisamfile::update(
err=get_error(err);
return (err);
}
i0->fhnd=DB_open((const char*)tmpfname,0);
i0->fhnd=DB_open((const char*)tmpfname,0, TRUE);
if (i0->fhnd < 0 ) err=get_error(i0->fhnd);
TFilename fname(filename());
TString s(80);
@ -2492,7 +2495,7 @@ int TSystemisamfile::dump(
if (withdeleted) nkey = 0;
int err = ferror(f);
open();
open(FALSE, nkey ? TRUE : FALSE);
TString s(512);
bool fixedlen = (fs == '\0');
int nflds = curr().items();

View File

@ -339,8 +339,8 @@ protected:
// @cmember UNUSED
void recover();
// @cmember Apre il file isam di base con lock
int _open(unsigned int mode = _manulock);
// @cmember Apre il file isam di base con lock, permettendo di specificare se usare gli indici o no
int _open(unsigned int mode = _manulock, bool index = TRUE);
// @cmember Chiude il file isam di base
int _close();
@ -564,8 +564,8 @@ public:
// @cmember Aggiorna i flags associati al file
int flags(bool updateeod = FALSE);
// @cmember Apre un file di isam con lock (vedi <mf TBaseisamfile::_open>)
int open(unsigned int mode = _manulock)
{ return _open(mode);}
int open(unsigned int mode = _manulock, bool index = TRUE)
{ return _open(mode, index);}
// @cmember Chiude il file di isam
int close()
{ return _close();}
@ -734,7 +734,7 @@ class TExternisamfile : public TLocalisamfile
// @access Protected Member
protected:
// @cmember Apre il file. <p exclusive> indica se aprire il file in modo esclusivo
int open(bool exclusive);
int open(bool exclusive, bool index = TRUE);
// @cmember Chiude il file
int close();
@ -743,7 +743,8 @@ public:
// @cmember Ritorna il nome del file sotto forma di stringa
virtual const char* name() const;
// @cmember Costruttore. <p exclusive> indica se aprire il file in modo esclusivo.
TExternisamfile(const char* name, bool exclusive = FALSE);
// <p index> indica se aprire il file con indici o meno
TExternisamfile(const char* name, bool exclusive = FALSE, bool index = TRUE);
// @cmember Distruttore
virtual ~TExternisamfile();
};