#ifndef __FILES_H #define __FILES_H #ifndef __EXTCTYPE_H #include #endif #ifndef __RECTYPES_H #include #endif #ifndef __CONFIG_H class TConfig; #endif #define DESCPAR "FieldDescr" #define DESCTAB "TabDescr" #define DESCDIR "recdesc" // @doc EXTERNAL // @class TDir | Classe per la gestione del file "dir.gen" // // @base public | TObject class TDir : public TObject // @author:(INTERNAL) Alessandro // @access:(INTERNAL) Private Member { TString _name; RecNoType _eod; RecNoType _eox; int _len; int _flags; TString _des; // @cmember:(INTERNAL) Descrittore del file FileDes _dir; // @cmember:(INTERNAL) Numero di file presenti int _num; // @cmember:(INTERNAL) Appartenenza al direttorio comune (TRUE) o a quello della ditta bool _com; // @access Public Member public: // @cmember Aggiorna l'oggetto TDir con i paramtri del file indicato void get(int nfile, TReclock lock = _nolock, TDirtype dirtype = _nordir, TDirop op = _nordirop); // @cmember Aggiorna il file indicato con i parametri passati void put(int nfile, TDirtype dirtype = _nordir, TDirop op = _nordirop); // @cmember load external isamfile info void get_ext(int nfile); // @cmember Azzera i parametri del file selezionato void zero(); // @cmember Setta il nome del file void set_name (const char * name); // @cmember Setta l'EOX del file void set_eox(const RecNoType eox); void reset_eox(); // @cmember Setta l'EOD del file void set_eod(const RecNoType eod); // @cmember Setta la lunghezza del file void set_len(const UINT16 len); void set_flags(const RecNoType f); // @cmember Setta il file con i parametri passati void set (const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc); // @cmember Stampa la descrizione del direttorio sull'output selezionato virtual void print_on(ostream& out) const; // @cmember Legge la descrizione del direttorio dall' input selezionato virtual void read_from(istream& in); // @cmember Ritorna il nome del file selezionato const char* name() const; // @cmember Ritorna il nome dei file dati selezionato const char* filename() const; // @cmember Ritorna la descrizione del file selezionato const char* des() const; // @cmember Ritorna la descrizione della tabella static const char* tab_des(const char* tabname); // @cmember Ritorna l'espressione associata al file selezionato const char* expr() const; // @cmember Ritorna l'EOD del file selezionato TRecnotype eod() const; // @cmember Ritorna l'EOX del file selezionato TRecnotype eox() const; // @cmember Ritorna il flag del file selezionato long flags() const; // @cmember Ritorna la lunghezza del tracciato record in bytes word len() const; // @cmember Ritorna lo stato d'errore del file int status(TDirtype dirtype = _nordir) const ; // @cmember Ritorna il numero di file presenti int num() const { return _num;} // @cmember Ritorna il numero di file presenti nella directory

int items(TDirtype dirtype = _nordir) const; // @cmember Ritorna il descrittore del file "dir.gen" //const FileDes& filedesc() const { return _dir; } //FileDes& filedesc() { return _dir; } // @cmember Controlla se il file appartiene ai dati comuni. Valido solo se // la get e' stata effettuata con _sysdirop bool is_com() const { return _com; } // @cmember Controlla se il file appartiene alla ditta. Valido solo se // la get e' stata effettuata con _sysdirop bool is_firm() const { return !_com; } // @cmember Controlle se il file e' valido (nome esistente e dimensione // diversa da 0) bool is_valid() const { return name()[0] > ' ' && len() > 0; } // @cmember Controlla se il file e' attivato dalla chiave hardware. // Valido solo se prefhnd e settato a "" bool is_active() const; // @cmember Duplica il tracciato record virtual TObject* dup() const { return new TDir(*this);} // @cmember Costruttore di copia TDir(const TDir & d); // @cmember Costruttore "sicuro" TDir(int logicnum); // @cmember Costruttore TDir(); // @cmember Distruttore virtual ~TDir(); }; // @doc EXTERNAL class TFieldDes : public TSortable { TString16 _name; word _len; word _dec; word _offset; public: inline TString & name() { return _name; } inline word & len() { return _len; } inline word & dec() { return _dec; } inline word & offset() { return _offset; } TFieldDes() : _name(""), _len(0), _dec(0), _offset(0) {} TFieldDes(const char * name, word len, word dec, word offset) : _name(name), _len(len), _dec(dec), _offset(offset) {} TFieldDes(const TFieldDes & fd) : _name(fd._name), _len(fd._len), _dec(fd._dec), _offset(fd._offset) {} ~TFieldDes() {} }; class TKeyDes : public TSortable { bool _dupkeys; TArray _fields; public: inline bool & dupkeys() { return _dupkeys; } void set_field(const TToken_string & field) { _fields.insert(field); } inline TString fieldname(int i) { return _fields.objptr(i) != NULL ? ((TToken_string &)_fields[i]).get(0) : EMPTY_STRING; } inline byte from(int i) { return _fields.objptr(i) != NULL ? ((TToken_string &)_fields[i]).get_int(1) : 0; } inline byte to(int i) { return _fields.objptr(i) != NULL ? ((TToken_string &)_fields[i]).get_int(2) : 0; } TKeyDes(bool dupkeys = false) : _dupkeys(dupkeys) {} TKeyDes(const TKeyDes & kd) : _dupkeys(kd._dupkeys), _fields(kd._fields) {} ~TKeyDes() {} }; // @class TTrec | Classe per le gestione dei tracciati record dei file // // @base public | TSortable class TTrec : public TSortable // @author:(INTERNAL) Alessandro // @access:(INTERNAL) Private Member { TArray _fields; TPointer_array _sorted_fields; TArray _keys; // @cmember:(INTERNAL) Descrittore del tracciato record RecDes _rec; // @cmember:(INTERNAL) Numero del file di appartenenza int _num; // @cmember:(INTERNAL) Puntatore al TConfig delle descrizioni TConfig* _des; // @cmember:(INTERNAL) Nome della tabella TString _tab; // @access Protected Member protected: // @cmember Permette di comparare due oggetti (vedi classe ) int compare(const TSortable& a) const; // @access Public Member public: // @cmember Assegna all'oggetto TTrec il tracciato record del file indicato void get(int nfile, TDirtype dirtype = _nordir); // @cmember Setta il file indicato con il tracciato record dell'oggetto void put(int nfile, TDirtype dirtype = _nordir); // @cmember Azzera il tracciato record void zero(); // @cmember Costruisce i puntatori per la ricerca dei campi void rehash(); // @cmember Ritorna lo stato di errore del file int status(TDirtype dirtype = _nordir) const ; // @cmember Ritorna il numero del file int num() const { return _num;} // @cmember Cambia il numero del file void set_num(int num) {_num = num;} // @cmember Ritorna il numero del campo

int field(const char* fieldname) const; // @cmember Ritorna il descrittore del tracciato record const RecDes& rec() const { return _rec;} RecDes& rec() { return _rec;} // @cmember Assegna un oggetto TTrec TTrec& operator =(const TTrec& b); // @cmember Ritorna il numero di campi del tracciato record int fields() const { return _rec.NFields; } // @cmember Ritorna il numero di chiavi di ordinamento del tracciato record int keys() const { return _rec.NKeys; } // @cmember Assegna il numero di campi del tracciato record void set_fields(int nfields) { _rec.NFields = short(nfields);} // @cmember Assegna il numero di chiavi di ordinamento del tracciato record void set_keys(int nkeys) { _rec.NKeys = short(nkeys);} // @cmember Ritorna una token string contenente la descrizione del campo const char* fielddef(int fld) const; // @cmember Ritorna una stringa contenente la chiave const char* keydef(int key = 0) const; // @cmember Ritorna la lunghezza del record int len() const; #ifndef FOXPRO // @cmember Aggiorna la chiave.

e' una token string void update_keydef(int key, const char * e, const bool dup); // @cmember Aggiorna la chiave.

e' una token string void update_keydef(int key, TToken_string& desc); // @cmember Aggiunge una chiave.

e' una token string void add_keydef(TToken_string& desc) { update_keydef(-1, desc); } // @cmember Aggiunge una chiave.

e' una token string void add_keydef(const char * e, const bool dup) { update_keydef(-1, e, dup); } // @cmember Aggiorna il campo. void update_fielddef(int nfld, const char * name, int type, int len = 0, int dec = 0); // @cmember Aggiorna il campo.

e' una token string void update_fielddef(int nfld, TToken_string& desc); // @cmember Aggiorna il campo. void update_fielddef(int nfld, const RecDes & rd, const char * name); // @cmember Aggiunge un campo.

e' una token string void add_fielddef(TToken_string& desc) { update_fielddef(-1, desc); } // @cmember Aggiunge un campo. void add_fielddef(const char * name, int type, int len = 0, int dec = 0) { update_fielddef(-1, name, type, len, dec); } // @cmember Aggiunge un campo. void add_fielddef(const RecDes & rd, const char * name) { update_fielddef(-1, rd, name); } // @cmember Stampa il tracciato record sull'output selezionato virtual void print_on(ostream& out) const; // @cmember Legge il tracciato record da input selezionato virtual void read_from(istream& in); void set_des(TConfig* c = NULL, const char* tab = "") { _des = c; _tab = tab;} void set_name(const char * name, int pos = -1); #endif // @cmember Duplica il descrittore di file virtual TObject* dup() const { return new TTrec(*this);} // @cmember Costruttore TTrec(const TTrec & r); // @cmember Costruttore TTrec(int logicnum, TDirtype dirtype = _nordir); TTrec(); // @cmember Distruttore virtual ~TTrec(); }; #endif // __FILES_H