#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"); } 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) return err; TLocalisamfile& v = lfile(LF_CFVEN); err = write_rec(TRUE,v.curr(),v); if (err!=NOERR) return err; // 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; for (i=0; i