diff --git a/include/applicat.h b/include/applicat.h index 4fb4f6a88..af779f2ef 100755 --- a/include/applicat.h +++ b/include/applicat.h @@ -13,7 +13,7 @@ // Classe TApplication // @END -#define MSG_AI "AI" // message auto_insert (relapp) +#define MSG_AI "AI" // message auto_insert (relapp) #define MSG_FS "FS" // message filtered start (relapp) #define MSG_LN "LN" // message (printapp -> relapp) #define CHK_ALL -1 // all authorization checks diff --git a/include/array.h b/include/array.h index f600ea92c..00ce5a12e 100755 --- a/include/array.h +++ b/include/array.h @@ -30,7 +30,7 @@ typedef bool (*CONDITION_FUNCTION) ( const TObject& ); typedef void (*OPERATION_FUNCTION) ( const TObject& ); -// @class TContainer | Generico contenitore ad accesso casuale( con indice ) +// @class TContainer | Generico contenitore ad accesso casuale (con indice) // @base public | TObject class TContainer : public TObject @@ -38,7 +38,7 @@ class TContainer : public TObject // @access Private Member private: - + CONDITION_FUNCTION _last_condition; // @access Public Member diff --git a/include/brwapp.h b/include/brwapp.h index 7739d9ca5..a212dfb15 100755 --- a/include/brwapp.h +++ b/include/brwapp.h @@ -5,16 +5,29 @@ #include #endif +// @doc EXTERNAL +// @class TBrowse_application | Classe per applicazioni di visualizzazione archivi +// +// @base public | TRelation_application class TBrowse_application : public TRelation_application +// @author(:INTERNAL) Nicola + { +// @access Protected Member protected: - virtual bool main_loop(); // Ciclo principale + // @cmember Ciclo principale + virtual bool main_loop(); +// @access Public Member public: - TBrowse_application() {} - virtual ~TBrowse_application() {} + // @cmember Costruttore + TBrowse_application() + {} + // @cmember Distruttore + virtual ~TBrowse_application() + {} }; #endif diff --git a/include/confapp.cpp b/include/confapp.cpp index 72f038658..87c8c85c7 100755 --- a/include/confapp.cpp +++ b/include/confapp.cpp @@ -6,6 +6,8 @@ #define comunque +// @doc EXTERNAL + bool TConfig_application::create() { TApplication::create(); @@ -143,10 +145,22 @@ bool TConfig_application::postprocess_config (TMask& mask, TConfig& config) return TRUE; } -bool TConfig_application::postprocess_config_changed(const char* par, - const char* var, - const char* oldv, - const char* newv) +// @mfunc Simile alla , ma viene usata +// dalla maschera principale. +// +// @rdesc Ritorna i seguenti valori: +// +// @flag TRUE | Se la modifica viene acettatta (dafault) +// @flag FALSE | Se la modifica non viene accettata +bool TConfig_application::postprocess_config_changed( + const char* par, // @parm Paragrafo in corso di editing + const char* var, // @parm vedi TApplication!!! + const char* oldv, // @parm vedi TApplication!!! + const char* newv) // @parm vedi TApplication!!! + +// @comm Rispetto alla le viene passato in piu' il paragrafo +// in corso di editing. E' chiamata per ogni parametro modificato + { return TRUE; } diff --git a/include/confapp.h b/include/confapp.h index efc16ced6..e1a619a89 100755 --- a/include/confapp.h +++ b/include/confapp.h @@ -13,69 +13,80 @@ #include #endif -// le applicazioni di questo tipo servono a leggere - scrivere - modificare -// files di configurazione. La linea di comando e' -// -// [-f ] [-d] [, ...] -// -// dopo -f si dara' il nome file che si vuole editare, default e' CONFIG_FILE -// definito in config.h. Se si da' -d viene considerato quello relativo alla -// ditta corrente, che viene creato copiando il principale se non c'e'. -// Quindi si da' la lista dei paragrafi che si vuole editare; se non ne vengono -// dati sara' il modulo corrente preso dal nome dell'applicazione. Se si -// indicano piu' paragrafi questi vengono assegnati nell'ordine alle voci -// di menu (da mettere nell'URL) da 1 in poi. La maschera usata e' la -// EditMask specificata nel paragrafo; se non c'e', nothing happens -// Ogni modifica puo' essere controllata e porcessata con la postprocess_ -// config (vedi sotto) che agisce come la change_config di application. -// La voce Scelta parametri di Application rimane come prima. +// @doc EXTERNAL +// @class TConfig_application | le applicazioni di questo tipo servono a leggere - +// scrivere - modificare files di configurazione. +// +// @base public | TApplication class TConfig_application : public TApplication -{ - TArray _paragraphs; - int _which_config; +// @author:(INTERNAL) Villa +// +// @comm La linea di comando e' +// +// app [-f filename] [-d] [paragraph, ...] +// +// dopo

si dara' il nome file che si vuole editare, default e' CONFIG_FILE +// definito in config.h. +// Se si da'

viene considerato quello relativo alla +// ditta corrente, che viene creato copiando il principale se non c'e'. +// Quindi si da' la lista dei paragrafi che si vuole editare; se non ne vengono +// dati sara' il modulo corrente preso dal nome dell'applicazione. Se si +// indicano piu' paragrafi questi vengono assegnati nell'ordine alle voci +// di menu (da mettere nell'URL) da 1 in poi. La maschera usata e' la +// EditMask specificata nel paragrafo; se non c'e', non accade nulla +// Ogni modifica puo' essere controllata e porcessata con la +// che agisce come la . +// La voce Scelta parametri di rimane come prima. + +// @access Private Member +{ + // @cmember Array di paragrafi da editare + TArray _paragraphs; + // @cmember Numero del file di configurazione da modificare + int _which_config; + // @cmember Ultima voce di menu' selezionata MENU_TAG _last_choice; + // @cmember Crea la finestra principale (vedi ) virtual bool create(); + // @cmember Rimuove l'applicazione (vedi ) virtual bool destroy(); + // @cmember Controlla il menu' (vedi ) virtual bool menu(MENU_TAG); - - void do_config(int m); + // @cmember Permette di modificare la configurazione del paragrafo

+ void do_config(int m); + +// @access Protected Member protected: - - virtual bool user_create() { return TRUE; } - virtual bool user_destroy() { return TRUE; } + // @cmember Ritorna TRUE + virtual bool user_create() + { return TRUE; } + // @cmember Ritorna TRUE + virtual bool user_destroy() + { return TRUE; } - // questa viene chiamata prima della run() e ferma tutto se ritorna - // FALSE + // @cmember Viene chiamata prima della e ferma tutto se ritorna FALSE virtual bool preprocess_config (TMask& mask, TConfig& config); - // questa viene chiamata dopo e blocca tutto se FALSE + // @cmember Viene chiamata dopo la e blocca tutto se ritorna FALSE virtual bool postprocess_config (TMask& mask, TConfig& config); - // questa e' come la change_config di application ma viene usata - // dalla maschera principale; le viene passato in piu' il paragrafo - // in corso di editing. E' chiamata per ogni parametro modificato - // Se ritorna FALSE la modifica non viene accettata; default ritorna - // TRUE e non rompe i bal - virtual bool postprocess_config_changed (const char* par, const char* var, - const char* oldv, const char* newv); + // @cmember Simile alla , ma viene usata + // dalla maschera principale. + virtual bool postprocess_config_changed (const char* par, const char* var, const char* oldv, const char* newv); - +// @access Public Member public: - - TConfig_application(int which_config = CONFIG_GENERAL) - : _which_config(which_config) - {} + // @cmember Costruttore + TConfig_application(int which_config = CONFIG_GENERAL) : _which_config(which_config) + {} + // @cmember Distruttore virtual ~TConfig_application() {} }; #endif - - - - diff --git a/include/config.h b/include/config.h index a690f0163..ea2f88427 100755 --- a/include/config.h +++ b/include/config.h @@ -120,9 +120,9 @@ public: // @cmember Riempie pl con la lista dei paragrafi int list_paragraphs(TString_array& pl); - // @cmember Riempie vl con la lista dei nomi delle variabili + // @cmember Riempie

con la lista dei nomi delle variabili // nella sezione corrente o in quella indicata; se - // add_value e' TRUE ci mette "variabile|valore" + // add_value e' TRUE ci mette "variabilevalore" // ACHTUNG: l'array e' in ordine HASH (CAZZ) int list_variables(TString_array& vl, bool add_value = FALSE, const char* section = NULL); diff --git a/include/isam.cpp b/include/isam.cpp index 1a7f1d860..ca4d15258 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -1187,7 +1187,7 @@ void TBaseisamfile::indexoff() // @mfunc Apre il file isam di base con lock // // @rdesc Ritorna NOERR se e' riuscita ad aprire il file, altrimenti ritorna il numero di errore -// generato (vedi ). +// generato (vedi ). int TBaseisamfile::_open( unsigned int mode) // @parm Indica il modo di apertura del file (default _manulock) @@ -1423,10 +1423,10 @@ TIsamfile::~TIsamfile() } -// @cmember Aggiorna i flags associati al file +// @mfunc Aggiorna i flags associati al file // // @rdesc Ritorna NOERR se e' riuscita ad eseguiore l'operazione, altrimenti ritorna il numero -// di errore generato (vedi ). +// di errore generato (vedi ). int TIsamfile::flags( bool updateeod) // @parm Indica se aggiornare anche l'EOD del file @@ -1518,7 +1518,7 @@ TIsamtempfile::~TIsamtempfile() // @mfunc Apre il file // // @rdesc Ritorna NOERR se e' riuscita ad aprire il file, altrimenti ritorna il numero di errore -// generato (vedi ). +// generato (vedi ). int TIsamtempfile::open( const char* radix, // @parm Radice del path del file bool create, // @parm Indica se va creatoun nuovo file (se FALSE il file esiste gia') @@ -1709,7 +1709,7 @@ long TSystemisamfile::size(TRecnotype eox) // @flag FALSE | Se è stato rilevato un errore durante la conversione (viene emesso un ) bool TSystemisamfile::exec_convapp( long flev, // @parm Livello a cui aggiornare l'archivio - const bool before) // @parm SANDRO??? + const bool before) // @parm Indica se viene chiamata prima o dopo la conversione { const char * const v = before ? "BCNV" : "ACNV"; @@ -1744,7 +1744,14 @@ bool TSystemisamfile::exec_convapp( return TRUE; } -bool TSystemisamfile::getlcf(long flev) +// @mfunc Recupera le conversioni logiche da effettuare sul file +// +// @rdesc Ritorna TRUE se occorre effettuare la conversione sul file +bool TSystemisamfile::getlcf( + long flev) // @parm livello archivi di partenza della convesione + +// @comm Recupera le conversioni logiche da effettuare sul file per per passare dal +// livello archivi

a quello attuale degli archivi standard. { _flds.destroy(); @@ -1795,7 +1802,7 @@ void TSystemisamfile::makelc(TRectype& rec) // @mfunc Esegue la conversione del tracciato record del file // // @rdesc Ritorna il risulato della conversione, altrimenti il codice di errore generato -// (vedi ) +// (vedi ) int TSystemisamfile::update( TTrec& newrec, // @parm Nuovo tracciato record con cui aggiornare il file bool vis) // @parm Indica se visualizzare lo stato dell'operazione @@ -1947,7 +1954,7 @@ int TSystemisamfile::update( // @mfunc Rimuove fisicamente i record cancellati // // @rdesc Ritorna NOERR se l'operazione di compattamento e' riuscita, altrimenti il codice di -// di errore generato (vedi ). +// di errore generato (vedi ). int TSystemisamfile::packfile( bool vis) // @parm Indica se visualizzare lo stato dell'operazione @@ -1972,7 +1979,7 @@ int TSystemisamfile::packfile( // @mfunc Rimuove fisicamente gli indici cancellati // // @rdesc Ritorna NOERR se l'operazione di compattamento e' riuscita, altrimenti il codice di -// di errore generato (vedi ). +// di errore generato (vedi ). int TSystemisamfile::packindex( bool vis) // @parm Indica se visualizzare lo stato dell'operazione @@ -2016,14 +2023,17 @@ int TSystemisamfile::pack(bool vis) // @mfunc Importa un file ascii // // @rdesc Ritorna NOERR se l'operazione di lettura e' riuscita, altrimenti il codice di -// di errore generato (vedi ). +// di errore generato (vedi ). int TSystemisamfile::load( const char* from, // @parm Nome del file da importare char fs, // @parm Carattere separatore di campo (default ) char fd, // @parm Carattere delimitatore di campi (default '\\0') char rs, // @parm Carattere separatore di record (default '\\n') bool vis, // @parm Indica se visualizzare lo stato dell'operazione (default TRUE) - bool extended) // @parm SANDRO???(default FALSE) + bool extended) // @parm Indica se interpretare alcune stringhe come macro (default FALSE) + +// @comm Se

e' TRUE e trova alcune stringhe col formato %stringa% (es. %frm%) +// ne sostituisce i valori (es. ditta corrente). // @xref @@ -2205,7 +2215,7 @@ int TSystemisamfile::load( // @mfunc Esporta VERSO un file ascii. // // @rdesc Ritorna NOERR se l'operazione di esportazione e' riuscita, altrimenti il codice di -// di errore generato (vedi ). +// di errore generato (vedi ). int TSystemisamfile::dump( const char* to, // @parm Nome del file verso quale esportare int nkey, // @parm Numero della chiave di ordinamento con cui scaricare i dati (defualt 1) diff --git a/include/isam.h b/include/isam.h index cc91c11a4..54e33dc4a 100755 --- a/include/isam.h +++ b/include/isam.h @@ -60,7 +60,7 @@ class TRectype; // // @base public | TObject class TMemo_info : public TObject -// @author(:INTERNAL) Sandro +// @author:(INTERNAL) Sandro { // @access Private Member @@ -115,7 +115,7 @@ public: // @base public | TSortable class TRectype : public TSortable -// @author(:INTERNAL) Sandro +// @author:(INTERNAL) Sandro { // @cfriend TExtrectype @@ -329,14 +329,14 @@ public: }; -// @class TRectype | Classe per la definizione del file isam di base +// @class TBaseisamfile | Classe per la definizione del file isam di base // // @base public | TObject class TBaseisamfile : public TObject -// @author(:INTERNAL) Sandro +// @author:(INTERNAL) Sandro -// @access Provate Member +// @access Private Member { // @cmember Descrittore del file isam isdef* _isamfile; @@ -417,31 +417,31 @@ public: // @cmember Setta la variabiel

void setstatus(int status) { _lasterr = status; } - // @cmember Si posiziona sul primo record del file (vedi ) + // @cmember Si posiziona sul primo record del file (vedi ) virtual int first(word lockop = _nolock); - // @cmember Si posiziona sull'ultimo record del file (vedi ) + // @cmember Si posiziona sull'ultimo record del file (vedi ) virtual int last(word lockop = _nolock); - // @cmember Si posiziona sul successivo record del file (vedi ) + // @cmember Si posiziona sul successivo record del file (vedi ) virtual int next(word lockop = _nolock); // @cmember Si posiziona sul successivo record del file (UNUSED) virtual int next(TDate& atdate); - // @cmember Si posiziona sul precedente record del file (vedi ) + // @cmember Si posiziona sul precedente record del file (vedi ) virtual int prev(word lockop = _nolock); // @cmember Si posiziona sul precedente record del file (UNUSED) virtual int prev(TDate& atdate); - // @cmember Rilegge l'ultimo record letto (vedi ) + // @cmember Rilegge l'ultimo record letto (vedi ) virtual int reread(word lockop = _nolock, TDate& atdate = (TDate&)botime); - // @cmember Rilegge l'ultimo record letto e lo copia in

(vedi ) + // @cmember Rilegge l'ultimo record letto e lo copia in

(vedi ) virtual int reread(TRectype& rec, word lockop = _nolock, TDate& atdate = (TDate&)botime); - // @cmember Salta

record dalla posizione corrente (vedi ) + // @cmember Salta

record dalla posizione corrente (vedi ) virtual int skip(TRecnotype nrec, word lockop = _nolock); - // @cmember Legge il record (vedi e ) + // @cmember Legge il record (vedi e ) virtual int read(word op = _isequal, word lockop = _nolock, TDate& atdate = (TDate&)botime); - // @cmember Legge il record e lo copia in

(vedi e ) + // @cmember Legge il record e lo copia in

(vedi e ) virtual int read(TRectype& rec, word op = _isequal, word lockop = _nolock, TDate& atdate = (TDate&)botime); - // @cmember Legge il record alla posizione

(vedi ) + // @cmember Legge il record alla posizione

(vedi ) virtual int readat(TRecnotype nrec, word lockop = _nolock); - // @cmember Legge il record alla posizione

e lo copia in

(vedi ) + // @cmember Legge il record alla posizione

e lo copia in

(vedi ) virtual int readat(TRectype& rec, TRecnotype nrec, word lockop = _nolock); // @cmember Aggiunge un record virtual int write(TDate& atdate = (TDate&)botime); @@ -608,7 +608,7 @@ public: // @base public | TBaseisamfile class TIsamfile : public TBaseisamfile -// @author(:INTERNAL) Sandro +// @author:(INTERNAL) Sandro { // @access Public Member @@ -633,7 +633,7 @@ public: // @base public | TIsamfile class TSystemisamfile : public TIsamfile -// @author(:INTERNAL) Sandro +// @author:(INTERNAL) Sandro { // @access Private Memebr @@ -643,11 +643,12 @@ class TSystemisamfile : public TIsamfile // @cmember Array di espressione TArray _exps; - // @cmember Ritorna TRUE se la versione dell'archivio e' = di

+ // @cmember Recupera le conversioni logiche da effettuare sul file bool getlcf(long flev); // @cmember Esegue la conversione del file bool exec_convapp(long flev, const bool before); - // @cmember SANDRO??? + // @cmember Esegue la conversione sui record del file (utilizzando le espressione definite + // in fconv.ini) void makelc(TRectype& rec); // @access Public Member @@ -687,7 +688,7 @@ public: // @base public | TBaseisamfile class TLocalisamfile : public TBaseisamfile -// @author(:INTERNAL) Sandro +// @author:(INTERNAL) Sandro { // @access Private Member @@ -730,7 +731,7 @@ public: // @base public | TLocalisamfile class TIsamtempfile : public TLocalisamfile -// @author(:INTERNAL) Sandro +// @author:(INTERNAL) Sandro { // @access Private Member @@ -762,7 +763,7 @@ public: // @base public | TArray class TRec_array : public TArray -// @author(:INTERNAL) Sandro +// @author:(INTERNAL) Sandro { // @access Public Member public: @@ -812,12 +813,12 @@ public: operator int() const ; // @cmember Operatore di estrazione per tipo long operator long() const ; - // @cmember Operatore di estrazione per tipo carattere + // @cmember const char * | operator const char* | | Operatore di estrazione per tipo carattere operator const char*() const ; // @cmember Operatore di estrazione per data operator TDate() const ; #ifndef FOXPRO - // @cmember Operatore di estrazione per real + // @cmember const real | operator const real | | Operatore di estrazione per real operator const real() const ; #endif diff --git a/include/msksheet.cpp b/include/msksheet.cpp index 74d20952e..717997599 100755 --- a/include/msksheet.cpp +++ b/include/msksheet.cpp @@ -14,7 +14,7 @@ const short FIRST_FIELD = 101; // TSpreadsheet /////////////////////////////////////////////////////////// -// @doc EXTERNAL +// @doc INTERNAL // @class TSpreadsheet | Classe per la creazione di uno spreadsheet all'interno // di una maschera @@ -241,6 +241,8 @@ public: virtual ~TSpreadsheet(); }; +// @doc EXTERNAL + // Certified 100% void TSpreadsheet::init() { diff --git a/include/printer.h b/include/printer.h index 629fd6765..c9bdf42ce 100755 --- a/include/printer.h +++ b/include/printer.h @@ -49,7 +49,7 @@ enum TGraphic_shape // @base public | TObject class TPrintrow : public TObject -// @author(:INETRNAL)Villa +// @author:(INTERNAL) Villa // @access Private Member { @@ -125,7 +125,7 @@ public: // @base public | TObject class PrinterDef : public TObject -// @author(:INTERNAL)Villa +// @author:(INTERNAL) Villa // @access Private Member { @@ -173,7 +173,7 @@ public: // @base public | TObject class BkDef : public TObject -// @author(:INTERNAL)Villa +// @author:(INTERNAL) Villa // @comm Questo oggetto e' in grado di costrutire l'intero menu' gerarchico dei bookmark { @@ -215,7 +215,7 @@ class TViswin; // // @base public | TObject class TPrinter : public TObject -// @author(:INTERNAL) Villa +// @author:(INTERNAL) Villa // @access Private Member { @@ -622,7 +622,7 @@ public: // // @base public | TPrinter class TFile_printer : public TPrinter -// @author(:INTERNAL) Nicola +// @author:(INTERNAL) Nicola // @access Private Member { diff --git a/include/relation.cpp b/include/relation.cpp index 0a6f4dd18..f36a9c6c1 100755 --- a/include/relation.cpp +++ b/include/relation.cpp @@ -1,4 +1,4 @@ -// $Id: relation.cpp,v 1.73 1995-12-07 11:13:59 guy Exp $ +// $Id: relation.cpp,v 1.74 1995-12-29 12:09:00 andrea Exp $ // relation.cpp // fv 12/8/93 // relation class for isam files @@ -26,9 +26,10 @@ // *** maximum number of elements in a cursor working page #define CMAXELPAGE 8000 - #define print_name(out, f) out << (f.num() == LF_TABCOM ? "%" : "") << f.name() +// @doc EXTERNAL + extern int get_error(int); HIDDEN const char* field_type_str(TFieldtypes f) @@ -61,7 +62,6 @@ HIDDEN const char* field_type_str(TFieldtypes f) class TRelationdef : public TObject { - // @DPRIV friend class TRelation; const TRelation* _rel; // Relazione padre @@ -74,7 +74,7 @@ class TRelationdef : public TObject TArray _altexprs; // Condizioni di uguaglianza alternative TBit_array _forced; bool _first_match : 1; // primo match (ed esiste) - bool _allow_lock : 1; // ????? + bool _allow_lock : 1; // ?? bool _write_enable : 1; public: // TObject @@ -331,7 +331,15 @@ void TRelation::save_status() } } -int TRelation::log2ind(int log) const +// @mfunc Ritorna l'indice di

del numero logico passato!!! +// +// @rdesc Ritorna l'indice oppure NOTFOUND nel caso non sia presente +int TRelation::log2ind( + int log) const // @parm Numero logico del file di cui conoscere l'indice + +// @comm Nel caso

sia minore di 0 chiama la +// +// @xref { // returns _files index of logical number or NOTFOUND if not present @@ -346,7 +354,14 @@ int TRelation::log2ind(int log) const return NOTFOUND; } -int TRelation::alias2ind(int alias) const +// @mfunc Ritorna l'indice di

del alias del file passato +// +// @rdesc Ritorna l'indice oppure NOTFOUND nel caso non sia presente +int TRelation::alias2ind( + int alias) const // @parm Alias del file di cui conoscere l'indice + + +// @xref { if (alias <= 0) return 0; @@ -359,14 +374,32 @@ int TRelation::alias2ind(int alias) const return NOTFOUND; } -int TRelation::name2ind(const char* name) const +// @mfunc Ritorna l'indice di

del nome del file passato!!! +// +// @rdesc Ritorna l'indice oppure NOTFOUND nel caso non sia presente +int TRelation::name2ind( + const char* name) const // @parm Nome del file di cui conoscere l'indice + +// @xref { const int num = name2log(name); const int ind = log2ind(num); return ind; } -TLocalisamfile& TRelation::lfile(int logicnum) const +// @mfunc Ritorna il descrittore del file +// +// @rdesc Ritorna il reference ad un che indica il descrittore del +// file della relazione +TLocalisamfile& TRelation::lfile( + int logicnum) const // @parm Numero logico del file da ritornare (default 0) + // @parm const char* | name | Nome del file da ritornare +// @syntax TLocalisamfile& lfile(int logicnum) +// @syntax TLocalisamfile& lfile(const char* name) +// +// @comm E' comodo utilizzare anche l'operatore [] che richiama questa funzione con +// la prima sintassi. + { const int idx = log2ind(logicnum); CHECKD(idx != NOTFOUND, "File not found n. ", logicnum); @@ -380,7 +413,21 @@ TLocalisamfile& TRelation::lfile(const char* name) const return (TLocalisamfile&)_files[idx]; } -void TRelation::write_enable(int logicnum, const bool on) +// @mfunc Abilita/disabilita la scrittura sul file +void TRelation::write_enable( + int logicnum, // @parm Numero logico del file da abilitare/disabilitare (default 0) + // @parm cont char* | name | Nome del file da abilitare/disabilitare + const bool on) // @parm Indica l'operazione da effettuare sul file: + // + // @flag TRUE | Abilita la scrittura sul file (default) + // @flag FALSE | Disabilita la scrittura sul file + +// @syntax void write_enable(int logicnum, const bool on) +// @syntax void write_enable(const char* name, const bool on) +// +// @comm Nel caso venga passato un numero logico uguale a 0 vengono abilitati/disabilitati tutti +// i file dell relazione + { if (logicnum == 0) @@ -405,8 +452,30 @@ void TRelation::write_enable(const char* name, const bool on) } -bool TRelation::add(TLocalisamfile* f, const char* relexprs, int key, - int linkto, int alias, bool allow_lock) +// @mfunc Aggiunge una nuovo file nella relazione +// +// @rdesc Ritorna se e' riuscito ad aggiungere il file alla relazione +bool TRelation::add( + TLocalisamfile* f, // @parm Descrittore del file da aggiungere + const char* relexprs, // @parm Espressione della relazione + int key, // @parm Chiave del file principale + int linkto, // @parm Posizione a cui aggiungere il file + int alias, // @parm Alias da dare al file da aggiungere + bool allow_lock) // @parm Indica se fare il lock sul file oppure ignorarli + // @parm int | logicnum | Numero logico del file da aggiungere + // @parm const char* | tabname | Nome della tabella da aggiungere + +// @syntax bool add(TLocalisamfile* f, const char* relexprs, int key, int linkto, int alias, bool allow_lock); +// @syntax bool add(int logicnum, const char* relexprs, int key, int linkto, int alias, bool allow_lock); +// @syntax bool add(const char* tabname, const char* relexprs, int key, int linkto, int alias, bool allow_lock); + +// @comm Il parametro

puo' assumere i valori: +// +// @flag 0 | Per il file principale +// @flag 0 | Indica il numero logico del file +// @flag 0 | Indica l'alias del file + + { const int idxto = log2ind(linkto); if (idxto == NOTFOUND) @@ -438,7 +507,10 @@ bool TRelation::add(const char* tabname, const char* relexprs, int key, return add(t, relexprs, key, linkto, alias, allow_lock); } -void TRelation::replace(TLocalisamfile* f, int index) +// @mfunc Sostituisce nella relazione un file!!! +void TRelation::replace( + TLocalisamfile* f, // @parm Descrittore del file sostituto + int index) // @parm Posizione nel quale sostituire il file (default 0) { const TLocalisamfile* p = (const TLocalisamfile*)_files.objptr(index); CHECK(p && p->num() == f->num(), "Can't replace a file with different logic number"); @@ -465,8 +537,22 @@ void TRelation::zero() file(i).zero(); } -int TRelation::position_rels(TIsamop op, TReclock lockop, - TDate& atdate, int first) +// @mfunc Permette di posizionare l'albero di relazioni tra i file +// +// @rdesc Ritorna il numero di errore avvenuto nell'opeerazione, NOERR nel caso +// venga eseguito tutto correttamente +int TRelation::position_rels( + TIsamop op, // @parm Operatore che esegue la relazione (default _isequal) + TReclock lockop, // @parm Tipo di lock sul file (default _nolock) + TDate& atdate, // @parm UNUSED + int first) // @parm Numero del file da cui construtire al relazione (default + // 0, cioe' dal file principale) + +// @comm Viene eseguito tutto il lavoro di creazione delle relazione: se non +// trova un record adatto su un file, svuota il record corrente e non +// ritorna errore. +// Le altre funzioni sul record procedono normalmente + { _errors = NOERR; @@ -529,7 +615,22 @@ int TRelation::position_rels(TIsamop op, TReclock lockop, return _errors; } -bool TRelation::next_match(int logicnum, const char* fieldlist, int nkey) + +// @mfunc Posiziona il numero logico sul record successivo +// +// @rdesc Ritorna se ha trovato la corrispondenza: +// +// @flag TRUE | Corrispondenza trovata +// @flag FALSE | Corrispondenza non trovata +bool TRelation::next_match( + int logicnum, // @parm Numero logico del file da fare avanzare + const char* fieldlist, // @parm Lista dei campi che devono rimanere costanti (default NULL) + int nkey) // @parm Numero della chiave (default 0) + +// @comm Il posizionamento del numero logico non deve essere riferita al file +// principale; in ogni caso viene considerata consistente ad eccezione dei +// casi di inconsistenza nella prima posizione. + { if (logicnum == file().num()) { @@ -612,9 +713,13 @@ bool TRelation::next_match(int logicnum, const char* fieldlist, int nkey) return ok; } -bool TRelation::is_first_match(int logicnum) - // TRUE se c'e' un record ed e' il primo match (non si e' mai fatta - // position_rels) + +// @mfunc Controlla se c'e' un record ed e' il primo match (non si e' mai fatta +// ) +// +// @rdesc Ritorna TRUE se c'e' un record ed e' il primo match +bool TRelation::is_first_match( + int logicnum) // @parm Numero logico del file da controllare { const int i = log2ind(logicnum); CHECKD(i != NOTFOUND,"Nonexistent file referenced in relation ",logicnum); @@ -628,7 +733,25 @@ bool TRelation::is_first_match(int logicnum) #ifdef DBG -bool TRelation::isconsistent(bool reset) +// @mfunc Controlla se la relazione e' corretta +// +// @rdesc Ritorna i seguent valori +// +// @flag TRUE | La relazione soddisfa i criteri di correttezza +// @flag FALSE | La relazione manca di almeno uno di criteri di correttezza +bool TRelation::isconsistent( + bool reset) // @parm Indica se cercare di riportare la relazione ad uno stato + // consistente (default FALSE) + +// @comm Per essere corretta una relazione necessita che tutti i file siano +// corretti, che il record corrente non sia vuoto e che la relazione sia +// consistente +// Se

e' TRUE si cerca di riportare la relazione in uno stato +// consistente (basato sul record principale). Non viene fatto nessun altro +// controllo +// Questa funzione e' chiamata internamente da +// e . + { const int MAXREL = 24; int bad = 0; @@ -748,7 +871,11 @@ HIDDEN bool __evalcondition(const TRelation* r,TExpression* cond) return (bool) *cond; } -FILE* TCursor::open_index(bool create) +// @mfunc Apre il file di indice +// +// @rdesc Ritorna l'handle del file aperto +FILE* TCursor::open_index( + bool create) // @parm Indica se creare l'indice nel caso manchi (default FALSE) { #if XVT_OS == XVT_OS_SCOUNIX const char* const r = "r"; @@ -926,8 +1053,13 @@ TRecnotype TCursor::update() } -void TCursor::filter(const char* fil, const TRectype *from, - const TRectype* to) +// @mfunc Setta il filtro sul cursore +void TCursor::filter( + const char* fil, // @parm Espressione del filtro + const TRectype *from, // @parm Primo record del pacchetto da esaminare + const TRectype* to) // @parm Ultimo record del pacchetto da esaminare + +// @comm ATTENZIONE: non e' possibile filtrare un cursore congelato { CHECK(!_frozen, "Impossibile filtrare un cursore congelato"); @@ -1100,7 +1232,12 @@ TRecnotype TCursor::readrec() return nrec; } -int TCursor::lock(TReclock l) +// @mfunc Mette un lock sul record +// +// @rdesc Ritorna il numero di errore che si verifica nel porre il lock (NOERR) se +// non si verificano errori +int TCursor::lock( + TReclock l) // @parm Tipo di locke da porre sul record (vedi ) { int rt=NOERR; switch(l) @@ -1327,7 +1464,7 @@ TRecnotype TSorted_cursor::buildcursor(TRecnotype rp) return ap; } -int TSorted_cursor::filtercursor(int pagecnt, TRecnotype* page) +int TSorted_cursor::filtercursor(int pagecnt, TRecnotype* page) { int np=0, handle=file().filehnd()->fhnd; @@ -1380,7 +1517,7 @@ int TSorted_cursor::filtercursor(int pagecnt, TRecnotype* page) return np; } -bool TSorted_cursor::changed() +bool TSorted_cursor::changed() { bool rt; @@ -1398,7 +1535,7 @@ bool TSorted_cursor::changed() } -void TSorted_cursor::change_order(const char* order_expr) +void TSorted_cursor::change_order(const char* order_expr) { if (order_expr && *order_expr && order_expr != _order_expr) { @@ -1427,7 +1564,11 @@ TSorted_cursor::~TSorted_cursor() // TFieldRef /////////////////////////////////////////////////////////// -int name2log(const char* name) +// @func Converte una stringa in numero logico o numero tabella +// +// @rdesc Ritorna il numero logico del file o il numero della tabella +int name2log( + const char* name) // @parm Stringa da convertire { int log = 0; @@ -1465,9 +1606,15 @@ TFieldref::TFieldref(const TString& s, short defid) } -// A Fieldref should have the following format (only NAME is mandatory): -// FILE->NAME[FROM,TO] -TFieldref& TFieldref::operator =(const TString& s) +// @mfunc Operatore di assegnamento +// +// @rdesc Ritorna l'oggetto assegnato +TFieldref& TFieldref::operator =( + const TString& s) // @parm Stringa da assegnare all'oggetto + +// @comm Un Fildref deve avere il seguente formato (solamente NAME e il mandante): +// FILE->NAME[FROM,TO] + { int pos = s.find("->"); if (pos > 0) @@ -1644,8 +1791,19 @@ bool TRecord_array::exist(int n) const return r != NULL; } +// @mfunc Ritorna la riga

+// +// @rdesc Ritorna un TRectype alla riga cercata o eventualemete il reference della nuova creata, +// NULL nes caso non esista e non venga creata. +TRectype& TRecord_array::row( + int n, // @parm Numero della riga da creare + bool create) // @parm Indica se creare una nuova riga se non esiste: + // + // @flag TRUE | Se la riga

non esiste viene creata + // @flag FALSE | Se la riga

non esiste non viene creata -TRectype& TRecord_array::row(int n, bool create) +// @comm Nel caso

si TRUE e venga richiesta una riga non esistente si crea un nuovo +// record copiando la chiave. { const int i = n >= 0 ? n - _offset : -1; TRectype* r = (TRectype*)objptr(i); @@ -1659,8 +1817,17 @@ TRectype& TRecord_array::row(int n, bool create) CHECKD(r && n > 0, "Bad record number ", n); return *r; } +// @mfunc Rinumera il campo chiave in seguito a reinsert +// +// @rdesc Ritorna se e' stato rinumerato il campo chiave +bool TRecord_array::renum_key( + const char* field, // @parm Campo della chiave a cui assegnare un nuovo valore + const TString& num) // @parm Nuovo valore da assegnare al campo + // @parm long | num | Nuovo valore da assegnare al campo + +// @syntax bool renum_key(const char* field, const TString& num); +// @syntax bool renum_key(const char* field, long num); -bool TRecord_array::renum_key(const char* field, const TString& num) { const TString& curr = key().get(field); if (curr == num) @@ -1708,7 +1875,17 @@ int TRecord_array::add_row(TRectype* r) return nr; } -bool TRecord_array::destroy_row(int r, bool pack) +// @mfunc Cancella una riga +// +// @rdesc Ritorna se e' riuscito ad eliminare la riga +bool TRecord_array::destroy_row( + int r, // @parm Numero della riga da eliminare + bool pack) // @parm Indica se compattare gli elementi dell'array (default FALSE) + // @parm const TRectype& | r | Record da eliminare + +// @syntax bool destroy_row(int n, bool pack); +// @syntax bool destroy_row(const TRectype& r, bool pack); + { CHECKD(r > _offset, "Can't destroy row ", r); const int index = r - _offset; @@ -1735,8 +1912,14 @@ void TRecord_array::destroy_rows() destroy(i); } -// Confronta i campi della chiave 1 scartando l'ultimo -bool TRecord_array::good(const TRectype& rec) const +// @mfunc Confronta i campi della chiave 1 scartando l'ultimo +// +// @rdesc Ritorna il risulato del confronto: +// +// @flag TRUE | Se i campi sono uguali +// @flag FALSE | Se i campi sono diversi +bool TRecord_array::good( + const TRectype& rec) const // @parm Record di cui confrontare i campi { const bool yes = key().same_key(rec, 1, 1); return yes; @@ -1956,7 +2139,10 @@ void TRelation_description::read_rel() } } -void TRelation_description::change_relation(TRelation& r, TString_array& a) +// @mfunc Cambia la relazione descritta +void TRelation_description::change_relation( + TRelation& r, // @parm Nuova relazione da assegnare + TString_array& a) // @parm Array di descrittore dei file { _rel = &r; read_rel(); @@ -1979,8 +2165,18 @@ void TRelation_description::print_on(ostream& out) const } } +// @mfunc Seleziona un file +// +// @rdesc Ritorna il risultato dell'operazione: +// +// @flag TRUE | E' stato selzionato il file +// @flag FALSE | Non e' riuscito a selezionare il file +bool TRelation_description::choose_file( + int file) // @parm Numero logico del file da selezionare (default 0) + +// @comm Dopo aver scelto un file (occorre che ritorni TRUE) i metodi della classe +// permettono di conoscere tutti i dati riguardanti i parametri del file selezionato -bool TRelation_description::choose_file(int file) { TArray_sheet sht(-1,-1,0,0,"Selezione archivio", "Codice|Descrizione archivio@70"); TToken_string tt(80); @@ -2022,7 +2218,17 @@ bool TRelation_description::choose_file(int file) return FALSE; } -bool TRelation_description::choose_field(const char* fld) +// @mfunc Seleziona un campo

del file selezionato +// +// @rdesc Ritorna il risultato dell'operazione: +// +// @flag TRUE | E' stato selzionato il campo +// @flag FALSE | Non e' riuscito a selezionare il campo +bool TRelation_description::choose_field( + const char* fld) // @parm Nome del campo da selezionare (defualt "") + +// @comm Occorre sche sia selezioanto un file, diversamente viene considerato +// selezionato il promo file { TArray_sheet sht(-1,-1,0,0,"Selezione campo", "Campo@10|Descrizione@50|Tipo@10|Dim."); @@ -2052,7 +2258,16 @@ bool TRelation_description::choose_field(const char* fld) return FALSE; } -bool TRelation_description::build_menu(const char* title) +// @func Costruisce un menu' +// +// @rdesc Ritorna solamente FALSE +bool TRelation_description::build_menu( + const char* title) // @parm Titolo del menu' + +// @comm Costruisce un albero di menu' e setta il campo corrente quando viene +// selezionato (deve essere popup) +// +// @devnote Funzione non implementata. { return FALSE; } @@ -2113,7 +2328,12 @@ TFieldtypes TRelation_description::field_type() return (TFieldtypes)_cfield.get_int(1); } -bool TRelation_description::set_field_description(const char* field, const char* des) +// @mfunc Setta la descrizione del campo +// +// @rdesc Ritorna se ha trovato il campo da settare +bool TRelation_description::set_field_description( + const char* field, // @parm Campo a cui assegnare la descrizione + const char* des) // @parm Descrizione da assgnare al campo { TString_array& fld = (TString_array&)_fields[_cur_file]; diff --git a/include/relation.h b/include/relation.h index 36df38652..e758b6e47 100755 --- a/include/relation.h +++ b/include/relation.h @@ -1,4 +1,4 @@ -/* $Id: relation.h,v 1.31 1995-11-27 08:39:10 guy Exp $ */ +/* $Id: relation.h,v 1.32 1995-12-29 12:09:12 andrea Exp $ */ // join.h // fv 12/8/93 // join class for isam files @@ -14,115 +14,199 @@ class TSort; #endif +// @doc EXTERNAL + +// @class TRelation | Classe per la definizione delle relazioni esistenti tra i file +// +// @base public | TObject class TRelation : public TObject +// @author(:INTERNAL) Sandro { + // @cfriend TRelationdef friend class TRelationdef; + // @cfriend TRelation_description friend class TRelation_description; + // @cfriend TCursor friend class TCursor; - TToken_string _status; // stato della relazione - TArray _files; // file descriptors - TArray _reldefs; // TRelationdef array +// @access Provate Member + + // @cmember Stato della relazione + TToken_string _status; + // @cmember Array dei descrittori dei file + TArray _files; + // @cmember Array di + TArray _reldefs; + // @cmember Codice dell'ultimo errore occorso int _errors; +// @access Protected Member protected: + // @cmember Ritorna l'indice di

del numero logico passato int log2ind(int logicnum) const; + // @cmember Ritorna l'indice di

del alias del file passato int alias2ind(int alias) const; + // @cmember Ritorna l'indice di

del nome del file passato int name2ind(const char* name) const; - TRelationdef& reldef(int i) const { return (TRelationdef&)_reldefs[i]; } - TLocalisamfile& file(int i = 0) const { return (TLocalisamfile&)_files[i]; } + // @cmember Ritorna la

-esima + TRelationdef& reldef(int i) const + { return (TRelationdef&)_reldefs[i]; } + // @cmember Ritorna il descrittore del file

-esimo + TLocalisamfile& file(int i = 0) const + { return (TLocalisamfile&)_files[i]; } - // position_rels fa tutto il lavoro: se non trova un record - // adatto su un file, svuota il record corrente e non ritorna errore. - // write etc. poi procedono normalmente + // @cmember Permette di posizionare l'albero di relazioni tra i file int position_rels(TIsamop op = _isequal, TReclock lockop = _nolock, TDate& atdate = (TDate&)botime, int first = 0); +// @access Public Member public: // TObject - virtual bool ok() const { return good(); } + // @cmember Controlla se si tratta di un oggetto valido + virtual bool ok() const + { return good(); } + // @cmember Permette di stampare l'oggetto su

virtual void print_on(ostream& out) const; public: - int update() { return position_rels(_isequal, _nolock);} + // @cmember Aggiorna l'albero delle relazioni + int update() + { return position_rels(_isequal, _nolock);} + // @cmember Azzera l'abero delle relazioni void zero(); - virtual int next(TReclock lockop = _nolock) { return file().next(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); } - virtual int prev(TReclock lockop = _nolock) { return file().prev(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); } - virtual int next(TDate& atdate) { return file().next(atdate) == NOERR ? position_rels(_isequal, _nolock, atdate) : file().status(); } - virtual int prev(TDate& atdate) { return file().prev(atdate) == NOERR ? position_rels(_isequal, _nolock, atdate) : file().status(); } - virtual int first(TReclock lockop = _nolock) { return file().first(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); } - virtual int last(TReclock lockop = _nolock) { return file().last(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); } - virtual int skip(TRecnotype nrec, TReclock lockop = _nolock) { return file().skip(nrec, lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); } - virtual int read(TIsamop op = _isgteq, TReclock lockop = _nolock, TDate& atdate = (TDate&)botime) { return file().read(op, lockop, atdate) == NOERR ? position_rels(_isequal, lockop, atdate) : file().status();} - + //@cmember Sposta la relazione sul record successivo del file principale (chiama ) + virtual int next(TReclock lockop = _nolock) + { return file().next(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); } + //@cmember Sposta la relazione sul record precedente del file principale (chiama ) + virtual int prev(TReclock lockop = _nolock) + { return file().prev(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); } + //@cmember Sposta la relazione sul record successivo del file principale (chiama ) + virtual int next(TDate& atdate) + { return file().next(atdate) == NOERR ? position_rels(_isequal, _nolock, atdate) : file().status(); } + //@cmember Sposta la relazione sul record precedente del file principale (chiama ) + virtual int prev(TDate& atdate) + { return file().prev(atdate) == NOERR ? position_rels(_isequal, _nolock, atdate) : file().status(); } + //@cmember Sposta la relazione sul primo record del file principale (chiama ) + virtual int first(TReclock lockop = _nolock) + { return file().first(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); } + //@cmember Sposta la relazione sull'ultimo record del file principale (chiama ) + virtual int last(TReclock lockop = _nolock) + { return file().last(lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); } + //@cmember Salta

posizione dalla corrente sul file principale (chiama ) + virtual int skip(TRecnotype nrec, TReclock lockop = _nolock) + { return file().skip(nrec, lockop) == NOERR ? position_rels(_isequal, lockop) : file().status(); } + //@cmember Legge il record (chiama ) + virtual int read(TIsamop op = _isgteq, TReclock lockop = _nolock, TDate& atdate = (TDate&)botime) + { return file().read(op, lockop, atdate) == NOERR ? position_rels(_isequal, lockop, atdate) : file().status();} + + // @cmember Ritorna il descrittore del file TLocalisamfile& lfile(int logicnum = 0) const; + // @cmember Ritorna il descrittore del file TLocalisamfile& lfile(const char* name) const; - TLocalisamfile& operator[] (int logicnum) const { return lfile(logicnum); } + // @cmember Ritorna il descrittore del file (chiama ) + TLocalisamfile& operator[] (int logicnum) const + { return lfile(logicnum); } + // @cmember Abilita/disabilita la scrittura dei record collegati sul file void write_enable(int logicnum = 0, const bool on = TRUE) ; + // @cmember Abilita/disabilita la scrittura sul file void write_enable(const char* name, const bool on = TRUE) ; - void write_disable(int logicnum = 0) { write_enable(logicnum, FALSE); } - void write_disable(const char* name) { write_enable(name, FALSE); } + // @cmember Disabilita la scrittura sul file (chiama ) + void write_disable(int logicnum = 0) + { write_enable(logicnum, FALSE); } + // @cmember Disabilita la scrittura sul file (chiama ) + void write_disable(const char* name) + { write_enable(name, FALSE); } - TRectype& curr(int logicnum = 0) const { return lfile(logicnum).curr(); } - // next_match for 0ne-to-many relations; positions logicnum (!= main) - // on next matching record; returns TRUE or FALSE if no more matches; in - // any case relation is kept consistent except when inconsistent in - // first place + // @cmember Ritorna il record corrente del file

+ // (chiama ) + TRectype& curr(int logicnum = 0) const + { return lfile(logicnum).curr(); } + // @cmember Posiziona il numero logico sul record successivo bool next_match(int logicnum, const char* fieldlist = NULL, int nkey = 0); - bool add(TLocalisamfile* f, const char* relexprs, int key, - int linkto, int alias, bool allow_lock); - bool add(int logicnum, const char* relexprs, int key = 1, - int linkto = 0, int alias = 0, bool allow_lock = FALSE); - bool add(const char* tabname, const char* relexprs, int key = 1, - int linkto = 0, int alias = 0, bool allow_lock = FALSE); + // @cmember Aggiunge una nuovo file alla relazione partendo dal descrittore del file + bool add(TLocalisamfile* f, const char* relexprs, int key, int linkto, int alias, bool allow_lock); + // @cmember Aggiunge una nuovo file alla relazione partendo dal numero logico del file + bool add(int logicnum, const char* relexprs, int key = 1, int linkto = 0, int alias = 0, bool allow_lock = FALSE); + // @cmember Aggiunge una nuovo file alla relazione partendo dal nome della tabella + bool add(const char* tabname, const char* relexprs, int key = 1, int linkto = 0, int alias = 0, bool allow_lock = FALSE); + // @cmember Sostituisce nella relazione un file void replace(TLocalisamfile* f, int index = 0); - // write methods - virtual int write (bool force = TRUE, TDate& atdate = (TDate&)botime); - virtual int rewrite(bool force = TRUE, TDate& atdate = (TDate&)botime); + // @cmember Aggiunge il record corrente + virtual int write (bool force = TRUE, TDate& atdate = (TDate&)botime); + // @cmember Riscrive il record corrente + virtual int rewrite (bool force = TRUE, TDate& atdate = (TDate&)botime); + // @cmember Elimina il record corrente virtual int remove (TDate& atdate = (TDate&)botime); - // status methods - // return the status of the relation when called - // with no args, or the status of the file when called with - // a logical number + // @cmember Controlla se e' stata raggiunta la fine del file + // (se

= 0 dell'intera relazione, altrimenti del file indicato ) + bool eof( int logicnum = 0) const + { return lfile(logicnum).eof(); } + // @cmember Controlla se e' stata raggiunta l'inizio del file + // (se

= 0 dell'intera relazione, altrimenti del file indicato ) + bool bof( int logicnum = 0) const + { return lfile(logicnum).bof(); } + // @cmember Ritorna lo stao del file indicato (se

= 0 dell'intera relazione, + // altrimenti del file indicato ) + bool status(int logicnum = 0) const + { return lfile(logicnum).status(); } + // @cmember Controlla se l'ultima operazione sul file e' stat effettuata correttamente + // (se

= 0 dell'intera relazione, altrimenti del file indicato ) + bool good( int logicnum = 0) const + { return lfile(logicnum).good(); } + // @cmember Controlla se l'ultima operazione sul file ha generato un errore + // (se

= 0 dell'intera relazione, altrimenti del file indicato ) + bool bad( int logicnum = 0) const + { return lfile(logicnum).bad(); } + // @cmember Controlla se e' il file e' vuoto + // (se

= 0 dell'intera relazione, altrimenti del file indicato ) + bool empty( int logicnum = 0) const + { return lfile(logicnum).empty(); } - bool eof( int logicnum = 0) const { return lfile(logicnum).eof(); } - bool bof( int logicnum = 0) const { return lfile(logicnum).bof(); } - bool status(int logicnum = 0) const { return lfile(logicnum).status(); } - bool good( int logicnum = 0) const { return lfile(logicnum).good(); } - bool bad( int logicnum = 0) const { return lfile(logicnum).bad(); } - bool empty( int logicnum = 0) const { return lfile(logicnum).empty(); } + // @cmember Controlla se la relazione e' corretta + bool isconsistent (bool reset = FALSE); - // isconsistent() returns TRUE if every file in the relation is - // OK, current record is non-empty, and relation is consistent. - // If it's not and reset is TRUE, it tries to reset the relation - // to a consistent state (based on main record) -- no further check - // is done. - // Also called internally by update and remove. - bool isconsistent(bool reset = FALSE); - - // TRUE se c'e' un record ed e' il primo match (non si e' mai fatta - // position_rels) + // @cmember Controlla se c'e' un record ed e' il primo match (non si e' mai fatta + // ) bool is_first_match(int logicnum); - // items() ritorna il numero di files collegati - int items() { return _reldefs.items(); } + // @cmember Ritorna il numero di files collegati + int items() + { return _reldefs.items(); } - void save_status () ; - void restore_status () ; + // @cmember Salva la posizione attuale di tutti i file della relazione + void save_status () ; + // @cmember Ripristina la posizione attuale di tutti i file della relazione + void restore_status () ; // positioning operators. return status - TRecnotype operator +=(const TRecnotype npos) { return skip(npos); } - TRecnotype operator -=(const TRecnotype npos) { return skip(-npos); } - TRecnotype operator ++() { return next(); } - TRecnotype operator --() { return prev(); } + // @cmember Sposta il puntatore corrente di

posizioni in avanti + // (ritorna lo stato) + TRecnotype operator +=(const TRecnotype npos) + { return skip(npos); } + // @cmember Sposta il puntatore corrente di

posizioni in dietro + // (ritorna lo stato) + TRecnotype operator -=(const TRecnotype npos) + { return skip(-npos); } + // @cmember Sposta il puntatore corrente di una posizione in avanti + // (ritorna lo stato) + TRecnotype operator ++() + { return next(); } + // @cmember Sposta il puntatore corrente di una posizione in dietro + // (ritorna lo stato) + TRecnotype operator --() + { return prev(); } + // @cmember Costruttore dal numero logico del file TRelation(int logicnum); + // @cmember Costruttore dal nome della tabella TRelation(const char* tabname); + // @cmember Costruttore dal nome del file TRelation(TLocalisamfile* f); + // @cmember Distruttore virtual ~TRelation(); }; @@ -131,284 +215,528 @@ public: // TRecord_Array /////////////////////////////////////////////////////////// +// @class TRecord_array | Classe per la gestione di un array di record +// +// @base public | TArray class TRecord_array : private TArray -{ - int _file; // Numero logico del file principale - int _offset; // Offset iniziale del record array - TString16 _num; // Nome del campo col numero di riga +// @author(:ITERNAL) Guido + +// @access Private Member +{ + // @cmember Numero logico del file principale + int _file; + // @cmember Offset iniziale del record array + int _offset; + // @cmember Nome del campo col numero di riga + TString16 _num; + +// @access Protected Member protected: - int rec2row(const TRectype& r) const; // Estrae il numero riga di un record - const TString& num_field() const { return _num; } + // @cmember Ritorna il numero riga del record

+ int rec2row(const TRectype& r) const; + // @cmember Ritorna il nome del campo con numero di riga + const TString& num_field() const + { return _num; } + // @cmember Elimina il record di posizione

(ritorna il risultato dell'operazione) int remove_from(int i) const; + // @cmember Confronta i campi della chiave 1 scartando l'ultimo bool good(const TRectype& rec) const; -public: +// @access Public Member +public: + // @cmember Ritorna il record che fa da chiave per tutti gli altri const TRectype& key() const; - int rows() const { return items()-1; } // Numero di righe presenti + // @cmember Ritorna il numero di righe presenti + int rows() const + { return items()-1; } - int succ_row(int r) const { return succ(r - _offset) + _offset; } - int pred_row(int r) const { return pred(r - _offset) + _offset; }; - int last_row() const { return last() + _offset; } // Ultima riga - int first_row() const { return succ_row(0); } // Prima riga + // @cmember Ritorna la riga successiva non vuota a prtire da

+ int succ_row(int r) const + { return succ(r - _offset) + _offset; } + // @cmember Ritorna la riga precedente non vuota a prtire da

+ int pred_row(int r) const + { return pred(r - _offset) + _offset; }; + // @cmember Ritorna l'ultma riga non vuota + int last_row() const + { return last() + _offset; } + // @cmember Ritorna la prima riga non vuota + int first_row() const + { return succ_row(0); } - const TRectype& row(int r) const // Riga r costante + // @cmember Ritorna il record

-esimo + const TRectype& row(int r) const { CHECKD(r > _offset, "Bad record number ", r); return (const TRectype&)operator[](r - _offset); } - bool exist(int r) const; // Controlla se esiste la riga r - TRectype& row(int r, bool create); // Riga r con possibilita' di crearla - - virtual int add_row(TRectype* r); // Aggiungi/cambia una riga - int add_row(const TRectype& r) { return add_row((TRectype*)r.dup()); } - virtual bool destroy_row(int n, bool pack = FALSE); // Cancella una riga - virtual bool destroy_row(const TRectype& r, bool pack = FALSE) { return destroy_row(rec2row(r), pack); } - void destroy_rows(); // Cancella tutte le righe - - int logic_num() const { return _file; } - void set_key(TRectype* r); // Cambia l'intera chiave (solo se vuoto!) - bool renum_key(const char* field, const TString& num); - bool renum_key(const char* field, long num); // Rinumera campo chiave in seguito a reinsert + // @cmember Controlla se esiste la riga

(TRUE se esiste) + bool exist(int r) const; + // @cmember Ritorna la riga

+ TRectype& row(int r, bool create); - virtual int read(const TRectype& r); // Leggi tutto l'array da file - virtual int read(TRectype* r); // Leggi tutto l'array da file - virtual int write(bool re = FALSE) const; // Aggiorna il file - virtual int rewrite() const { return write(TRUE); } - virtual int remove() const; // Cancella tutti i record dal file + // @cmember Aggiunge/sostituisce una riga + virtual int add_row(TRectype* r); + // @cmember Aggiunge un nuovo record all'array + int add_row(const TRectype& r) + { return add_row((TRectype*)r.dup()); } + // @cmember Cancella una riga identificata da

+ virtual bool destroy_row(int n, bool pack = FALSE); + // @cmember Cancella una riga identificata da

+ virtual bool destroy_row(const TRectype& r, bool pack = FALSE) + { return destroy_row(rec2row(r), pack); } + // @cmember Cancella tutte le righe + void destroy_rows(); + // @cmember Ritorna il numero logico del file principale + int logic_num() const + { return _file; } + // @cmember Cambia l'intera chiave (solo se vuoto) + void set_key(TRectype* r); + // @cmember Rinumera il campo chiave in seguito a reinsert + bool renum_key(const char* field, const TString& num); + // @cmember Rinumera il campo chiave in seguito a reinsert + bool renum_key(const char* field, long num); + + // @cmember Legge tutto l'array dal file + virtual int read(const TRectype& r); + // @cmember Legge tutto l'array dal file + virtual int read(TRectype* r); + // @cmember Aggiorna il file (se

== TRUE allora viene aggiornato il record se esisteva) + virtual int write(bool re = FALSE) const; + // @cmember Aggiorna il record sul file + virtual int rewrite() const + { return write(TRUE); } + // @cmember Cancella tutti i record dal file + virtual int remove() const; + + // @cmember Costruttore TRecord_array(const TRectype& r, const char* numfield, int first = 1); + // @cmember Costruttore TRecord_array(int logicnum, const char* numfield, int first = 1); + // @cmember Costruttore TRecord_array(const TRecord_array& a); }; -// Classe TCursor : public TObject - class TExpression; +// @type FILTERFUNCTION | Controlla se il record debba essere incluso nel cursore typedef bool (*FILTERFUNCTION)(const TRelation* r); +// @class TCursor | Classe per la definizione di un cursore su di una relazione +// +// @base public | TContainer class TCursor : public TContainer -{ - TRelation* _if; - int _nkey; - TRecnotype _pos; // Posizione corrente - TRecnotype _totrec; - TRecnotype _lastrec; - TRecnotype _lastkrec; - TFilename _filename; - TString _filter; // Filtro - TString _keyfrom; // chiave iniziale - TString _keyto; // chiave finale - TExpression* _fexpr; // Espressione relativo filtro - bool _frozen; - bool _filter_update; // Flag che permette l'update della relazione per l'espressione-filtro - bool _filterfunction_update;// Flag che permette l'update della relazione per la funzione-filtro - FILTERFUNCTION _filterfunction; - TFilename _indexname; +// @author(:INTERNAL) Villa + +// @access Private Member +{ + // @cmember Relazione su cui costruire il cursore + TRelation* _if; + // @cmember Chiave del file principale + int _nkey; + // @cmember Posizione corrente + TRecnotype _pos; + // @cmember Numero totale di record che verificano il filtro + TRecnotype _totrec; + // @cmember Numero dell'ultimo record + TRecnotype _lastrec; + // @cmember Chiave dell'ultimo record + TRecnotype _lastkrec; + // @cmember Nome assoluto del file principale + TFilename _filename; + // @cmember Filtro definito con la + TString _filter; + // @cmember Nome della chive iniziale + TString _keyfrom; + // @cmember Nome della chiave finale + TString _keyto; + // @cmember Espressione del filtro relativo + TExpression* _fexpr; + // @cmember Indica se e' stata messa in attesa (non puo' essere modificato) + bool _frozen; + // @cmember Flag che permette l'update della relazione per l'espressione-filtro + bool _filter_update; + // @cmember Flag che permette l'update della relazione per la funzione-filtro + bool _filterfunction_update; + // @cmember Funzione filtro + FILTERFUNCTION _filterfunction; + // @cmember Nome del file indice + TFilename _indexname; + + // @cmember Crea (o aggiorna) effettivamente l'indice del cursore TRecnotype update(); - +// @access Protected Member protected: + // @cmember Apre il file di indice FILE* open_index(bool create = FALSE); + // @cmember Ritorna se e' stato modificato il cursore (cioe' quando occorre fare l'update) virtual bool changed(); + // @cmember Costruisce il cursore a partire dal record virtual TRecnotype buildcursor(TRecnotype rp); + // @cmember Permette di creare una pagina di cursori virtual int filtercursor(int pagecnt, TRecnotype* page); + // @cmember Posiziona il cursore in modo che il record corrente corriponda alla + // posizione dell'indice temporaneo TRecnotype readrec(); - void filter(const char* filter, const TRectype* from = NULL, - const TRectype* to = NULL); - bool update_relation() {return (_filter_update || _filterfunction_update);} + // @cmember Setta il filtro sul cursore + void filter(const char* filter, const TRectype* from = NULL, const TRectype* to = NULL); + // @cmember Indica se e' possibile fare l'update sulla relazione (se e' possibile + // sia sull'espressione-filtro che sulla funzione-filtro) + bool update_relation() + {return (_filter_update || _filterfunction_update);} +// @access Public Member public: - // @FPUB - TRecnotype operator =(const TRecnotype nr); // Va alla posizione nr + // @cmember Si sposta alla posizione

+ TRecnotype operator =(const TRecnotype nr); + // @cmember Si sposta di

posizioni dalla corrente in avanti TRecnotype operator +=(const TRecnotype nr); - TRecnotype operator -=(const TRecnotype npos) { return operator +=(-npos); } - TObject* first_item( ){ operator =( 0 ); return &curr( ); } - TObject* succ_item( ){ operator +=( 1 ); return &curr( ); } - TObject* pred_item( ){ operator -=( 1 ); return &curr( );} - TObject* last_item( ){ operator =( items( ) -1 ); return &curr( ); } - long objects( ) { return items( ); } + // @cmember Si sposta di

posizioni dalla corrente in dietro + TRecnotype operator -=(const TRecnotype npos) + { return operator +=(-npos); } + // @cmember Ritorna il primo oggetto del cursor + TObject* first_item( ) + { operator =( 0 ); return &curr( ); } + // @cmember Ritorna l'oggetto del cursor successivo al corrente + TObject* succ_item( ) + { operator +=( 1 ); return &curr( ); } + // @cmember Ritorna l'oggetto del cursor precedente al corrente + TObject* pred_item( ) + { operator -=( 1 ); return &curr( );} + // @cmember Ritorna l'ultimo oggetto del cursor + TObject* last_item( ) + { operator =( items( ) -1 ); return &curr( ); } + // @cmember Ritorna il n8umero di oggetti del cursor + long objects( ) + { return items( ); } - TRecnotype& pos() { return _pos; } + // @cmember Ritorna la posizione corrente + TRecnotype& pos() + { return _pos; } + // @cmember Ritorna il numero totale di record TRecnotype items(); - TRecnotype size() const { return file().eod(); } + // @cmember Ritorna la dimensione del file principale + TRecnotype size() const + { return file().eod(); } - const TString& from() const { return _keyfrom; } - const TString& to() const { return _keyto; } + // @cmember Ritorna il nome della chiave iniziale + const TString& from() const + { return _keyfrom; } + // @cmember Ritorna il nome della chiave finale + const TString& to() const + { return _keyto; } - TRectype& curr(int log = 0) const { return _if->curr(log); } - TRectype& curr(const char * tab) const { return _if->lfile(tab).curr(); } + // @cmember Ritorna il descrittore del file principale + TRectype& curr(int log = 0) const + { return _if->curr(log); } + // @cmember Ritorna il descrittore della tabella + TRectype& curr(const char * tab) const + { return _if->lfile(tab).curr(); } + // @cmember Legge il record TRecnotype read(TIsamop op = _isgteq, TReclock lockop = _nolock, TDate& atdate = (TDate&)botime); + // @cmember Mette un lock sul record int lock(TReclock = _lock); - int unlock() { return lock(_unlock); } + // @cmember Toglie un lock sul record (chiama ) + int unlock() + { return lock(_unlock); } + // @cmember Controlla che si tratti di un oggetto valido virtual bool ok() const; - - const char* filter() const { return _filter; } - void freeze(bool on = TRUE) { _frozen = on; } - bool frozen() const { return _frozen; } - void setfilter(const char* filter_expr, bool update=FALSE) { filter(filter_expr); _filter_update = update; } + // @cmember Ritorna il filtro + const char* filter() const + { return _filter; } + // @cmember Permette di mettere in attesa il cursore + void freeze(bool on = TRUE) + { _frozen = on; } + // @cmember Controlla se il cursore e' congelato + bool frozen() const + { return _frozen; } + // @cmember Permette di modificare l'espressione-filtro + void setfilter(const char* filter_expr, bool update=FALSE) + { filter(filter_expr); _filter_update = update; } + // @cmember Setta la regione-filtro dal record

al record

void setregion(const TRectype& from, const TRectype& to) { filter(NULL,&from, &to); } - TRelation* relation() const { return _if; } - TLocalisamfile& file(int lnum = 0) const { return _if->lfile(lnum); } - TLocalisamfile& file(const char* name) const { return _if->lfile(name); } - int repos() { return _if->position_rels(); } + // @cmember Ritorna la relazione del cursore + TRelation* relation() const + { return _if; } + // @cmember Ritorna il file della relazione con numero logico

+ TLocalisamfile& file(int lnum = 0) const + { return _if->lfile(lnum); } + // @cmember Ritorna il file della relazione con nome

+ TLocalisamfile& file(const char* name) const + { return _if->lfile(name); } + // @cmember Riposiziona l'albero delle relazione (chiama ) + int repos() + { return _if->position_rels(); } - TExpression* expression() const { return _fexpr; } - FILTERFUNCTION filterfunction() const { return _filterfunction; } + // @cmember Ritorna l'espressione-filtro + TExpression* expression() const + { return _fexpr; } + // @cmember Ritorna la funzione-filtro + FILTERFUNCTION filterfunction() const + { return _filterfunction; } - void setkey() { file().setkey(_nkey); } + // @cmember Setta la chiave del file principale alla chiave del cursore + void setkey() + { file().setkey(_nkey); } + // @cmember Setta la chiave del file principale alla chiave del cursore void setkey(int nkey); - int key() const { return _nkey; } + // @cmember Ritorna la chiave del cursor + int key() const + { return _nkey; } + // @cmember Posizione il numero logico sul record successivo (chiama ) bool next_match(int lognum, const char* fl = NULL, int nk = 0); + // @cmember Controlla se c'e' un record ed e' il primo match (chiama ) bool is_first_match(int ln); - void set_filterfunction(FILTERFUNCTION ff, bool update=FALSE) { _filterfunction = ff; _lastrec = 0L; _filterfunction_update = update;} - bool has_filter() const { return _filter.not_empty() || _filterfunction; } + // @cmember Setta la fuzione-filtro + void set_filterfunction(FILTERFUNCTION ff, bool update=FALSE) + { _filterfunction = ff; _lastrec = 0L; _filterfunction_update = update;} + // @cmember Controllla se esiste un fuiltro sul cursor + bool has_filter() const + { return _filter.not_empty() || _filterfunction; } - void save_status () { _if->save_status(); } - void restore_status () { _if->restore_status(); } + // @cmember Salva la posizione attuale di tutti i file del cursore + void save_status () + { _if->save_status(); } + // @cmember Ripristina la posizione attuale di tutti i file del cursore + void restore_status () + { _if->restore_status(); } + // @cmember Costruttore TCursor(TRelation* f, const char* filter = "", int key = 1, const TRectype* from = NULL, const TRectype* to = NULL); + // @cmember Distruttore virtual ~TCursor(); }; - -// Classe TSorted_cursor. Costruisce e gestisce un cursore ordinato per chiavi diverse da quelle specificate nel file. -// Il formato dell'espressione deve essere: [LF->]FIELDNAME[[from,to]][+|-]... Inoltre tutta l'espressione puo' essere racchiusa -// dall'operatore UPPER(), per controlli non case-sensitive. -// FIELDNAME e' il nome del campo per quale si vuole effettuare il sort, LF indica il numero logico del file(appartenente alla relazione!). -// from e to sono parametri opzionali usati per specificare un sottocampo. Per default prende l'intera lunghezza. -// + e - sono parametri opzionali usati per specificare il tipo di ordinamento: + significa crescente, - significa -// decrescente. Per default l'ordinamento e' +(crescente). E' cosi' possibile creare chiavi con campi non appartententi al -// file principale della relazione. -// Es. "CODCF-|TIPOCF|SOTTOCONTO+|UPPER(20->RAGSOC[1,40]-)" - +// @class TSorted_cursor | Costruisce e gestisce un cursore ordinato per chiavi diverse da quelle specificate nel file. class TSorted_cursor : public TCursor -{ - TToken_string _order_expr; - TSort *_sort; - bool _is_changed_expr; - bool _is_valid_expr; + +// @author(:INTERNAL) Angelo + +// @comm Il formato dell'espressione deve essere: [LF->]FIELDNAME[[from,to]][+-]... Inoltre tutta l'espressione puo' essere racchiusa +// dall'operatore UPPER(), per controlli non case-sensitive. +//

e' il nome del campo per quale si vuole effettuare il sort, LF indica il numero logico del file (appartenente alla relazione!). +//

e

sono parametri opzionali usati per specificare un sottocampo. Per default prende l'intera lunghezza. +//

e

sono parametri opzionali usati per specificare il tipo di ordinamento:

significa crescente,

significa +// decrescente. Per default l'ordinamento e' crescente. E' cosi' possibile creare chiavi con campi non appartententi al +// file principale della relazione. +// Es. "CODCF-TIPOCFSOTTOCONTO+UPPER(20->RAGSOC[1,40]-)" + +// @access Private Member +{ + // @cmember Espressione per l'ordinamento + TToken_string _order_expr; + // @cmember Puntatore all'oggetto per ordinare il cursore (vedi ) + TSort* _sort; + // @cmember Indica se l'espressione e' cambiata + bool _is_changed_expr; + // @cmember Indica se l'espressione e' valida + bool _is_valid_expr; +// @access Protected Member protected: - bool check_expr(TString& s); // Controlla il formato della singola espressione di un campo di sort - bool is_upper(TString& s); // Controlla se la singola espressione contiene l'operatore UPPER(), ritornandone l'argomento - virtual TRecnotype buildcursor(TRecnotype rp); // Vedi i TCursor - virtual int filtercursor(int pagecnt, TRecnotype* page); // Vedi i TCursor - virtual bool changed(); // Vedi i TCursor + // @cmember Controlla il formato della singola espressione di un campo di sort + bool check_expr(TString& s); + // @cmember Controlla se la singola espressione contiene l'operatore UPPER(), ritornandone l'argomento + bool is_upper(TString& s); + // @cmember Costruisce il cursore a partire dal record (vedi ) + virtual TRecnotype buildcursor(TRecnotype rp); + // @cmember Permette di creare una pagina di cursori (vedi ) + virtual int filtercursor(int pagecnt, TRecnotype* page); + // @cmember Ritorna se e' stato modificato il cursore (cioe' quando occorre fare l'update) (vedi ) + virtual bool changed(); +// @access Public Member public: - TRecnotype operator =(const TRecnotype nr) {return TCursor::operator =(nr); } - void change_order(const char * order_expr); // Permette di cambiare l'ordinamento del cursore. + // @cmember Si sposta alla posizione

+ TRecnotype operator =(const TRecnotype nr) + {return TCursor::operator =(nr); } + // @cmember Permette di cambiare l'ordinamento del cursore. + void change_order(const char* order_expr); + // @cmember Costruttore TSorted_cursor(TRelation *f,const char * order_expr, const char * filter = "", int key = 1, const TRectype* from = NULL, const TRectype* to = NULL); + // @cmember Distruttore virtual ~TSorted_cursor(); }; -// Classe TFieldref : public TObject +// @class TFieldref | Classe per la definizione di riferimenti ad un campo di una relazione +// +// @base public | TObject class TFieldref : public TObject -{ - short _fileid; // Numero del file - TString _id; // Nome tabella o stringa col numero del file - TString _name; // Nome del campo - int _from, _to; // Substring +// @author(:INTERNAL) Guido + +// @access Private Member +{ + // @cmember Numero del file + short _fileid; + // @cmember Nome tabella o stringa col numero del file + TString _id; + // @cmember Nome del campo + TString _name; + // @cmember Sottostringa di partenza + int _from; + // @cmember Sottostringa di arrivo + int _to; + +// @access Protected Member protected: + // @cmember Stampa l'oggetto virtual void print_on(ostream& out) const; +// @access Public Memeber public: + // @cmember Costruttore TFieldref(); + // @cmember Costruttore TFieldref(const TString&, short defid); - TFieldref& operator =(const TString& s); // Operatore di assegnazione + // @cmember Operatore di assegnamento + TFieldref& operator =(const TString& s); + + // @cmember Controlla la validita' dell'oggetto (TRUE se il numero del file e' valido) + virtual bool ok() const + { return _name.not_empty(); } - virtual bool ok() const { return _name.not_empty(); } // Vero se il numero del file e' valido - - int file() const { return _fileid; } // ritorna il file + // @cmember Ritorna il numero del file + int file() const + { return _fileid; } + // @cmember Setta il numerodel file void set_file(int f); - const TString& name() const { return _name; } // ritorna il nome del campo - void set_name(const char* n) { _name = n; } - void set_from(int f) { if (f > 0) f--; else f = 0; _from = f; } - void set_to(int t) { _to = t; } + // @cmember Ritorna il nome del campo + const TString& name() const + { return _name; } + // @cmember Setta il nome del campo + void set_name(const char* n) + { _name = n; } + // @cmember Setta

+ void set_from(int f) + { if (f > 0) f--; else f = 0; _from = f; } + // @cmember Setta

+ void set_to(int t) + { _to = t; } - int from() const { return _from; } - int to() const { return _to; } + // @cmember Ritorna

+ int from() const + { return _from; } + // @cmember Ritorna

+ int to() const + { return _to; } + // @cmember Ritorna la lunghezza del campo di

int len(TRectype &rec) const; + // @cmember Cerca nella relazione il campo e ne ritorna il contenuto const char* read(const TRelation*) const; + // @cmember Cerca nel record il campo e ne ritorna il contenuto const char* read(const TRectype&) const; + // @cmember Cerca nella relazione il campo e vi scrive

void write(const char* val, TRelation*) const; + // @cmember Cerca nel record il campo e vi scrive

void write(const char* val, TRectype& rec) const; }; -// Converte una stringa in numero logico o numero tabella int name2log(const char* name); +// @class TRelation_description | Gestisce l'uso interattivo di una relazione (scelta campi, descrizione) +// +// @base public | TObject class TRelation_description : public TObject + +// @author(:INTERNAL) Guido + +// @access Private Member { - // gestisce l'uso interattivo di una relazione (scelta campi, descrizione) - // domani o doman l'altro gestira' l'editing interattivo e grafico + // @cmember Relazione descritta + TRelation* _rel; + // @cmember Nome dei files della relazione + TString_array _files; + // @cmember Array di campi + TArray _fields; + // @cmember Numero logico del file corrente + int _cur_file; + // @cmember Numero del campo corrente + int _cur_field; + // @cmember UNUSED + bool _menu; + // @cmember File corrente + TToken_string _cfile; + // @cmember Campo corrente + TToken_string _cfield; - TRelation* _rel; // relation described - TString_array _files; - TArray _fields; - int _cur_file; - int _cur_field; - bool _menu; - TToken_string _cfile, _cfield; - -protected: +// @access Protected Member +protected: + // @cmember Inizializza l'array di stringhe con i nomi dei files void init_files_array(); + // @cmember Legge la relazione void read_rel(); -public: // TObject - virtual bool ok() const { return _files.items() > 0; } +// @access Public Member +public: + // @cmember Controlla se si tratta di un oggetto valido (se il numero dei files e' di 0) + virtual bool ok() const + { return _files.items() > 0; } public: - // "choose" interface: after choosing a field (must return TRUE) - // methods allow to know all data concerning the field - // parameters set the one initially selected - bool choose_file (int id = 0); + // @cmember Seleziona il file

+ bool choose_file (int id = 0); + // @cmember Setta come file corrente quello con numero logico

bool set_cur_file(int id = 0); - // file must have been chosen: first file in list if called - // before choose_file + // @cmember Seleziona il campo

del file selezionato bool choose_field(const char* fld = ""); - // if wanted, build a menu tree and set current field upon - // selecting it (should be popup) + // @cmember Costruisce un menu' bool build_menu(const char* title = "Database"); + // @cmember Rimuove il menu' costruito con bool remove_menu(); - // if choose_file == TRUE or menu has been used these return valid data - int file_num(); + // @cmember Ritorna il numero logico del file selezionato (vedi ) + int file_num(); + // @cmember Ritorna la descrizione del file selezionato (vedi ) const char* file_desc(); - void file_desc(const char* desc); - bool set_field_description(const char* field, const char* des); + // @cmember Setta la descrizione del file selezionato + void file_desc(const char* desc); + // @cmember Setta la descrizione del campo + bool set_field_description(const char* field, const char* des); + // @cmember Ritorna la descrizione del campo const char* get_field_description(const char* field); - // if choose_field == TRUE or menu has been used these return valid data + // @cmember Ritorna la descrizione del campo selezionato (vedi ) const char* field_desc(); - void field_desc(const char* desc); + // @cmember Setta la descrizione del campo selezionato + void field_desc(const char* desc); + // @cmember Riorna il nome del campo selezionato (vedi ) const char* field_name(); - int field_len(); + // @cmember Riorna la lunghezza del campo selezionato (vedi ) + int field_len(); + // @cmember Riorna il tipo del campo selezionato (vedi ) TFieldtypes field_type(); - const TString_array& get_all_desc() const { return _files; } + // @cmember Ritorna l'array di tutti nomi dei files + const TString_array& get_all_desc() const + { return _files; } + // @cmember Cambia la relazione descritta void change_relation(TRelation& rel, TString_array& arr); + // @cmember Stampa l'oggetto virtual void print_on(ostream& out) const; + // @cmember Costruttore TRelation_description(TRelation& r); + // @cmember Distruttore virtual ~TRelation_description(); + +// @devnote Domani o doman l'altro gestira' l'editing interattivo e grafico }; diff --git a/include/sheet.h b/include/sheet.h index b048b4c94..3438dd064 100755 --- a/include/sheet.h +++ b/include/sheet.h @@ -25,7 +25,7 @@ class TEdit_field; // @base public | TScroll_window class TSheet : public TScroll_window -// @author(:INTERNAL) Guido +// @author:(INTERNAL) Guido // @access Privete Member { @@ -196,7 +196,7 @@ public: // // @base public | TSheet class TArray_sheet : public TSheet -// @author(:INTERNAL) Guido +// @author:(INTERNAL) Guido // @access Private Member { @@ -240,7 +240,7 @@ public: // // @base public | TSheet class TCursor_sheet : public TSheet -// @author(:INTERNAL) Guido +// @author:(INTERNAL) Guido // @access Private Member { @@ -285,7 +285,7 @@ public: // // @base public | TCursor_sheet class TBrowse_sheet : public TCursor_sheet -// @author(:INTERNAL) Guido +// @author:(INTERNAL) Guido // @access Private Member { diff --git a/include/strings.h b/include/strings.h index c3aec4ad4..01a95a8c1 100755 --- a/include/strings.h +++ b/include/strings.h @@ -116,13 +116,17 @@ public: const TString& right(int count) const; // @cmember Ritorna un oggetto TString temporaneo composto dai count caratteri da sinistra - TString sleft(int count) const { return ((TString)left(count)); } + TString sleft(int count) const + { return ((TString)left(count)); } // @cmember Ritorna un oggetto TString temporaneo composto dai count caratteri a partire da from - TString smid(int from, int count = -1) const { return ((TString)mid(from, count)); } + TString smid(int from, int count = -1) const + { return ((TString)mid(from, count)); } // @cmember Ritorna un oggetto TString temporaneo composto dai caratteri da from a to (escluso) - TString ssub(int from, int to = -1) const { return ((TString)sub(from, to)); } + TString ssub(int from, int to = -1) const + { return ((TString)sub(from, to)); } // @cmember Ritorna un oggetto TString temporaneo composto dai count caratteri da destra - TString sright(int count) const { return ((TString)right(count)); } + TString sright(int count) const + { return ((TString)right(count)); } // @cmember Riempe la stringa con n caratteri c TString& fill(char c, int n = -1); @@ -253,8 +257,11 @@ public: // @cmember Distruttore virtual ~TFixed_string(); - // @cmember Manda un output formattato alla stringa oggetto - TString& format(const char* fmt, ...); +#ifndef __WATCOMC__ + virtual +#endif + // @cmember Manda un output formattato alla stringa oggetto + TString& format(const char* fmt, ...); // @cmember Assegna la stringa passata con indirizzo const TString& operator =(const TString& s) @@ -409,17 +416,18 @@ public: TToken_string(const TToken_string& s); // @cmember Setta il carattere separatore a s - void separator(char s); + void separator(char s) + { _separator = s; } // @cmember Rimette all'inizio il puntatore void restart() { _last = empty() ? -1 : 0; } // @cmember Assegna una stringa const TString& operator =(const char* s) - { set(s); restart(); return *this; } + { set(s);restart();return *this; } // @cmember Assegna una stringa const TString& operator =(const TString& s) - { set(s); restart(); return *this; } + { set(s);restart();return *this; } // @cmember Aggiunge una stringa void add(const char* s, int n = -1); diff --git a/include/tabutil.h b/include/tabutil.h index 28dfa7348..8b115eef2 100755 --- a/include/tabutil.h +++ b/include/tabutil.h @@ -5,43 +5,55 @@ #include #endif -/* - @(SH) Header - - @(C#) PUBBLICHE - - @(C$) PRIVATE - @(VG#) PUBBLICHE - @(VG$) PRIVATE - */ - -// @C -// Classe TTable : public TLocalisamfile -// @END +// @doc EXTERNAL +// @class TTable | Classe per la descrizione delle tabelle +// +// @base public | TLocalisamfile class TTable : public TLocalisamfile + +// @author(:INTERNAL) Sandro + +// @access Private Member { - // @DPRIV + // @cmember Nome della tabella TString16 _tabname; + // @cmember Codice della tabella TRecfield _cod; +// @access Public Member public: - // @FPUB + // @cmember Si posiziona sul primo record della tabella virtual int first(word lockop = _nolock); + // @cmember Si posiziona sull'ultimo record della tabella virtual int last(word lockop = _nolock); + // @cmember Si posiziona sul successivo record della tabella virtual int next(word lockop = _nolock); + // @cmember Si posiziona sul precedente record della tabella virtual int prev(word lockop = _nolock); + // @cmember Salta

record dalla posizione corrente virtual int skip(TRecnotype nrec, word lockop = _nolock); + // @cmember Legge il record (vedi e ) virtual int read(word op = _isequal, word lockop = _nolock, TDate& = (TDate&)botime); + // @cmember Legge il record e lo copia in

(vedi e ) virtual int read(TRectype& rec, word op = _isequal, word lockop = _nolock, TDate& = (TDate&)botime); + // @cmember Legge il record alla posizione

(vedi ) virtual int readat(TRecnotype nrec, word lockop = _nolock); + // @cmember Legge il record alla posizione

e lo copia in

(vedi ) virtual int readat(TRectype& rec, TRecnotype nrec, word lockop = _nolock); - virtual bool tab() const { return TRUE; } - virtual const char* name() const { return _tabname;} + // @cmember Controlla se si tratta di una tabella (ritorna sempre TRUE) + virtual bool tab() const + { return TRUE; } + // @cmember Ritorna il nome della tabella + virtual const char* name() const + { return _tabname;} + // @cmember Costruttore TTable(const char* tabname, bool linkrecinst = FALSE); + // @cmember Distruttore virtual ~TTable(); + // @cmember Ritorna il numero logico della tabella

static int name2log(const char* tabname); }; diff --git a/include/text.h b/include/text.h index 303277e28..b3edd5759 100755 --- a/include/text.h +++ b/include/text.h @@ -38,7 +38,7 @@ enum style { // // @base public | TObject class TTextfile: public TObject -// @author(:INTERNAL) Villa +// @author:(INTERNAL) Villa // @access Private Member { diff --git a/include/viswin.h b/include/viswin.h index 406d395a6..572898326 100755 --- a/include/viswin.h +++ b/include/viswin.h @@ -22,7 +22,7 @@ class TBrowsefile_field; // @base public | TScroll_window class TViswin : public TScroll_window -// @author(:INTERNAL) Villa +// @author:(INTERNAL) Villa // @access Private Member { diff --git a/include/window.cpp b/include/window.cpp index 45f4028fd..160c6b8cf 100755 --- a/include/window.cpp +++ b/include/window.cpp @@ -74,7 +74,9 @@ HIDDEN void set_menu_item(MENU_ITEM& m, TToken_string& tt) /////////////////////////////////////////////////////////// // TWindow_manager /////////////////////////////////////////////////////////// - + +// @doc INTERNAL + // @class TWindow_manager | Classe per la gestione di un array di finestre modali class TWindow_manager { @@ -123,6 +125,8 @@ public: bool can_close() const; } WinManager; +// @doc EXTERNAL + TWindow_manager::TWindow_manager() : _current(-1), _lowhandle(NULL) {