Primo debug

git-svn-id: svn://10.65.10.50/trunk@4546 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
augusto 1997-06-06 16:37:06 +00:00
parent 1b21272515
commit 0006611125
2 changed files with 56 additions and 32 deletions

View File

@ -19,10 +19,17 @@ void TMultiple_rectype::load_rows_file(int logicnum)
{
const int index = log2ind(logicnum);
TRectype & rec = get_body_record(logicnum);
set_body_key(rec);
TRecord_array * r = new TRecord_array(logicnum, (TString &) _numfields[index]);
_files.add( r, index);
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;
}
int TMultiple_rectype::find(int logicnum, const char * fieldname, const char * s, int from, bool reverse) const
@ -68,7 +75,7 @@ int TMultiple_rectype::write_rewrite(TBaseisamfile & f, bool re) const
for (int i = _nfiles - 1; err == NOERR && i >= 0 ; i--)
{
TRecord_array * r = (TRecord_array *) _files.objptr(i);
if (r)
if (r && !_changed[i])
err = r->write(re);
}
// rewrite:
@ -101,7 +108,7 @@ int TMultiple_rectype::write_rewrite(TBaseisamfile & f, bool re) const
for (int i = _nfiles - 1; err == NOERR && i >= 0 ; i--)
{
TRecord_array * r = (TRecord_array *)_files.objptr(i);
if (r)
if (r && !_changed[i])
err = r->write(re);
}
}
@ -131,7 +138,7 @@ TRecord_array & TMultiple_rectype::body(int logicnum) const
{
const int index = log2ind(logicnum);
if (_files.objptr(index) == NULL)
if (_files.objptr(index) == NULL || _changed[index])
((TMultiple_rectype *) this)->load_rows_file(_logicnums[index]);
return (TRecord_array &) _files[index];
}
@ -175,7 +182,7 @@ void TMultiple_rectype::zero(char c)
TAuto_variable_rectype::zero(c);
for (int i = _nfiles - 1; i >= 0 ; i--)
if (_files.objptr(i) != NULL)
_files.remove(i);
((TRecord_array &)_files[i]).destroy_rows();
}
@ -188,8 +195,12 @@ int TMultiple_rectype::read(TRectype & rec, word op, word lockop)
int err = TRectype::read(f, op, lockop);
for (int i = _nfiles - 1; i >= 0 ; i--)
if (_files.objptr(i) != NULL)
_files.remove(i);
{
if (_autoload[i])
load_rows_file(_logicnums[i]);
else if (_files.objptr(i) != NULL)
_changed[i]=TRUE;
}
_nuovo = err != NOERR;
return err;
}
@ -215,10 +226,11 @@ TMultiple_rectype::TMultiple_rectype(int hfn)
}
// @ cmember costruttore dal file
void TMultiple_rectype::add_file(int logicnum, const char * numfield)
void TMultiple_rectype::add_file(int logicnum, const char * numfield, bool autoload)
{
CHECK(_nfiles < maxfiles, "Too many files added");
_logicnums[_nfiles] = logicnum;
_autoload[_nfiles] = autoload;
_numfields.add(numfield, _nfiles++);
}

View File

@ -21,52 +21,67 @@ class TMultiple_rectype ;
class TMultiple_rectype : public TAuto_variable_rectype
{
enum { maxfiles = 20};
// @ cmember Array di TRecord array per le righe
// @cmember Array di TRecord array per le righe
TArray _files; //
// @ cmember flag indicatore di record nuovo
// @cmember flag indicatore di record nuovo
bool _nuovo;
// @ cmember numero di file righe
// @cmember numero di file righe
short _nfiles;
// @ cmember file delle righe
// @cmember file delle righe
int _logicnums[maxfiles];
// @ cmember Array di nomi di campo "numeratore" delle righe
// @cmember Indicazione di record array non più corrispondente alla testata
bool _changed[maxfiles];
// @cmember Indicazione autoload
bool _autoload[maxfiles];
// @cmember Array di nomi di campo "numeratore" delle righe
TString_array _numfields;
protected:
const TArray & files() const { return _files;}
// @ cmember funzione per costruire la chiave delle righe
// @cmember funzione per costruire la chiave delle righe
virtual void set_body_key(TRectype & rowrec);
// @ cmember renumber la chiave del corpo
// @cmember setta la chiave della testata ad un valore nuovo (next-key)
virtual bool renum() { return FALSE; }
// @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])); }
// @cmember Crea e carica il record array del corpo
virtual void load_rows_file(int logicnum);
// @cmember Ritorna l'indice di <p _files> del numero logico passato
int log2ind(int logicnum) const;
// @cmember RIcerca la prima occorenza del corpo con fieldname uguale a s
virtual int find(int logicnum, const char * fieldname, const char * s, int from = 0, bool reverse = FALSE) const ;
// @cmember Scrive/riscrive un corpo
virtual int write_rewrite(TBaseisamfile& f, bool re = FALSE) const;
// @cmember Rimuove un corpo
void remove_body(int logicnum);
// @cmember Associa un file a quello principale
void add_file(int logicnum, const char * numfield,bool autoload=FALSE);
public:
//***********************
// struttura
// @ cmember restituisce il record di testata
// @cmember restituisce il record di testata
const TAuto_variable_rectype& head() const { return *this; } // Ritorna la testata del documento
// @ cmember restituisce il record di testata
// @cmember restituisce il record di testata
TAuto_variable_rectype& head() { return *this; } // Ritorna la testata del documento
// @ cmember restituisce il record array del corpo
// @cmember restituisce il record array del corpo
TRecord_array & body(int logicnum = 0) const;
// @ cmember restituisce il numero di record nel corpo
// @cmember restituisce il numero di record nel corpo
int rows(int logicnum = 0) const { return body(logicnum).rows(); }
// @ cmember restituisce il record n-esimo del del corpo
// @cmember restituisce il record n-esimo del del corpo
virtual const TRecord_array & operator[](int logicnum) const { return (const TRecord_array &)((TMultiple_rectype *)this)->body(logicnum); }
// @ cmember restituisce il record n-esimo del del corpo
// @cmember restituisce il record n-esimo del del corpo
virtual TRecord_array & operator[](int logicnum) { return (TRecord_array &)body(logicnum); }
// @cmember distrugge una riga del record array del corpo
bool destroy_row(int n, bool pack = FALSE, int logicnum = 0) { return body(logicnum).destroy_row(n, pack); }
// @cmember distrugge tutte le righe del record array del corpo
void destroy_rows(int logicnum = 0) { body(logicnum).destroy_rows(); }
//***********************
@ -75,14 +90,13 @@ public:
virtual void set_fields(TAuto_variable_rectype & rec) {}
virtual void reset_fields(TAuto_variable_rectype & rec) { rec.remove_field(); }
virtual void renum_key();
virtual TRectype & operator =(const TRectype & r);
virtual TRectype & operator =(const char * r);
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 read(*this, op, lockop); }
int read(TBaseisamfile & f, word op = _isequal, word lockop = _nolock) { return read(f.curr(), op, lockop); }
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 write(TBaseisamfile& f) const { return write_rewrite(f);}
virtual int rewrite(TBaseisamfile& f) const { return write_rewrite(f, TRUE);}
@ -92,16 +106,14 @@ public:
int rewrite() const { TBaseisamfile f(num()); return rewrite(f);}
int remove() const { TBaseisamfile f(num()); return remove(f);}
void add_file(int logicnum, const char * numfield);
//**************************
// @ cmember costruttore dal numero del file
// @cmember costruttore dal numero del file
TMultiple_rectype(int hfn);
// @ cmember costruttore dal file
// @cmember costruttore dal file
TMultiple_rectype(const TBaseisamfile* file);
// @ cmember costruttore dal record
// @cmember costruttore dal record
TMultiple_rectype(const TRectype & rec);
// @ cmember costruttore di copia
// @cmember costruttore di copia
TMultiple_rectype(const TMultiple_rectype& r);
virtual ~TMultiple_rectype() {}
};