Primo debug
git-svn-id: svn://10.65.10.50/trunk@4546 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
1b21272515
commit
0006611125
@ -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++);
|
||||
}
|
||||
|
||||
|
@ -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() {}
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user