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); const int index = log2ind(logicnum);
TRectype & rec = get_body_record(logicnum); TRectype & rec = get_body_record(logicnum);
set_body_key(rec); set_body_key(rec);
TRecord_array * r = new TRecord_array(logicnum, (TString &) _numfields[index]); if (_files.objptr(index) == NULL)
_files.add( r, index); {
// 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 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--) for (int i = _nfiles - 1; err == NOERR && i >= 0 ; i--)
{ {
TRecord_array * r = (TRecord_array *) _files.objptr(i); TRecord_array * r = (TRecord_array *) _files.objptr(i);
if (r) if (r && !_changed[i])
err = r->write(re); err = r->write(re);
} }
// rewrite: // 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--) for (int i = _nfiles - 1; err == NOERR && i >= 0 ; i--)
{ {
TRecord_array * r = (TRecord_array *)_files.objptr(i); TRecord_array * r = (TRecord_array *)_files.objptr(i);
if (r) if (r && !_changed[i])
err = r->write(re); err = r->write(re);
} }
} }
@ -131,7 +138,7 @@ TRecord_array & TMultiple_rectype::body(int logicnum) const
{ {
const int index = log2ind(logicnum); 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]); ((TMultiple_rectype *) this)->load_rows_file(_logicnums[index]);
return (TRecord_array &) _files[index]; return (TRecord_array &) _files[index];
} }
@ -175,7 +182,7 @@ void TMultiple_rectype::zero(char c)
TAuto_variable_rectype::zero(c); TAuto_variable_rectype::zero(c);
for (int i = _nfiles - 1; i >= 0 ; i--) for (int i = _nfiles - 1; i >= 0 ; i--)
if (_files.objptr(i) != NULL) 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); int err = TRectype::read(f, op, lockop);
for (int i = _nfiles - 1; i >= 0 ; i--) 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; _nuovo = err != NOERR;
return err; return err;
} }
@ -215,10 +226,11 @@ TMultiple_rectype::TMultiple_rectype(int hfn)
} }
// @ cmember costruttore dal file // @ 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"); CHECK(_nfiles < maxfiles, "Too many files added");
_logicnums[_nfiles] = logicnum; _logicnums[_nfiles] = logicnum;
_autoload[_nfiles] = autoload;
_numfields.add(numfield, _nfiles++); _numfields.add(numfield, _nfiles++);
} }

View File

@ -21,52 +21,67 @@ class TMultiple_rectype ;
class TMultiple_rectype : public TAuto_variable_rectype class TMultiple_rectype : public TAuto_variable_rectype
{ {
enum { maxfiles = 20}; enum { maxfiles = 20};
// @ cmember Array di TRecord array per le righe // @cmember Array di TRecord array per le righe
TArray _files; // TArray _files; //
// @ cmember flag indicatore di record nuovo // @cmember flag indicatore di record nuovo
bool _nuovo; bool _nuovo;
// @ cmember numero di file righe // @cmember numero di file righe
short _nfiles; short _nfiles;
// @ cmember file delle righe // @cmember file delle righe
int _logicnums[maxfiles]; 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; TString_array _numfields;
protected: protected:
const TArray & files() const { return _files;} 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); 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; } 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])); } 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); virtual void load_rows_file(int logicnum);
// @cmember Ritorna l'indice di <p _files> del numero logico passato // @cmember Ritorna l'indice di <p _files> del numero logico passato
int log2ind(int logicnum) const; 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 ; 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; virtual int write_rewrite(TBaseisamfile& f, bool re = FALSE) const;
// @cmember Rimuove un corpo
void remove_body(int logicnum); void remove_body(int logicnum);
// @cmember Associa un file a quello principale
void add_file(int logicnum, const char * numfield,bool autoload=FALSE);
public: public:
//*********************** //***********************
// struttura // 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 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 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; 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(); } 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); } 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); } 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); } 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(); } 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 set_fields(TAuto_variable_rectype & rec) {}
virtual void reset_fields(TAuto_variable_rectype & rec) { rec.remove_field(); } 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 TRectype & r);
virtual TRectype & operator =(const char * r); virtual TRectype & operator =(const char * r);
virtual void zero(char c = '\0'); virtual void zero(char c = '\0');
virtual int read(TRectype & rec, word op = _isequal, word lockop = _nolock); 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); } 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 read(f.curr(), 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 write(TBaseisamfile& f) const { return write_rewrite(f);}
virtual int rewrite(TBaseisamfile& f) const { return write_rewrite(f, TRUE);} 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 rewrite() const { TBaseisamfile f(num()); return rewrite(f);}
int remove() const { TBaseisamfile f(num()); return remove(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); TMultiple_rectype(int hfn);
// @ cmember costruttore dal file // @cmember costruttore dal file
TMultiple_rectype(const TBaseisamfile* file); TMultiple_rectype(const TBaseisamfile* file);
// @ cmember costruttore dal record // @cmember costruttore dal record
TMultiple_rectype(const TRectype & rec); TMultiple_rectype(const TRectype & rec);
// @ cmember costruttore di copia // @cmember costruttore di copia
TMultiple_rectype(const TMultiple_rectype& r); TMultiple_rectype(const TMultiple_rectype& r);
virtual ~TMultiple_rectype() {} virtual ~TMultiple_rectype() {}
}; };