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

View File

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