#include "cg0201.h" #include #include #include #include // Definizione dei metodi relativi alla classe TClifoVI TClifoVI::TClifoVI() : TRelation(LF_CLIFO), _oldindirizzi(0), _gesven(FALSE) { add(LF_CFVEN,"TIPOCF==TIPOCF|CODCF==CODCF"); add(LF_INDSP,"TIPOCF==TIPOCF|CODCF==CODCF"); add(LF_CFPRI,"TIPOCF==TIPOCF|CODCF==CODCF"); } void TClifoVI::destroy_rows() { _indirizzi.destroy(); _contatti.destroy(); } TRectype& TClifoVI::indirizzo(int i) { TRectype *r=(TRectype*)_indirizzi.objptr(i); if (r == NULL) { r = new TRectype(LF_INDSP); _indirizzi.add(r,i); } return *r; } TRectype& TClifoVI::contatto(int i) { TRectype* r= (TRectype*)_contatti.objptr(i); if (r == NULL) { r = new TRectype(LF_MULTIREL); _contatti.add(r,i); } return *r; } int TClifoVI::read_indirizzi() { destroy_rows(); if (_gesven) { const TRectype& rind = curr(LF_INDSP); for (bool ok=is_first_match(LF_INDSP); ok; ok=next_match(LF_INDSP)) { const int nriga = rind.get_int(IND_CODIND) -1; indirizzo(nriga) = rind; } _oldindirizzi = indirizzi(); // Read contatti TLocalisamfile cont(LF_MULTIREL); const char tipocf = curr().get_char(CLI_TIPOCF); const long codcf = curr().get_long(CLI_CODCF); TString8 first; first.format("%C%06ld", tipocf, codcf); cont.put("COD", "BACON"); cont.put("FIRST", first); for (int err = cont.read(_isgteq); err == NOERR && cont.get("COD") == "BACON" && cont.get("FIRST") == first; err = cont.next()) _contatti.add(cont.curr()); } return 0; } int TClifoVI::write_contatti() { TAssoc_array old_ones; TLocalisamfile cont(LF_MULTIREL); const char tipocf = curr().get_char(CLI_TIPOCF); const long codcf = curr().get_long(CLI_CODCF); TString8 first; first.format("%C%06ld", tipocf, codcf); cont.put("COD", "BACON"); cont.put("FIRST", first); for (int err = cont.read(_isgteq); err == NOERR && cont.get("COD") == "BACON" && cont.get("FIRST") == first; err = cont.next()) old_ones.add(cont.curr().get("SECOND")); FOR_EACH_ASSOC_OBJECT(old_ones, h, k, r) { bool trovato = false; for (int i = _contatti.last(); i >= 0 && !trovato; i--) { const TRectype& c = (const TRectype&)_contatti[i]; trovato = c.get_long("SECOND") == atol(k); } if (!trovato) { cont.zero(); cont.put("COD", "BACON"); cont.put("FIRST", first); cont.put("SECOND", k); cont.remove(); } } FOR_EACH_ARRAY_ITEM(_contatti, i, obj) { TRectype& rec = *(TRectype*)obj; if (rec.get("DATA").full()) { TString8 second; second.format("%06ld", rec.get_long("SECOND")); rec.put("COD", "BACON"); rec.put("FIRST", first); rec.put("SECOND", second); rec.write_rewrite(cont); } } return 0; } int TClifoVI::read(TIsamop op, TReclock lockop) { const int err = file().read(op,lockop); position_rels(); if (err == NOERR) read_indirizzi(); return err; } int TClifoVI::write_rec(bool re, const TRectype& rec, TLocalisamfile& f) { if (re) { const bool scrivi= f.rewrite(rec) != NOERR; if (scrivi) f.write(rec); } else f.write(rec); return f.status(); } int TClifoVI::cancella(TLocalisamfile& f, int da, int a) { const char tipocf=lfile().get(IND_TIPOCF)[0]; const long codcf=lfile().get_long(IND_CODCF); for (int i=da; i<=a;i++) { f.zero(); f.put(IND_TIPOCF,tipocf); f.put(IND_CODCF,codcf); f.put(IND_CODIND,i); if (f.read(_isequal,_lock)==NOERR) f.remove(); } return f.status(); } int TClifoVI::registra(bool re, bool force) { TLocalisamfile& c=lfile(LF_CLIFO); int err = write_rec(re,c.curr(),c); if (err == NOERR) { TLocalisamfile& v = lfile(LF_CFVEN); err = write_rec(TRUE, v.curr(), v); if (err == NOERR) { TLocalisamfile& p = lfile(LF_CFPRI); p.put("TIPOCF", c.get(CLI_TIPOCF)[0]); p.put("CODCF", c.get_long(CLI_CODCF)); err = write_rec(TRUE, p.curr(), p); if (err == NOERR) { // Put here gest_vend() discrimination if (_gesven) { TLocalisamfile& rind = lfile(LF_INDSP); const char tipocf = c.get(CLI_TIPOCF)[0]; const long codcf = c.get_long(CLI_CODCF); int i = 0; for (i = 0; i < indirizzi(); i++) { if (!re) { indirizzo(i).put(IND_TIPOCF, tipocf); indirizzo(i).put(IND_CODCF, codcf); } err = write_rec(TRUE, indirizzo(i), rind); } if (i < _oldindirizzi) cancella(rind, i + 1, _oldindirizzi); _oldindirizzi = indirizzi(); write_contatti(); } if (_geslv) { TLocalisamfile& lv = lfile(-LVAUT); const char tipocf = c.get(CLI_TIPOCF)[0]; const long codcf = c.get_long(CLI_CODCF); TString8 codtab; codtab << tipocf << codcf; TRectype& rec = lv.curr(); rec.put("CODTAB", codtab); err = write_rec(TRUE, rec, lv); } } } } // END of gest_vend() discrimination return err; } int TClifoVI::write(bool force) { _oldindirizzi = 0; return registra(FALSE,force); } int TClifoVI::rewrite(bool force) { return registra(TRUE,force); } int TClifoVI::remove() { const int err = lfile(LF_CLIFO).remove(); lfile(LF_CFPRI).remove(); // Put here gest_vend() discrimination if (_gesven) { lfile(LF_CFVEN).remove(); TLocalisamfile& rind = lfile(LF_INDSP); cancella(rind, 1, _oldindirizzi); _contatti.destroy(); write_contatti(); } _oldindirizzi = 0; return err; }