From 569760adf1be33bca532f6ca15f5d097d6a58d73 Mon Sep 17 00:00:00 2001 From: angelo Date: Thu, 16 Oct 1997 14:06:40 +0000 Subject: [PATCH] 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 --- include/isam.cpp | 39 +++++++++++++++++++++------------------ include/isam.h | 13 +++++++------ 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/include/isam.cpp b/include/isam.cpp index de80e5395..d5f884b9e 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -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 ). 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

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

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(); diff --git a/include/isam.h b/include/isam.h index dc1462094..0364f60ff 100755 --- a/include/isam.h +++ b/include/isam.h @@ -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 ) - 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.

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.

indica se aprire il file in modo esclusivo. - TExternisamfile(const char* name, bool exclusive = FALSE); + //

indica se aprire il file con indici o meno + TExternisamfile(const char* name, bool exclusive = FALSE, bool index = TRUE); // @cmember Distruttore virtual ~TExternisamfile(); };