diff --git a/include/ldfile.cpp b/include/ldfile.cpp deleted file mode 100755 index 3fdd97e9a..000000000 --- a/include/ldfile.cpp +++ /dev/null @@ -1,69 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -int main(int argc,char** argv) - -{ - init_global_vars(); - if (argc > 2) - { - argv++; - TScanner dfile(*argv); - TLocalisamfile* of; - TString s(dfile.line()); - TToken_string w(s); - const char* work = w.get(); - const int nf = atoi(work); - const TString nt(work); - const int reclen = w.get_int(); - - if (nf) of = new TLocalisamfile(nf); - else of = new TTable(nt); - - TToken_string d(40, ','); - - while (*(work = dfile.line())) - d.add(work); - - argv++; - TScanner ifile(*argv); - - TString name, just(3), ws(256); - - while (*(work = ifile.line())) - { - s = work; - s.left_just(reclen); - d.restart(); - of->zero(); - w = d.get(); - while (w.not_empty()) - { - const int st = w.get_int(); - const int len = w.get_int(); - name = w.get(); - if (name != "-") - { - ws = s.mid(st, len); - just = w.get(); - if (just == "Z") ws.right_just(len, '0'); - else - if (just == "R") ws.right_just(len); - else - if (just == "L") ws.left_just(len); - of->put(name, ws); - } - w = d.get(); - } - of->write(); - if (of->bad()) of->rewrite(); - } - delete of; - } - free_global_vars(); -} diff --git a/include/ldfile1.cpp b/include/ldfile1.cpp deleted file mode 100755 index a24d1b0dc..000000000 --- a/include/ldfile1.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -int main(int argc,char** argv) - -{ - init_global_vars(); - if (argc > 2) - { - argv++; - TScanner dfile(*argv); - TLocalisamfile* of; - TString s(dfile.line()); - TToken_string w(s); - const char* work = w.get(); - const int nf = atoi(work); - const TString nt(work); - const int reclen = w.get_int(); - - if (nf) of = new TLocalisamfile(nf); - else of = new TTable(nt); - - TToken_string d(40, ','); - - while (*(work = dfile.line())) - d.add(work); - - argv++; - TScanner ifile(*argv); - - TString name, ws(256), depcom(10); - int ncodi = 2, ncodd = 2; - - while (*(work = ifile.line())) - { - s = work; - s.left_just(reclen); - d.restart(); - w = d.get(); - int st = w.get_int(); - int len = w.get_int(); - name = w.get(); - ws = s.mid(st, len); - if (ws != depcom) - { - if (depcom.not_empty()) of->rewrite(); - ncodi = 2; - ncodd = 2; - of->zero(); - of->put(name, ws); - of->read(); - if (of->good()) depcom = ws; - else depcom = ""; - } - w = d.get(); - st = w.get_int(); - len = w.get_int(); - name = s.mid(st, len); - w = d.get(); - st = w.get_int(); - len = w.get_int(); - ws = s.mid(st, len); - if (name == "UI") - name = format("UFFIVA%1d", ncodi++); - else - name = format("UFFIIDD%1d", ncodd++); - of->put(name, ws); - } - if (depcom.not_empty()) of->rewrite(); - delete of; - } - free_global_vars(); -} diff --git a/include/multirec.cpp b/include/multirec.cpp index 3970ebe1e..247b7c942 100755 --- a/include/multirec.cpp +++ b/include/multirec.cpp @@ -18,18 +18,16 @@ void TMultiple_rectype::set_body_key(TRectype & rowrec) void TMultiple_rectype::load_rows_file(int logicnum) { const int index = log2ind(logicnum); - TRectype & rec = get_body_record(logicnum); - set_body_key(rec); + TRectype * rec = new_body_record(logicnum); + set_body_key(*rec); if (_files.objptr(index) == NULL) { - // crea - TRecord_array * r = new TRecord_array(rec, (TString &) _numfields[index]); - _files.add( r, index); - } else { - // rilegge - ((TRecord_array &)_files[index]).read(rec); - } - _changed[index]=FALSE; + // crea + TRecord_array * r = new TRecord_array(logicnum, (TString &) _numfields[index]); + _files.add( r, index); + } + ((TRecord_array &)_files[index]).read(rec); // rilegge + _changed[index]=FALSE; } int TMultiple_rectype::find(int logicnum, const char * fieldname, const char * s, int from, bool reverse) const @@ -189,19 +187,47 @@ void TMultiple_rectype::zero(char c) int TMultiple_rectype::read(TRectype & rec, word op, word lockop) { TLocalisamfile f(num()); + int err = NOERR; *this = rec; + _nuovo = FALSE; - int err = TRectype::read(f, op, lockop); - + if (op == _isequal) + { + TRectype r(rec); + + err = TRectype::read(f, op, lockop); + if (err != NOERR) + { + *this = r; + _nuovo = TRUE; + } + } + else + err = TRectype::read(f, op, lockop); for (int i = _nfiles - 1; i >= 0 ; i--) { - if (_autoload[i]) - load_rows_file(_logicnums[i]); - else if (_files.objptr(i) != NULL) - _changed[i]=TRUE; + if (_nuovo) + { + TRecord_array * b = (TRecord_array *) _files.objptr(i); + if (b != NULL) + { + _changed[i] = FALSE; + b->destroy_rows(); + TRectype * r = new_body_record(_logicnums[i]); + set_body_key(*r); + b->set_key(r); + } + } + else + { + if (_autoload[i]) + load_rows_file(_logicnums[i]); + else + if (_files.objptr(i) != NULL) + _changed[i] = TRUE; + } } - _nuovo = err != NOERR; return err; } @@ -212,7 +238,7 @@ int TMultiple_rectype::remove(TBaseisamfile & f) const for (int i = _nfiles - 1; err == NOERR && i >= 0 ; i--) { TRecord_array & r = body(_logicnums[i]); - r.remove(); + err = r.remove(); } if (err == NOERR) err = TRectype::remove(f); @@ -228,7 +254,7 @@ TMultiple_rectype::TMultiple_rectype(int hfn) void TMultiple_rectype::enable_autoload(int logicnum,bool on) { const int index = log2ind(logicnum); - _autoload[index] = on; + _autoload[index] = on; } bool TMultiple_rectype::autoload_enabled(int logicnum) @@ -241,6 +267,7 @@ void TMultiple_rectype::add_file(int logicnum, const char * numfield) { CHECK(_nfiles < maxfiles, "Too many files added"); _logicnums[_nfiles] = logicnum; + _autoload[_nfiles] = FALSE; _numfields.add(numfield, _nfiles++); } @@ -262,6 +289,12 @@ TMultiple_rectype::TMultiple_rectype(const TMultiple_rectype& r) // copia.. _nuovo=r._nuovo; _nfiles=r._nfiles; // file delle righe + for (int i = _nfiles - 1; i >= 0; i--) + { + _logicnums[i] = r._logicnums[i]; + _changed[i] = r._changed[i]; + _autoload[i] = r._autoload[i]; + } _numfields=r._numfields; } diff --git a/include/multirec.h b/include/multirec.h index 48285defa..026448cae 100755 --- a/include/multirec.h +++ b/include/multirec.h @@ -46,7 +46,7 @@ protected: // @cmember renumera le chiavi di tutti i corpi in base alla testata virtual void renum_key(); // @cmember Genera il record del corpo - virtual TRectype & get_body_record(int logicnum = 0) { return *(new TRectype(logicnum ? logicnum : _logicnums[0])); } + virtual TRectype * new_body_record(int logicnum = 0) { return new TRectype(logicnum ? logicnum : _logicnums[0]); } // @cmember Crea e carica il record array del corpo virtual void load_rows_file(int logicnum); // @cmember Ritorna l'indice di

del numero logico passato @@ -85,9 +85,9 @@ public: void destroy_rows(int logicnum = 0) { body(logicnum).destroy_rows(); } // @cmember Abilita il caricamento del corpo insieme alla testata - void enable_autoload(int lognum,bool on =TRUE); + void enable_autoload(int lognum,bool on =TRUE); // @cmember Restituisce il flag di caricamento del corpo insieme alla testata - bool autoload_enabled(int lognum); + bool autoload_enabled(int lognum); //*********************** // record e I/O @@ -100,16 +100,16 @@ public: virtual void zero(char c = '\0'); virtual int read(TRectype & rec, word op = _isequal, word lockop = _nolock); - virtual int read(word op = _isequal, word lockop = _nolock) { return TMultiple_rectype::read(*this, op, lockop); } - int read(TBaseisamfile & f, word op = _isequal, word lockop = _nolock) { return TMultiple_rectype::read(f.curr(), op, lockop); } + virtual int read(word op = _isequal, word lockop = _nolock) { return read(*this, op, lockop); } + int read(TBaseisamfile & f, word op = _isequal, word lockop = _nolock) { return read(f.curr(), op, lockop); } virtual int write(TBaseisamfile& f) const { return write_rewrite(f);} virtual int rewrite(TBaseisamfile& f) const { return write_rewrite(f, TRUE);} virtual int remove(TBaseisamfile& f) const; - int write() const { TBaseisamfile f(num()); return write(f);} - int rewrite() const { TBaseisamfile f(num()); return rewrite(f);} - int remove() const { TBaseisamfile f(num()); return remove(f);} + virtual int remove() const { TLocalisamfile f(num()); return remove(f);} + virtual int write() const { TLocalisamfile f(num()); return write(f);} + virtual int rewrite() const { TLocalisamfile f(num()); return rewrite(f);} //************************** // @cmember costruttore dal numero del file