From f35f78fd63dd4916d7570a802ea3d0127265d4f5 Mon Sep 17 00:00:00 2001 From: angelo Date: Thu, 12 Jun 1997 16:43:29 +0000 Subject: [PATCH] Modifica a BA1, aggiunti alcune features: - creazione automatica di dir.gen e trc.gen (vuoti) in caso non esistano nel direttorio PRASSI. - aggiunta possibilita' di caricare tracciati nuovi oltre il numero prefissato da dir.gen. - corretti alcuni comportamenti anomali in conversione archivi (aggiunti piu' casi di controllo in cui il programma poteva piantarsi) Sono pronto anche per la crocifissione in sala mensa... git-svn-id: svn://10.65.10.50/trunk@4639 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ba/ba1100.cpp | 222 ++++++++++++++++++++++++++++++++++++++------------ ba/ba1101.cpp | 10 +++ ba/ba1102.cpp | 5 +- 3 files changed, 182 insertions(+), 55 deletions(-) diff --git a/ba/ba1100.cpp b/ba/ba1100.cpp index c10088f76..1faae92d4 100755 --- a/ba/ba1100.cpp +++ b/ba/ba1100.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include // Serve per GetFreeSpace #define XVT_INCL_NATIVE @@ -33,6 +35,8 @@ struct direct #endif #define History_file "conv.his" +#define Dir_file "dir.gen" +#define Trc_file "trc.gen" class TManutenzione_app : public TApplication { @@ -67,7 +71,7 @@ protected: public: - TManutenzione_app() : _browse(NULL), _rec(NULL), _mask(NULL), _firm(0), _level(0) {} + TManutenzione_app(); }; HIDDEN void build_filelist(const char *path, TArray & list) @@ -113,6 +117,52 @@ HIDDEN void build_filelist(const char *path, TArray & list) #endif } +TManutenzione_app::TManutenzione_app() : _browse(NULL), _rec(NULL), _mask(NULL), _firm(0), _level(0) +{ + if (!fexist(Dir_file)) // controlla l'esistenza dei direttori standard (dir.gen e trc.gen) + { // vengono creati se non esistono + TDir d; + FileDes* fd = d.filedesc(); + int handle; + + strcpy(fd->SysName,"$dir.gen"); + fd->LenR =160; + fd->EOD = fd->EOX = 1L; + fd->Flags = 0; + strcpy(fd->Des ,"Directory"); + strcpy(fd->FCalc,"0"); + strcpy(fd->GenPrompt,""); +#if XVT_OS == XVT_OS_WIN + if ((handle = sopen(Dir_file, O_RDWR|O_BINARY|O_CREAT,SH_DENYNO,S_IREAD|S_IWRITE)) != -1) +#else + if ((handle = open(Dir_file, O_RDWR|O_BINARY|O_CREAT,0666)) != -1) +#endif + { + if (write( handle, (char*)fd, sizeof(FileDes)) == -1) + fatal_box("Impossibile scrivere il file dir.gen per dati standard: errore %d",errno); + close(handle); + } + else fatal_box("Impossibile creare il file dir.gen per dati standard: errore %d",errno); + } + if (!fexist(Trc_file)) + { + TTrec r; + RecDes* rd = r.rec(); + int handle; +#if XVT_OS == XVT_OS_WIN + if ((handle = sopen(Trc_file, O_RDWR|O_BINARY|O_CREAT,SH_DENYNO,S_IREAD|S_IWRITE)) != -1) +#else + if ((handle = open(Trc_file, O_RDWR|O_BINARY|O_CREAT,0666)) != -1) +#endif + { + if (write( handle, (char*)rd, sizeof(RecDes)) == -1) + fatal_box("Impossibile scrivere il file trc.gen per dati standard: errore %d",errno); + close(handle); + } + else fatal_box("Impossibile creare il file trc.gen per dati standard: errore %d",errno); + } +} + void TManutenzione_app::do_print(TPrinter & p, TRec_sheet & r) { @@ -703,6 +753,7 @@ void TManutenzione_app::update_dir() const bool is_firm = ds.is_firm(); const bool to_create = (is_com ? ds.is_com() : ds.is_firm()); + // TString s(ds.name()); TFilename fd(ds.filename()); @@ -712,7 +763,18 @@ void TManutenzione_app::update_dir() // word len = ds.len(); // prefix().set(pref); d.get(i); + + TFilename fs(d.filename()); + if (strrchr(d.name(),'.') != NULL) // No extension please! + { + d.get(i, _nolock, _nordir, _sysdirop); + TFilename ext(d.name()); + ext.ext(""); + d.set_name(ext); + d.put(i, _nordir, _sysdirop); + } + if (!fexist(fs)) { @@ -766,7 +828,19 @@ void TManutenzione_app::update_dir() } } d.get(i, _nolock, _nordir, _sysdirop); - if (to_create) + + bool cmn_file = FALSE; + bool valid_file = i == LF_PCON || i == LF_CLIFO || i == LF_CAUSALI || i == LF_RCAUSALI; + if (!is_com && valid_file && d.is_com()) + cmn_file = TRUE; // Salta in questo caso: + // sto aggiornando le ditte, + // il file in questione e' uno di quelli che possono essere comuni + // il file e' in comune + // Serve per evitare che durante l'aggiornamento i file + // PCON, CLIFO, CAUS ed RCAUS vengano spostati da COM alla + // prima ditta + + if (to_create && !cmn_file) { /* non piu' necessario if (is_firm) @@ -777,7 +851,7 @@ void TManutenzione_app::update_dir() } */ - if (flags < 10000L && fexist(fs) && (fd != fs)) + if (flags < 10000L && flags > -1L && fexist(fs) && (fd != fs)) { bool ok = TRUE; TFilename path(fd.path()); @@ -852,8 +926,7 @@ void TManutenzione_app::update_dir() } } - fs.ext(""); - if (fs.name()[0] == '\0') // Questo controlla se accidentalmente non e' piu' contenuto il nome del file + if (!fexist(fs) && !valid_file) // Controlla eventali nomi di files non validi (ed es. %.dbf ecc.) { d.set(ds.name(), d.eox(), 0L, ds.des(), d.expr()); towrite = TRUE; @@ -863,7 +936,10 @@ void TManutenzione_app::update_dir() { towrite = (TString(ds.des()) != d.des()); if (towrite) - strcpy((char *) d.des(), ds.des()); + if (!valid_file) + d.set(ds.name(), d.eox(), d.eod(), ds.des(), d.expr()); + else + strcpy((char *) d.des(), ds.des()); } if (towrite) d.put(i, _nordir, _sysdirop); @@ -928,7 +1004,7 @@ void TManutenzione_app::convert_dir() // prefix().set(pref); if (ds.len() > 0) { - if (flags < 10000L) + if (flags < 10000L && flags > -1L) { TBaseisamfile b(i); const int module = abs((int)ds.flags()); @@ -941,25 +1017,8 @@ void TManutenzione_app::convert_dir() stop_run(); else continue; } - - TSystemisamfile f(i); - - f.update(rs); - - if (f.status() == 8) // cio' significa che e' accaduto quasi l'irreparabile... - { - { - TLocalisamfile u(LF_USER); - u.zero(); u.put("USERNAME","PRASSI"); - if (u.read() == NOERR) - { - u.zero("AUTSTR"); - u.rewrite(); - } - } - stop_run(); - } - d.get(i, _nolock, _nordir, _sysdirop); + + //d.get(i, _nolock, _nordir, _sysdirop); bool to_create = (is_com ? d.is_com() : d.is_firm()); const bool actual_create = to_create; @@ -978,10 +1037,30 @@ void TManutenzione_app::convert_dir() { TSystemisamfile f(i); set_autoload_new_files(actual_create); - f.build(10L); + f.build(0L,rs); set_autoload_new_files(TRUE); + // Anche se il file non esisteva, prosegue, perche' possono esserci conversioni + // specificate in FCONV.INI } } + + + TSystemisamfile f(i); + + f.update(rs); + if (f.status() == 8) // cio' significa che e' accaduto quasi l'irreparabile... + { + { + TLocalisamfile u(LF_USER); + u.zero(); u.put("USERNAME","PRASSI"); + if (u.read() == NOERR) + { + u.zero("AUTSTR"); + u.rewrite(); + } + } + stop_run(); + } } else // altrimenti se i flags sono oltre i fatidici 10000... { @@ -1026,47 +1105,82 @@ void TManutenzione_app::load_des() if (standard) // carica eventuali nuove descrizioni ed il nuovo livello archivi { - // Cerca in RECDESC i files f[nnn].dir, la cui numerazione inizia da items+1 + // Cerca in RECDESC i files f[nnn].dir + ifstream infile; + TString ws; TFilename fn; - TDir td; + TDir td,new_dir; TTrec tr; +#if XVT_OS == XVT_OS_WIN + struct _find_t c_file; +#endif + int ln = items,last_newln = items; + bool firstime = TRUE,ok; tr.zero(); fn << DESCDIR << "/level.dir"; if (fexist(fn)) { - { - long fl; - ifstream level(fn); - level >> fl; - if (fl > flags) flags = fl; - } + long fl; + infile.open(fn); + infile >> fl; + if (fl > flags) flags = fl; + infile.close(); unlink(fn); } - for (int xf=2;;xf++) + // scandisce *.dir in RECDESC tramite dos_findfirst e _dos_findnext + // eventuali "buchi" oltre al numero attuale di items vengono rimpiazzati + // con tracciati vuoti. + + fn.format("%s/f*.dir",DESCDIR); +#if XVT_OS == XVT_OS_WIN + do { - fn = DESCDIR; - fn << "/f" << xf; - fn.ext("dir"); - if (!fexist(fn) && xf > items) // appena non ne trova uno oltre il numero di items ha finito - break; - // altrimenti lo carica nel direttorio standard, - // aggiungendo un tracciato vuoto - if (fexist(fn)) + if (firstime) { - ifstream in(fn); - in >> td; - td.put(xf,_nordir,_sysdirop); - if (xf > items) - tr.put(xf); + ok = _dos_findfirst(fn, _A_NORMAL, &c_file ) == 0; + firstime = FALSE; } - unlink(fn); + fn.format("%s/%s",DESCDIR,c_file.name); + if (ok) + { + infile.open(fn); + infile >> td; + ln = td.num(); + const bool is_new = ln > last_newln; // memorizza l'ultimo record scritto come nuovo + if (is_new) // aggiunge i files che mancano + { + for (int i = last_newln+1; i items) // rialloca openf altrimenti la TPrefix::closeall() provoca un grazioso errore in applicazione + { + isfdptr *newopenf = new isfdptr[last_newln]; + for (int i = 0; i 50 ? 50 : len); + { + TString16 f; f << flags << '_'; + m.add_string(nid++,curpage, s, 3, currow, len, f, len > 50 ? 50 : len); + } break; case _intfld: case _longfld: