Patch level : 10.0

Files correlati     : ba1.exe
Ricompilazione Demo : [ ]
Commento            :
Migliorata gestione conversioni ed aggiornamenti


git-svn-id: svn://10.65.10.50/trunk@17903 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2008-12-16 10:30:02 +00:00
parent 5bd40db53b
commit aaae86ef5c
4 changed files with 247 additions and 196 deletions

View File

@ -12,10 +12,6 @@
#include <urldefid.h>
#include <user.h>
#include <nditte.h>
#include <errno.h>
#include <fcntl.h>
#ifdef WIN32
#include <io.h>
@ -63,7 +59,7 @@ protected:
virtual void print();
virtual void do_print(TPrinter & p, TRec_sheet & r);
const char* dumpfilename(const FileDes& dep) const;
void load_des(const int maxfidr = 0);
void load_des();
void open_history();
void put_history(const char* firm);
void close_history();
@ -74,7 +70,6 @@ protected:
void open_log();
void write_log(const char* line, const int severity = 0);
void close_log();
bool moveable_file(int file) const;
public:
@ -805,11 +800,9 @@ bool TManutenzione_app::recover(TSystemisamfile& f, int err)
void TManutenzione_app::repair_file(int i)
{
TDir d;
TString s(_MAX_PATH);
d.get(i, _nolock, _nordir, _sysdirop);
TDir d(i);
if (d.eod() == 0)
{
TFilename n(d.filename());
@ -1215,29 +1208,38 @@ void TManutenzione_app::convert_dir()
s << atol (pref) << ".\n";
}
TProgind p(update_items ? update_items : 1, s, false, true);
p.setstatus(1);
TProgind p(update_items ? update_items : 1, s, is_power_station());
for (int i = LF_USER; i <= update_items; i++)
{
const TTrec & rs = (const TTrec &) _recs[i];
const TDir & ds = (const TDir &) _dirs[i];
if (!p.addstatus(1))
break;
const TTrec& rs = (const TTrec&)_recs[i]; // Nuovo tracciato record
const TDir& ds = (const TDir&)_dirs[i];
const long flags = ds.flags();
if (ds.len() > 0)
{
if (flags >= 0L && flags < 10000L)
{
TSystemisamfile f(i);
TString msg = s; msg << prefix().get_filename(i);
d.get(i, _nolock, _nordir, _sysdirop);
TString msg = s; msg << d.filename();
p.set_text(msg);
const int module = abs((int)ds.flags());
TSystemisamfile f(i);
int err = f.is_valid(true);
if (err == -60 || err == -64)
switch (err)
{
case -64:
case -60:
err = NOERR; // verif.
break;
default:
break;
}
d.get(i, _nolock, _nordir, _sysdirop);
if (i > LF_USER && err != NOERR && ((is_com && d.is_com()) || (!is_com && d.is_firm())))
{
if (err == _istrcerr || err == _isbadtrc)
@ -1250,7 +1252,6 @@ void TManutenzione_app::convert_dir()
{
//si decide di proseguire anche se il file non può essere aperto ne tiene traccia nel log (nel caso di utonti..
//..è sempre così, perchè go_on è sempre true)
TString msg;
msg.format(TR("Il file %d non può essere aperto. Errore %d"), i, err);
write_log(msg, 2);
continue;
@ -1316,8 +1317,6 @@ void TManutenzione_app::convert_dir()
d.put(i, _nordir, _sysdirop);
r.put(i);
} //else di if(ds.len()>0...
p.addstatus(1);
} //for (int i = 2; i <= update_items...
d.get(LF_DIR, _nolock, _nordir, _sysdirop);
@ -1326,7 +1325,7 @@ void TManutenzione_app::convert_dir()
put_history(pref);
}
void TManutenzione_app::load_des(const int maxfdir)
void TManutenzione_app::load_des()
{
TWait_cursor waiter;
const TString pref(prefix().name());
@ -1405,11 +1404,13 @@ void TManutenzione_app::load_des(const int maxfdir)
items = (int) d.eod();
TString80 s;
if (standard) s = TR("Caricamento descrizioni archivi standard");
if (standard)
s = TR("Caricamento descrizioni archivi standard");
else
{
if (prefix().is_com()) s << TR("Caricamento descrizioni archivi comuni");
else s << TR("Caricamento descrizioni archivi della ditta ") << atol (pref);
}
TProgind p(items ? items : 1, s, false, true);
p.setstatus(1);
@ -1435,8 +1436,7 @@ void TManutenzione_app::load_des(const int maxfdir)
if (!fexist(descfname))
{
FILE * fd = fopen(descfname, "w");
FILE* fd = fopen(descfname, "w");
if (fd != NULL)
fclose(fd);
}
@ -1512,51 +1512,39 @@ void TManutenzione_app::update()
do_events();
TDir d;
d.get(LF_DIR,_nolock, _nordir, _sysdirop);
const int maxfdir = d.items();
prefix().set("");
load_des(maxfdir);
load_des();
prefix().set_codditta(0L);
open_log();
write_log(TR("Conversione Dati comuni"));
write_log("");
TPointer_array ditte; // Evita di aprire LF_NDITTE
const int nditte = prefix().firms(ditte);
TProgind p(nditte+1, TR("Conversione archivi ditte."), is_power_station());
p.addstatus(1);
update_dir();
convert_dir();
TSystemisamfile ditte(LF_NDITTE);
ditte.open();
const int nditte = ditte.items();
if (nditte)
for (int i = 0; i < nditte; i++)
{
TProgind p(nditte, TR("Conversione archivi ditte."), false, true);
TString mxs;
for (int err = ditte.first(); err == NOERR; err = ditte.next())
if (!p.addstatus(1))
break;
const long codditta = ditte.get_long(i);
TString mxs; mxs << TR("Conversione Ditta") << ' ' << codditta;
p.set_text(mxs);
if (codditta > _history_firm && prefix().exist(codditta) && set_firm(codditta))
{
const TRecnotype rec = ditte.recno();
const long codditta = ditte.get_long(NDT_CODDITTA);
mxs.cut(0) << TR("Conversione Ditta") << ' ' << codditta << ' ' << ditte.get(NDT_RAGSOC);
if (!p.addstatus(1))
break;
p.set_text(mxs);
if (codditta > _history_firm && prefix().exist(codditta))
{
ditte.close();
set_firm(codditta);
write_log("");
write_log(mxs);
write_log("");
update_dir();
convert_dir();
ditte.open();
}
ditte.readat(rec);
write_log("");
write_log(mxs);
write_log("");
update_dir();
convert_dir();
}
ditte.close();
}
//chiude il log di conversione
close_log();
@ -1588,8 +1576,8 @@ void TManutenzione_app::update()
void TManutenzione_app::main_loop()
{
TToken_string riga;
long riga_selezionata;
bool done = false;
long riga_selezionata;
bool done = false;
_browse->rebuild();

View File

@ -5,64 +5,85 @@
#include <prefix.h>
#include <progind.h>
#include <sheet.h>
#include <statbar.h>
#include <urldefid.h>
#include <utility.h>
#include "ba1.h"
class TPackFiles_application:public TSkeleton_application
///////////////////////////////////////////////////////////
// TSel_sheet
///////////////////////////////////////////////////////////
class TSel_sheet : public TArray_sheet
{
TArray_sheet * _selsheet;
long _firm;
public:
TSel_sheet();
};
TSel_sheet::TSel_sheet()
: TArray_sheet(-1, -1, -4, -4, TR("Selezione files"),
HR("@1|N.@5|Nome@20|EOD@7|EOX@7|Lunghezza|Descrizione@43|Flags@7"), 0x8)
{
if (is_power_station())
add_button(DLG_EDIT, PR("Salva TXT"), K_SAVE, BMP_ARCHIVE);
add_button(-1, "", 0, 1); // Separatore
add_button(DLG_INFO, TR("Info"), K_F2, BMP_INFO);
add_button(DLG_HELP, TR("Help"), K_F1, BMP_HELP);
xvt_toolbar_set_last_tool(toolbar(), DLG_QUIT);
}
///////////////////////////////////////////////////////////
// TPackFiles_application
///////////////////////////////////////////////////////////
class TPackFiles_application : public TSkeleton_application
{
TSel_sheet* _selsheet;
long _firm;
protected:
virtual void main_loop();
virtual bool create () ;
virtual bool destroy();
virtual bool extended_firm() const { return TRUE; }
void build_sheet();
void search_blanks(TSystemisamfile & f);
virtual bool extended_firm() const { return true; }
public:
void build_sheet();
void search_blanks(TSystemisamfile& f);
void pack_all();
void save_all();
TPackFiles_application() : _selsheet(NULL), _firm(0) {}
~TPackFiles_application() {};
};
bool TPackFiles_application::create() // initvar e arrmask
{
_firm = get_firm();
if (!set_firm())
return FALSE;
const bool is_prassi = user() == ::dongle().administrator();
_selsheet = new TArray_sheet(-1, -1, -4, -4, TR("Selezione files"),
is_prassi ?
HR("@1|N.@5|Nome@20|EOD@7|EOX@7|Lung. |Descrizione@43|Flags@7") :
HR("N.@5|Nome@20|EOD@7|EOX@7|Lung. |Descrizione@43|Flags@7"),
is_prassi ? 0 : 0x10);
return false;
_selsheet = new TSel_sheet;
return TSkeleton_application::create();
}
bool TPackFiles_application::destroy()
{
if (_firm) set_firm(_firm);
if (_selsheet != NULL) delete _selsheet;
if (_selsheet != NULL) delete _selsheet;
return TSkeleton_application::destroy() ;
}
void TPackFiles_application::build_sheet()
{
_selsheet->destroy();
TDir cdir;
cdir.get(LF_DIR,_nolock,_nordir,_sysdirop);
const bool is_prassi = user() == ::dongle().administrator();
TDir cdir(LF_DIR);
const int nitems = (int)cdir.eod();
for (int i = 0; i < nitems; i++) // fill sheet
TToken_string riga;
for (int i = LF_USER; i <= nitems; i++) // fill sheet
{
TToken_string riga(128);
cdir.get(i+1,_nolock,_nordir,_sysdirop);
if (is_prassi)
riga.add("");
riga.add(i+1);
cdir.get(i, _nolock, _nordir, _sysdirop);
riga = " ";
riga.add(i);
riga.add(cdir.name());
riga.add(cdir.eod());
riga.add(cdir.eox());
@ -75,23 +96,142 @@ void TPackFiles_application::build_sheet()
void TPackFiles_application::search_blanks(TSystemisamfile& f)
{
// Scorre il file corrente per record cancellando eventuali record vuoti/blank
f.open(_excllock, TRUE);
const long records = f.items();
TString k;
for (long i = 0; f.status() == NOERR && i < records; i++)
// Scorre il file corrente per record cancellando eventuali record vuoti/blank
if (f.open(_excllock, true))
{
f.readat(i + 1); // Legge per numero di record, evitando falli di indice...
k = f.curr().key(); // Chiave 1; non puo' essere vuota (anche perche' no si puo' scrivere un record vuoto)
if (f.curr().empty() || k.trim().empty()) // Teoricamente ce ne sarebbe uno solo...
{ // ma se l'indice e' rovinato possono esserci piu' records vuoti
f.curr().discard(); // che vanno cmq eliminati; le pack() successive completano l'opera.
f.rewriteat(i + 1);
const long records = f.items();
TString k;
TRectype& curr = f.curr();
for (long i = 0; f.status() == NOERR && i < records; i++)
{
f.readat(i + 1); // Legge per numero di record, evitando falli di indice...
k = curr.key(); // Chiave 1; non puo' essere vuota (anche perche' no si puo' scrivere un record vuoto)
if (curr.empty() || k.blank()) // Teoricamente ce ne sarebbe uno solo...
{ // ma se l'indice e' rovinato possono esserci piu' records vuoti
curr.discard(); // che vanno cmq eliminati; le pack() successive completano l'opera.
f.rewriteat(i + 1);
}
}
f.close();
}
}
void TPackFiles_application::pack_all()
{
TProgind p(_selsheet->checked(), TR("Compattazione in corso..."), true, true);
FOR_EACH_CHECKED_ROW(*_selsheet, k, row)
{
if (!p.addstatus(1))
break;
const int i = row->get_int(1);
TDir d(i);
if (d.len() == 0)
continue; // Skip files with flags over 10000
const TString pref(prefix().name());
prefix().set("");
const TDir ds(i);
prefix().set(pref);
const long flags = ds.flags();
if (flags >= 10000L)
continue; // Skip files with flags over 10000
TFilename f_name = d.filename();
f_name.ext("dbf");
p.set_text(f_name);
bool retry = FALSE;
const bool present = f_name.exist();
int status = NOERR;
TSystemisamfile f(i);
do
{
status = NOERR;
if (present && flags < 10000L) // Se il file c'e' prova a compattarlo
{
search_blanks(f);
if (f.packfile() == NOERR)
f.packindex();
status = f.status();
if (status == -60) // Se ritorna -60 allora il file e' aperto da qualcuno
retry = yesno_box(FR("Il file %s non puo' essere compattato perche' aperto da altre applicazioni. Riprovare?"),(const char*) f_name);
}
} while (retry); // Ci riprovo !
if (!present || status == -60)
{
// if (!present && d.len() > 0 && has_module(module,CHK_DONGLE))// Se il file non esiste lo costruisce
// f.build(0L);
continue; // Se il file non esiste e non si ha il modulo abilitato evita inutili controlli
} // Se le pack() hanno ritornato -60 ma il file esiste, allora prosegue con il prossimo
if (status != NOERR &&
yesno_box(FR("Rilevato l'errore %d cercando di compattare il file %s. Si desidera scaricarlo e ricaricarlo?"),status,(const char*)f_name))
{
// Dump the file, Zap it and Reload it.
TFilename d_name; d_name.temp("fdump");
if (f.dump(d_name,0) == NOERR) // Dump
{
// Zap
d.get(i,_nolock, _nordir,_sysdirop);
bool is_com = d.is_com();
d.get(i,_nolock, is_com ? _comdir : _nordir);
d.set_eod(0);
d.put(i, is_com ? _comdir : _nordir);
if (f.pack() == NOERR)
if (f.load(d_name) == NOERR) // Reload
d_name.fremove();
else
error_box(FR("Impossibile ricaricare %s. Errore %d"),(const char*) d_name, f.status());
else
error_box(FR("Impossibile azzerare %s. Errore %d"),(const char*) f_name, f.status());
}
else
error_box(FR("Impossibile scaricare %s. Errore %d"),(const char*) d_name, f.status());
}
}
}
void TPackFiles_application::save_all()
{
TFilename cartella; cartella.tempdir();
TString8 firm; firm.format("%05ldA", get_firm());
cartella.add(firm);
if (!cartella.exist())
xvt_fsys_mkdir(cartella);
DIRECTORY dir; xvt_fsys_convert_str_to_dir(cartella, &dir);
xvt_fsys_save_dir();
xvt_fsys_set_dir(&dir);
const int ret = xvt_dm_post_dir_sel(&dir);
xvt_fsys_restore_dir();
if (ret == FL_OK)
{
xvt_fsys_convert_dir_to_str(&dir, cartella.get_buffer(), cartella.size());
if (!cartella.ends_with(firm))
cartella.add(firm);
xvt_fsys_mkdir(cartella);
TProgind p(_selsheet->checked(), TR("Salvataggio in corso..."), true, true);
FOR_EACH_CHECKED_ROW(*_selsheet, k, row)
{
if (!p.addstatus(1))
break;
const TIsam_handle logic = row->get_int(1);
const TDir d(logic);
if (d.len() > 0)
{
TSystemisamfile f(logic);
if (f.is_valid(false) == NOERR)
{
TFilename fname = cartella;
TString16 name; row->get(2, name); name.ltrim(1);
fname.add(name);
fname.ext("txt");
f.dump(fname);
}
}
}
}
f.close();
}
void TPackFiles_application::main_loop()
@ -103,94 +243,18 @@ void TPackFiles_application::main_loop()
tasto = _selsheet->run();
switch(tasto)
{
case K_ENTER:
if (_selsheet->checked()>0)
{
int status;
const long items = _selsheet->items();
bool retry,present;
TFilename f_name,d_name;
TString cmd;
TDir d;
TDir ds;
TProgind p(items, TR("Compattazione in corso..."), TRUE, TRUE );
for (long i = 2; i<=items; i++) // Skip LF_DIR
{
p.setstatus(i);
if (p.iscancelled())
break;
if (!_selsheet->checked(i-1))
continue;
d.get(i);
if (d.len() == 0)
continue; // Skip files with flags over 10000
const TString pref(prefix().name());
prefix().set("");
ds.get(i);
prefix().set(pref);
const long flags = ds.flags();
// const int module = abs((int)flags); non piu usato verificare
if (flags >= 10000L)
continue; // Skip files with flags over 10000
TSystemisamfile f(i);
f_name = d.name();
f_name.ext("dbf");
retry = FALSE;
present = f_name.exist();
do
{
status = NOERR;
if (present && flags < 10000L) // Se il file c'e' prova a compattarlo
{
search_blanks(f);
if (f.packfile() == NOERR)
f.packindex();
status = f.status();
if (status == -60) // Se ritorna -60 allora il file e' aperto da qualcuno
retry = yesno_box(FR("Il file %s non puo' essere compattato perche' aperto da altre applicazioni. Riprovare?"),(const char*) f_name);
}
} while (retry); // Ci riprovo !
if (!present || status == -60)
{
// if (!present && d.len() > 0 && has_module(module,CHK_DONGLE))// Se il file non esiste lo costruisce
// f.build(0L);
continue; // Se il file non esiste e non si ha il modulo abilitato evita inutili controlli
} // Se le pack() hanno ritornato -60 ma il file esiste, allora prosegue con il prossimo
if (status != NOERR &&
yesno_box(FR("Rilevato l'errore %d cercando di compattare il file %s. Si desidera scaricarlo e ricaricarlo?"),status,(const char*)f_name))
{
// Dump the file, Zap it and Reload it.
d_name = "";
d_name.temp("fdump");
if (f.dump(d_name,0) == NOERR) // Dump
{
// Zap
d.get(i,_nolock, _nordir,_sysdirop);
bool is_com = d.is_com();
d.get(i,_nolock, is_com ? _comdir : _nordir);
d.set_eod(0);
d.put(i, is_com ? _comdir : _nordir);
if (f.pack() == NOERR)
if (f.load(d_name) == NOERR) // Reload
remove_file(d_name);
else
error_box(FR("Impossibile ricaricare %s. Errore %d"),(const char*) d_name, f.status());
else
error_box(FR("Impossibile azzerare %s. Errore %d"),(const char*) f_name, f.status());
}
else
error_box(FR("Impossibile scaricare %s. Errore %d"),(const char*) d_name, f.status());
}
}
}
else
warning_box(TR("Nessun file selezionato"));
break;
default:
break;
case K_ENTER:
if (_selsheet->one_checked())
pack_all();
else
warning_box(TR("Nessun file selezionato"));
break;
case K_SAVE:
if (_selsheet->one_checked())
save_all();
break;
default:
break;
}
}
}

View File

@ -458,7 +458,7 @@ bool TInstaller_mask::autoload()
for (int i = modules.last(); i >= 0; i--)
{
TString& str = modules.row(i);
if (str.match("??????A.INI") || str.match("??????a.ini"))
if (str.match("??????A.INI", true))
{
TFilename remote = http_path;
remote << str;

View File

@ -74,7 +74,7 @@ bool TFile_selector::on_field_event(TOperable_field& o, TField_event e, long jol
}
TLocalisamfile f(nfile);
const RecDes& rd = *f.curr().rec_des();
const RecDes& rd = f.curr().rec_des();
TToken_string codes, items;
for (i = 1; i <= rd.NKeys; i++)
{
@ -93,7 +93,7 @@ bool TFile_selector::on_field_event(TOperable_field& o, TField_event e, long jol
if (nfile >= LF_USER && nkey > 0)
{
TLocalisamfile f(nfile);
const RecDes& rd = *f.curr().rec_des();
const RecDes& rd = f.curr().rec_des();
const KeyDes& kd = rd.Ky[nkey-1];
TToken_string str("", '+');
for (int i = 0; i < kd.NkFields; i++)
@ -436,8 +436,7 @@ TRecord_selector::TRecord_selector(const TFile_selector& fm) : TAutomask("ba7300
_relation = new TRelation(logicnum);
_cursor = new TCursor(_relation, "", nkey+1);
const RecDes& rd = *_relation->curr().rec_des();
const RecDes& rd = _relation->curr().rec_des();
const KeyDes& kd = rd.Ky[nkey];
int i;
@ -508,7 +507,7 @@ void TMail_flood_app::fill_key(const TRectype& curr, TConfig& ini) const
ini.set_paragraph(para);
ini.remove_all();
const RecDes& rd = *curr.rec_des();
const RecDes& rd = curr.rec_des();
const KeyDes& kd = rd.Ky[0];
for (int i = 0; i < kd.NkFields; i++)
{
@ -570,7 +569,7 @@ void TMail_flood_app::fill_rows(const TRectype& parent, int logicnum, TConfig& i
TString16 numfield;
const RecDes& rd = *rec.rec_des();
const RecDes& rd = rec.rec_des();
const KeyDes& kd = rd.Ky[0];
for (int i = 0; i < kd.NkFields; i++)
{