config.cpp Aggiustamenti minimi alla read_paragraph
config.h Aggiunta funzione get_paragraph isam.cpp Eliminato warning per null_char = (char)0xFF; relapp.cpp Aggiunto supporto per transazioni mediante .ini relapp.h Aggiunte dichiarazioni per funzioni di gestione .ini realtion.cpp Aggiunta possibilita' di leggere e scrivere i TFieldref su .ini relation.h Aggiunte dichiarazioni dei metodi suddetti rmov.h Aggiunta dichiarazione dei NUMGIO strings.cpp Aggiunto operatore di copia tra TString_array string.h Dichiarato operatore di copia di array di stringhe git-svn-id: svn://10.65.10.50/trunk@4243 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									a7d9d26979
								
							
						
					
					
						commit
						cfeded0c58
					
				@ -128,16 +128,18 @@ void TConfig::_write_file()
 | 
			
		||||
  ::remove(temp);          // Cancella file temporaneo
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TConfig::set_paragraph(const char* section)
 | 
			
		||||
bool TConfig::set_paragraph(const char* section)
 | 
			
		||||
{
 | 
			
		||||
  bool ok = TRUE;
 | 
			
		||||
  if (section != NULL && _paragraph != section)
 | 
			
		||||
  {
 | 
			
		||||
    if (_dirty) 
 | 
			
		||||
      _write_file();
 | 
			
		||||
    _paragraph = section; 
 | 
			
		||||
    _dirty = FALSE;
 | 
			
		||||
    _read_paragraph();
 | 
			
		||||
    ok = _read_paragraph();
 | 
			
		||||
  }
 | 
			
		||||
  return ok;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// @doc EXTERNAL
 | 
			
		||||
 | 
			
		||||
@ -122,8 +122,10 @@ public:
 | 
			
		||||
  //          sezione indicata.
 | 
			
		||||
  word items(const char* var, const char* section);
 | 
			
		||||
  
 | 
			
		||||
  // @cmember Ritorna il nome del paragrafo attivo
 | 
			
		||||
  const TString& get_paragraph() const { return _paragraph; }
 | 
			
		||||
  // @cmember Setta il paragrafo passato come quello attivo
 | 
			
		||||
  void set_paragraph(const char* par);
 | 
			
		||||
  bool set_paragraph(const char* par);
 | 
			
		||||
 | 
			
		||||
  // @cmember Riempie pl con la lista dei paragrafi
 | 
			
		||||
  int list_paragraphs(TString_array& pl);
 | 
			
		||||
 | 
			
		||||
@ -369,7 +369,7 @@ HIDDEN  int __build_key(RecDes *recd, int numkey, RecType recin, char *key, bool
 | 
			
		||||
{           
 | 
			
		||||
  CHECKD(numkey > 0, "Can't build key ", numkey);
 | 
			
		||||
  
 | 
			
		||||
  const char null_char = (char)0xFF;
 | 
			
		||||
  const char null_char = -1;
 | 
			
		||||
  key[0] = '\0';
 | 
			
		||||
  if (numkey-- <= recd->NKeys)
 | 
			
		||||
  { 
 | 
			
		||||
 | 
			
		||||
@ -308,6 +308,9 @@ void TRelation_application::query_mode(
 | 
			
		||||
    set_mode(MODE_QUERY);
 | 
			
		||||
    init_query_mode(*_mask);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (_transaction.not_empty())  
 | 
			
		||||
    ini2query_mask();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -344,7 +347,11 @@ void TRelation_application::insert_mode()
 | 
			
		||||
 | 
			
		||||
  set_mode(MODE_INS);
 | 
			
		||||
  get_relation()->zero();          // Azzera tutta la relazione!
 | 
			
		||||
  
 | 
			
		||||
  init_insert_mode(*_mask);
 | 
			
		||||
  
 | 
			
		||||
  if (_transaction == "INSERT")
 | 
			
		||||
    ini2insert_mask(); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TRelation_application::modify_mode()
 | 
			
		||||
@ -664,22 +671,22 @@ bool TRelation_application::relation_remove()
 | 
			
		||||
// @comm Se la maschera e' in MODE_MOD non e' possibile cancellare il record e viene
 | 
			
		||||
//   emesso un <f CHECK> di errore.
 | 
			
		||||
{
 | 
			
		||||
  CHECK(_mask->mode() == MODE_MOD, "You can call remove in MODE_MOD only");
 | 
			
		||||
  TRelation *r = get_relation();
 | 
			
		||||
  CHECK(_mask->edit_mode(), "You can call remove in edit mode only");
 | 
			
		||||
  TRelation& r = *get_relation();
 | 
			
		||||
 | 
			
		||||
  r->restore_status();
 | 
			
		||||
  r.restore_status();
 | 
			
		||||
 | 
			
		||||
  if (protected_record(r->curr()))
 | 
			
		||||
  if (protected_record(r.curr()))
 | 
			
		||||
    return message_box("Registrazione non eliminabile");
 | 
			
		||||
 | 
			
		||||
  if (yesno_box("Confermare l'eliminazione"))
 | 
			
		||||
  if (_transaction == "DELETE" || yesno_box("Confermare l'eliminazione"))
 | 
			
		||||
  {
 | 
			
		||||
    r->restore_status();
 | 
			
		||||
    r.restore_status();
 | 
			
		||||
    const bool ok = remove();
 | 
			
		||||
    if (ok)
 | 
			
		||||
      set_limits();
 | 
			
		||||
    else
 | 
			
		||||
      return error_box("Errore di cancellazione %d", r->status());
 | 
			
		||||
      return error_box("Errore di cancellazione %d", r.status());
 | 
			
		||||
  }
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
@ -708,7 +715,13 @@ bool TRelation_application::main_loop()
 | 
			
		||||
  KEY k;
 | 
			
		||||
  
 | 
			
		||||
  // Provoca l'autopremimento per il messaggio di LINK
 | 
			
		||||
  if (_lnflag) _mask->send_key(K_AUTO_ENTER, 0);
 | 
			
		||||
  if (_lnflag) 
 | 
			
		||||
  {
 | 
			
		||||
    if (_transaction == "INSERT")      
 | 
			
		||||
      _mask->send_key(K_CTRL+'N', 0);
 | 
			
		||||
    else
 | 
			
		||||
      _mask->send_key(K_AUTO_ENTER, 0);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  do
 | 
			
		||||
  {
 | 
			
		||||
@ -718,6 +731,9 @@ bool TRelation_application::main_loop()
 | 
			
		||||
    // Dis/abilita cambio parametri
 | 
			
		||||
    enable_menu_item(M_FILE_REVERT, change);
 | 
			
		||||
    
 | 
			
		||||
    if (_mask->edit_mode() && _transaction == "DELETE")
 | 
			
		||||
      _mask->send_key(K_CTRL+'E', 0);    
 | 
			
		||||
 | 
			
		||||
    k = _mask->run();
 | 
			
		||||
 | 
			
		||||
    switch (k)
 | 
			
		||||
@ -739,7 +755,7 @@ bool TRelation_application::main_loop()
 | 
			
		||||
    case K_SAVE:
 | 
			
		||||
      if (save(FALSE))
 | 
			
		||||
      {
 | 
			
		||||
        if (_autoins_caller.not_empty())
 | 
			
		||||
        if (_autoins_caller.not_empty() || _transaction.not_empty())
 | 
			
		||||
        {
 | 
			
		||||
          k = K_QUIT;
 | 
			
		||||
        }
 | 
			
		||||
@ -772,12 +788,14 @@ bool TRelation_application::main_loop()
 | 
			
		||||
      break;
 | 
			
		||||
    case K_DEL:
 | 
			
		||||
      if (relation_remove())
 | 
			
		||||
      {
 | 
			
		||||
        query_mode();
 | 
			
		||||
      if (_autoins_caller.not_empty())
 | 
			
		||||
        if (_autoins_caller.not_empty() || _transaction.not_empty())
 | 
			
		||||
        {    
 | 
			
		||||
          if (_lnflag) _recins = 0;
 | 
			
		||||
          k = K_QUIT;
 | 
			
		||||
        }  
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    case K_F9:   
 | 
			
		||||
      if (_mask->query_mode() || save(TRUE))
 | 
			
		||||
@ -807,8 +825,10 @@ bool TRelation_application::main_loop()
 | 
			
		||||
        default:
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
        if (err == NOERR || err == _islocked) modify_mode();
 | 
			
		||||
        else query_mode();
 | 
			
		||||
        if (err == NOERR || err == _islocked) 
 | 
			
		||||
          modify_mode();
 | 
			
		||||
        else 
 | 
			
		||||
          query_mode();
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
@ -825,11 +845,31 @@ bool TRelation_application::main_loop()
 | 
			
		||||
    msg.send();
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  if (_transaction.not_empty())
 | 
			
		||||
  { 
 | 
			
		||||
    TConfig ini(_ini, "Transaction");
 | 
			
		||||
    if (_recins >= 0)
 | 
			
		||||
    {
 | 
			
		||||
      ini.set("Result", "OK");
 | 
			
		||||
      ini.set("Error", "0");
 | 
			
		||||
      edit_mask2ini();
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {                    
 | 
			
		||||
      const int err = get_relation()->status();
 | 
			
		||||
      ini.set("Result", err == NOERR ? "CANCEL" : "ERROR");
 | 
			
		||||
      ini.set("Error", err);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return k != K_QUIT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TRelation_application::filter()
 | 
			
		||||
{                          
 | 
			
		||||
  if (parse_command_line())
 | 
			
		||||
    return TRUE;
 | 
			
		||||
 | 
			
		||||
  TMailbox mail;
 | 
			
		||||
  TMessage* msg = mail.next_s(MSG_FS);
 | 
			
		||||
 | 
			
		||||
@ -963,7 +1003,6 @@ bool TRelation_application::filter()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TRelation_application::set_link(TMask & m, const char * keyexpr)
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
  CHECK(keyexpr != NULL, "Invalid expression");
 | 
			
		||||
  TToken_string body(keyexpr);
 | 
			
		||||
@ -988,3 +1027,93 @@ void TRelation_application::set_link(TMask & m, const char * keyexpr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool TRelation_application::parse_command_line() 
 | 
			
		||||
{         
 | 
			
		||||
  _ini = _transaction = "";
 | 
			
		||||
  
 | 
			
		||||
  TFilename ini;
 | 
			
		||||
  for (int i = argc()-1; i > 0; i--)
 | 
			
		||||
  {
 | 
			
		||||
    ini = argv(i);
 | 
			
		||||
    ini.upper();
 | 
			
		||||
    if (ini.left(2) == "-F" || ini.left(2) == "/F")
 | 
			
		||||
    {
 | 
			
		||||
      _ini = ini.mid(2);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  } 
 | 
			
		||||
  
 | 
			
		||||
  _lnflag = _ini.not_empty();
 | 
			
		||||
  if (_lnflag)
 | 
			
		||||
  {
 | 
			
		||||
    TConfig cnf(_ini, "Transaction");
 | 
			
		||||
    _transaction = cnf.get("Action");
 | 
			
		||||
    _transaction.upper();
 | 
			
		||||
  }
 | 
			
		||||
  return _lnflag;
 | 
			
		||||
}                         
 | 
			
		||||
 | 
			
		||||
void TRelation_application::ini2query_mask() 
 | 
			
		||||
{            
 | 
			
		||||
  if (_transaction.not_empty())
 | 
			
		||||
  {         
 | 
			
		||||
    TConfig ini(_ini, format("%d", get_relation()->lfile().num()));
 | 
			
		||||
    ini2mask(ini, *_mask, TRUE);
 | 
			
		||||
  }     
 | 
			
		||||
}      
 | 
			
		||||
 | 
			
		||||
void TRelation_application::ini2insert_mask() 
 | 
			
		||||
{
 | 
			
		||||
  if (_transaction.not_empty())
 | 
			
		||||
  {         
 | 
			
		||||
    TConfig ini(_ini, format("%d", get_relation()->lfile().num()));
 | 
			
		||||
    ini2mask(ini, *_mask, FALSE);
 | 
			
		||||
  }     
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
void TRelation_application::ini2mask(TConfig& ini, TMask& m, bool query)
 | 
			
		||||
{
 | 
			
		||||
  const TString defpar = ini.get_paragraph();
 | 
			
		||||
  TString str;
 | 
			
		||||
  for (int f = m.fields()-1; f >= 0; f--)
 | 
			
		||||
  {
 | 
			
		||||
    TMask_field& campo = m.fld(f);
 | 
			
		||||
    if (campo.field())
 | 
			
		||||
    {
 | 
			
		||||
      if (!query || campo.in_key(1))
 | 
			
		||||
      {
 | 
			
		||||
        str = campo.field()->read(ini, defpar);
 | 
			
		||||
        if (str.not_empty())
 | 
			
		||||
          campo.set(str);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  ini.set_paragraph(defpar);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TRelation_application::edit_mask2ini() 
 | 
			
		||||
{            
 | 
			
		||||
  if (_ini.not_empty())
 | 
			
		||||
  {         
 | 
			
		||||
    TString head;
 | 
			
		||||
    head.format("%d", get_relation()->lfile().num());
 | 
			
		||||
    TConfig ini(_ini, head);
 | 
			
		||||
    mask2ini(*_mask, ini);
 | 
			
		||||
  }     
 | 
			
		||||
}      
 | 
			
		||||
 | 
			
		||||
void TRelation_application::mask2ini(TMask& m, TConfig& ini)
 | 
			
		||||
{
 | 
			
		||||
  const TString defpar = ini.get_paragraph();
 | 
			
		||||
  TString str;
 | 
			
		||||
  for (int f = m.fields()-1; f >= 0; f--)
 | 
			
		||||
  {
 | 
			
		||||
    TMask_field& campo = m.fld(f);
 | 
			
		||||
    if (campo.field() && campo.shown())
 | 
			
		||||
    {
 | 
			
		||||
      str = campo.get();
 | 
			
		||||
      campo.field()->write(ini, defpar, str);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -46,6 +46,11 @@ class TRelation_application : public TApplication
 | 
			
		||||
  // @cmember:(INTERNAL) Messaggio da passare all'utente per indicare che e' stata fatta la rinumerazione
 | 
			
		||||
  TString _renum_message;
 | 
			
		||||
  
 | 
			
		||||
  // @cmember:(INTERNAL) Nome del file .ini con la transazione da eseguire
 | 
			
		||||
  TString _ini;
 | 
			
		||||
  // @cmember:(INTERNAL) Azione della transazione corrente
 | 
			
		||||
  TString _transaction;
 | 
			
		||||
  
 | 
			
		||||
  // @cmember:(INTERNAL) Setta i campi fissati da <md TRelation_application::_fixed>
 | 
			
		||||
  bool filter();
 | 
			
		||||
  // @cmember:(INTERNAL) Controlla se una chiave e' completa ed esiste su file
 | 
			
		||||
@ -185,6 +190,15 @@ protected:
 | 
			
		||||
  void set_search_field(short id) 
 | 
			
		||||
  { _search_id = id;}  
 | 
			
		||||
  
 | 
			
		||||
  
 | 
			
		||||
  bool parse_command_line();
 | 
			
		||||
  void ini2query_mask();
 | 
			
		||||
  void ini2insert_mask();
 | 
			
		||||
  void edit_mask2ini();
 | 
			
		||||
 | 
			
		||||
  virtual void ini2mask(TConfig& ini, TMask& m, bool query);
 | 
			
		||||
  virtual void mask2ini(TMask& m, TConfig& ini);
 | 
			
		||||
 | 
			
		||||
// @access Public Member  
 | 
			
		||||
public:
 | 
			
		||||
  // @cmember Ritorna la maschera corrente
 | 
			
		||||
 | 
			
		||||
@ -1781,10 +1781,45 @@ void TFieldref::print_on(ostream& out) const
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char* TFieldref::read(const TRectype& rec) const
 | 
			
		||||
{
 | 
			
		||||
static TString buffer;
 | 
			
		||||
 | 
			
		||||
const char* TFieldref::read(TConfig& ini, const char* defpar) const
 | 
			
		||||
{
 | 
			
		||||
  ini.set_paragraph(_id.empty() ? defpar : _id);
 | 
			
		||||
  
 | 
			
		||||
  if (!ini.exist(_name))
 | 
			
		||||
    return "";
 | 
			
		||||
    
 | 
			
		||||
  buffer = ini.get(_name);
 | 
			
		||||
  if (_from > 0 || _to > 0)
 | 
			
		||||
  {
 | 
			
		||||
    const int l = buffer.len();
 | 
			
		||||
    if (_to < l && _to > 0) buffer.cut(_to);
 | 
			
		||||
    if (_from > 0) buffer.ltrim(_from);
 | 
			
		||||
  } 
 | 
			
		||||
  return buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TFieldref::write(TConfig& ini, const char* defpar, const char* val) const
 | 
			
		||||
{              
 | 
			
		||||
  if ((val == NULL || *val == '\0') && !ini.exist(_name))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  const char* para = _id.empty() ? defpar : _id;
 | 
			
		||||
  if (_from > 0)
 | 
			
		||||
  {
 | 
			
		||||
    buffer = ini.get(_name, para);
 | 
			
		||||
    buffer.overwrite(val, _from);
 | 
			
		||||
    ini.set(_name, buffer, para);
 | 
			
		||||
  }
 | 
			
		||||
  else  
 | 
			
		||||
  { 
 | 
			
		||||
    ini.set(_name, val, para);
 | 
			
		||||
  }  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char* TFieldref::read(const TRectype& rec) const
 | 
			
		||||
{
 | 
			
		||||
  if (_fileid >= CNF_GENERAL)
 | 
			
		||||
  {
 | 
			
		||||
    TToken_string s(_name, '.');
 | 
			
		||||
 | 
			
		||||
@ -536,14 +536,21 @@ public:
 | 
			
		||||
  { return _to; }
 | 
			
		||||
  // @cmember Ritorna la lunghezza del campo di <p TRectype>
 | 
			
		||||
  int len(const 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 <p val>
 | 
			
		||||
  void write(const char* val, TRelation&) const;
 | 
			
		||||
  // @cmember Cerca nel record il campo e vi scrive <p val>
 | 
			
		||||
  void write(const char* val, TRectype& rec) const;
 | 
			
		||||
 | 
			
		||||
  // @cmember Cerca nella relazione il campo e ne ritorna il contenuto
 | 
			
		||||
  const char* read(const TRelation&) const;
 | 
			
		||||
  // @cmember Cerca nella relazione il campo e vi scrive <p val>
 | 
			
		||||
  void write(const char* val, TRelation&) const;
 | 
			
		||||
 | 
			
		||||
  // @cmember Cerca nel file .ini il campo e ne ritorna il valore
 | 
			
		||||
  const char* read(TConfig& ini, const char* defpar) const;
 | 
			
		||||
  // @cmember Cerca nel file .ini il campo e vi scrive <p val>
 | 
			
		||||
  void write(TConfig& ini, const char* defpar, const char* val) const;
 | 
			
		||||
};                          
 | 
			
		||||
 | 
			
		||||
int name2log(const char* name);
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,7 @@
 | 
			
		||||
#define  RMV_ROWTYPE     "ROWTYPE"
 | 
			
		||||
 | 
			
		||||
// To be removed soon
 | 
			
		||||
#define  RMV_NUMGIO      "NUMGIO"
 | 
			
		||||
#define  RMV_RCONTR      "RCONTR"
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -1349,7 +1349,7 @@ void TToken_string::add(
 | 
			
		||||
  // @syntax void add(int n, int pos = -1);
 | 
			
		||||
  //
 | 
			
		||||
  // @comm Permette, a seconda del parametro passato, di aggiungere alla Token
 | 
			
		||||
  //       string un nuovo elemnto gi… completo del carattere di separazione
 | 
			
		||||
  //       string un nuovo elemnto gia' completo del carattere di separazione
 | 
			
		||||
{
 | 
			
		||||
  if (s == NULL || *s == '\0') s = " ";
 | 
			
		||||
  if (pos < 0)
 | 
			
		||||
@ -1484,6 +1484,17 @@ int TString_array::add(const TToken_string& s, int n)
 | 
			
		||||
  return n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const TString_array& TString_array::operator=(const TString_array& a)
 | 
			
		||||
{                      
 | 
			
		||||
  destroy();
 | 
			
		||||
  for (int i = a.last(); i >= 0; i = a.pred(i))
 | 
			
		||||
  {
 | 
			
		||||
    const TToken_string& s = a.row(i);
 | 
			
		||||
    add(s, i);
 | 
			
		||||
  }
 | 
			
		||||
  return a;  
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// @doc EXTERNAL
 | 
			
		||||
 | 
			
		||||
// @mfunc Cerca una stringa nell'array
 | 
			
		||||
 | 
			
		||||
@ -560,7 +560,8 @@ public:
 | 
			
		||||
  // @cmember Restituisce il puntatore alla stringa n dell'array (NULL se non esiste)
 | 
			
		||||
  TToken_string* rowptr(int n)
 | 
			
		||||
  { return (TToken_string*)objptr(n); }
 | 
			
		||||
 | 
			
		||||
  // @cmember assegnamento di un array
 | 
			
		||||
  const TString_array& operator=(const TString_array& a);
 | 
			
		||||
  // @cmember Aggiunge una Token string all'array (chiama <mf TArray::add>)
 | 
			
		||||
  int add(TToken_string* s, int n = -1)
 | 
			
		||||
  { return TArray::add(s, n); }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user