1997-06-03 16:06:27 +00:00
|
|
|
|
#ifndef __MULTIREC_H
|
|
|
|
|
#define __MULTIREC_H
|
|
|
|
|
|
|
|
|
|
#ifndef __RELATION_H
|
|
|
|
|
#include <relation.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef __RECARRAY_H
|
|
|
|
|
#include <recarray.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef __VARREC_H
|
|
|
|
|
#include <varrec.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
class TMultiple_rectype ;
|
|
|
|
|
//**************************************
|
|
|
|
|
// classe per il controllo dei record composti da una testata e N file di righe
|
|
|
|
|
// <20> implementato come un TRectype che contiene anche un TRecord_array
|
|
|
|
|
//
|
|
|
|
|
class TMultiple_rectype : public TAuto_variable_rectype
|
|
|
|
|
{
|
|
|
|
|
enum { maxfiles = 20};
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember Array di TRecord array per le righe
|
1997-06-03 16:06:27 +00:00
|
|
|
|
TArray _files; //
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember flag indicatore di record nuovo
|
1997-06-03 16:06:27 +00:00
|
|
|
|
bool _nuovo;
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember numero di file righe
|
1997-06-03 16:06:27 +00:00
|
|
|
|
short _nfiles;
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember file delle righe
|
1997-06-03 16:06:27 +00:00
|
|
|
|
int _logicnums[maxfiles];
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember Indicazione di record array non pi<70> corrispondente alla testata
|
|
|
|
|
bool _changed[maxfiles];
|
|
|
|
|
// @cmember Indicazione autoload
|
|
|
|
|
bool _autoload[maxfiles];
|
|
|
|
|
// @cmember Array di nomi di campo "numeratore" delle righe
|
1997-06-03 16:06:27 +00:00
|
|
|
|
TString_array _numfields;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
const TArray & files() const { return _files;}
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember funzione per costruire la chiave delle righe
|
1997-06-06 10:32:05 +00:00
|
|
|
|
virtual void set_body_key(TRectype & rowrec);
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember setta la chiave della testata ad un valore nuovo (next-key)
|
1997-06-06 09:01:02 +00:00
|
|
|
|
virtual bool renum() { return FALSE; }
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember renumera le chiavi di tutti i corpi in base alla testata
|
|
|
|
|
virtual void renum_key();
|
|
|
|
|
// @cmember Genera il record del corpo
|
1997-06-03 16:06:27 +00:00
|
|
|
|
virtual TRectype & get_body_record(int logicnum = 0) { return *(new TRectype(logicnum ? logicnum : _logicnums[0])); }
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember Crea e carica il record array del corpo
|
1997-06-03 16:06:27 +00:00
|
|
|
|
virtual void load_rows_file(int logicnum);
|
|
|
|
|
// @cmember Ritorna l'indice di <p _files> del numero logico passato
|
|
|
|
|
int log2ind(int logicnum) const;
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember RIcerca la prima occorenza del corpo con fieldname uguale a s
|
1997-06-03 16:06:27 +00:00
|
|
|
|
virtual int find(int logicnum, const char * fieldname, const char * s, int from = 0, bool reverse = FALSE) const ;
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember Scrive/riscrive un corpo
|
1997-06-03 16:06:27 +00:00
|
|
|
|
virtual int write_rewrite(TBaseisamfile& f, bool re = FALSE) const;
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember Rimuove un corpo
|
1997-06-03 16:06:27 +00:00
|
|
|
|
void remove_body(int logicnum);
|
|
|
|
|
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember Associa un file a quello principale
|
1997-06-09 09:34:12 +00:00
|
|
|
|
void add_file(int logicnum, const char * numfield);
|
1997-06-03 16:06:27 +00:00
|
|
|
|
public:
|
|
|
|
|
//***********************
|
|
|
|
|
// struttura
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember restituisce il record di testata
|
1997-06-03 16:06:27 +00:00
|
|
|
|
const TAuto_variable_rectype& head() const { return *this; } // Ritorna la testata del documento
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember restituisce il record di testata
|
1997-06-03 16:06:27 +00:00
|
|
|
|
TAuto_variable_rectype& head() { return *this; } // Ritorna la testata del documento
|
|
|
|
|
|
|
|
|
|
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember restituisce il record array del corpo
|
1997-06-03 16:06:27 +00:00
|
|
|
|
TRecord_array & body(int logicnum = 0) const;
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember restituisce il numero di record nel corpo
|
1997-06-03 16:06:27 +00:00
|
|
|
|
int rows(int logicnum = 0) const { return body(logicnum).rows(); }
|
|
|
|
|
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember restituisce il record n-esimo del del corpo
|
1997-06-03 16:06:27 +00:00
|
|
|
|
virtual const TRecord_array & operator[](int logicnum) const { return (const TRecord_array &)((TMultiple_rectype *)this)->body(logicnum); }
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember restituisce il record n-esimo del del corpo
|
1997-06-03 16:06:27 +00:00
|
|
|
|
virtual TRecord_array & operator[](int logicnum) { return (TRecord_array &)body(logicnum); }
|
|
|
|
|
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember distrugge una riga del record array del corpo
|
1997-06-03 16:06:27 +00:00
|
|
|
|
bool destroy_row(int n, bool pack = FALSE, int logicnum = 0) { return body(logicnum).destroy_row(n, pack); }
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember distrugge tutte le righe del record array del corpo
|
1997-06-03 16:06:27 +00:00
|
|
|
|
void destroy_rows(int logicnum = 0) { body(logicnum).destroy_rows(); }
|
|
|
|
|
|
1997-06-09 09:34:12 +00:00
|
|
|
|
// @cmember Abilita il caricamento del corpo <par lognum> insieme alla testata
|
|
|
|
|
void enable_autoload(int lognum,bool on =TRUE);
|
|
|
|
|
// @cmember Restituisce il flag di caricamento del corpo <par lognum> insieme alla testata
|
|
|
|
|
bool autoload_enabled(int lognum);
|
|
|
|
|
|
1997-06-03 16:06:27 +00:00
|
|
|
|
//***********************
|
|
|
|
|
// record e I/O
|
|
|
|
|
virtual void dirty_fields() {}
|
|
|
|
|
virtual void set_fields(TAuto_variable_rectype & rec) {}
|
|
|
|
|
virtual void reset_fields(TAuto_variable_rectype & rec) { rec.remove_field(); }
|
|
|
|
|
|
|
|
|
|
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);
|
1997-06-06 16:37:06 +00:00
|
|
|
|
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); }
|
1997-06-03 16:06:27 +00:00
|
|
|
|
|
1997-06-06 09:01:02 +00:00
|
|
|
|
virtual int write(TBaseisamfile& f) const { return write_rewrite(f);}
|
|
|
|
|
virtual int rewrite(TBaseisamfile& f) const { return write_rewrite(f, TRUE);}
|
1997-06-03 16:06:27 +00:00
|
|
|
|
virtual int remove(TBaseisamfile& f) const;
|
|
|
|
|
|
|
|
|
|
int write() const { TBaseisamfile f(num()); return write(f);}
|
|
|
|
|
int rewrite() const { TBaseisamfile f(num()); return rewrite(f);}
|
|
|
|
|
int remove() const { TBaseisamfile f(num()); return remove(f);}
|
|
|
|
|
|
|
|
|
|
//**************************
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember costruttore dal numero del file
|
1997-06-03 16:06:27 +00:00
|
|
|
|
TMultiple_rectype(int hfn);
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember costruttore dal file
|
1997-06-03 16:06:27 +00:00
|
|
|
|
TMultiple_rectype(const TBaseisamfile* file);
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember costruttore dal record
|
1997-06-03 16:06:27 +00:00
|
|
|
|
TMultiple_rectype(const TRectype & rec);
|
1997-06-06 16:37:06 +00:00
|
|
|
|
// @cmember costruttore di copia
|
1997-06-03 16:06:27 +00:00
|
|
|
|
TMultiple_rectype(const TMultiple_rectype& r);
|
|
|
|
|
virtual ~TMultiple_rectype() {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif
|