#ifndef __MULTIREC_H #define __MULTIREC_H #ifndef __RELATION_H #include #endif #ifndef __RECARRAY_H #include #endif #ifndef __VARREC_H #include #endif class TMultiple_rectype ; //************************************** // classe per il controllo dei record composti da una testata e N file di righe // è implementato come un TRectype che contiene anche un TRecord_array // class TMultiple_rectype : public TAuto_variable_rectype { enum { maxfiles = 20}; // @ cmember Array di TRecord array per le righe TArray _files; // // @ cmember flag indicatore di record nuovo bool _nuovo; // @ cmember numero di file righe short _nfiles; // @ cmember file delle righe int _logicnums[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 virtual void set_body_key(TRectype & rowrec) pure; // @ cmember renumber la chiave del corpo virtual long renum(long numdoc = -1) { return -1; } virtual TRectype & get_body_record(int logicnum = 0) { return *(new TRectype(logicnum ? logicnum : _logicnums[0])); } virtual void load_rows_file(int logicnum); // @cmember Ritorna l'indice di

del numero logico passato int log2ind(int logicnum) const; virtual int find(int logicnum, const char * fieldname, const char * s, int from = 0, bool reverse = FALSE) const ; virtual int write_rewrite(TBaseisamfile& f, bool re = FALSE) const; void remove_body(int logicnum); public: //*********************** // struttura // @ 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 TAuto_variable_rectype& head() { return *this; } // Ritorna la testata del documento // @ cmember restituisce il record array del corpo TRecord_array & body(int logicnum = 0) const; // @ 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 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 virtual TRecord_array & operator[](int logicnum) { return (TRecord_array &)body(logicnum); } bool destroy_row(int n, bool pack = FALSE, int logicnum = 0) { return body(logicnum).destroy_row(n, pack); } void destroy_rows(int logicnum = 0) { body(logicnum).destroy_rows(); } //*********************** // 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 void renum_key(const char * kfield,const char * val); 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 write(TBaseisamfile& f) const; virtual int rewrite(TBaseisamfile& f) const; 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);} void add_file(int logicnum, const char * numfield); //************************** // @ cmember costruttore dal numero del file TMultiple_rectype(int hfn); // @ cmember costruttore dal file TMultiple_rectype(const TBaseisamfile* file); // @ cmember costruttore dal record TMultiple_rectype(const TRectype & rec); // @ cmember costruttore di copia TMultiple_rectype(const TMultiple_rectype& r); virtual ~TMultiple_rectype() {} }; #endif