Corretta la gestione degli errori e visualizzazione del MsgBox finale.

Corretta gestione dell'errore di disco pieno.


git-svn-id: svn://10.65.10.50/trunk@1621 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1995-07-20 09:06:33 +00:00
parent 14ac0c0356
commit 4db02131c2

View File

@ -1,355 +1,425 @@
#include <applicat.h> #include <applicat.h>
#include <isam.h> #include <isam.h>
#include <date.h> #include <date.h>
#include <prefix.h> #include <prefix.h>
#include <progind.h> #include <progind.h>
#include <urldefid.h> #include <urldefid.h>
#include <utility.h> #include <utility.h>
#define DAYBIAS 36525L #define DAYBIAS 36525L
#define DAYYEAR 365 #define DAYYEAR 365
extern "C" { extern "C" {
int findfld(RecDes *, const char *); int findfld(RecDes *, const char *);
}; };
byte m1[12] = {31,28,31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; byte m1[12] = {31,28,31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int m2[12] = {31,59,90,120,151,181,212,243,273,304,334,365}; int m2[12] = {31,59,90,120,151,181,212,243,273,304,334,365};
HIDDEN int CGetField(const char *fieldname,RecDes* recd,RecType recin,long* d) HIDDEN int CGetField(const char *fieldname,RecDes* recd,RecType recin,long* d)
{ {
int p, i; int p, i;
unsigned int off; unsigned int off;
byte len; byte len;
char *s1, s[10]; char *s1, s[10];
if ((p = findfld(recd, fieldname)) != -1) if ((p = findfld(recd, fieldname)) != -1)
{ {
off = recd->Fd[p].RecOff; off = recd->Fd[p].RecOff;
len = recd->Fd[p].Len; len = recd->Fd[p].Len;
if (recd->Fd[p].TypeF != _datefld) if (recd->Fd[p].TypeF != _datefld)
{ {
while ((recin[off] == ' ') && (len)) while ((recin[off] == ' ') && (len))
{ {
off++; off++;
len--; len--;
} }
} }
if (len) if (len)
{ {
s1 = recin + off; s1 = recin + off;
for (i = 0; i < len; i++) s[i] = s1[i]; for (i = 0; i < len; i++) s[i] = s1[i];
s[len] = '\0'; s[len] = '\0';
while ((len) && (s[len - 1] == ' ')) s[--len] = '\0'; while ((len) && (s[len - 1] == ' ')) s[--len] = '\0';
} }
else strcpy(s, ""); else strcpy(s, "");
if (recd->Fd[p].TypeF == _datefld) if (recd->Fd[p].TypeF == _datefld)
{ {
if (strlen(s)) if (strlen(s))
*d=atol(s); *d=atol(s);
else *d=0; else *d=0;
} }
return (0); return (0);
} }
else else
{ {
fatal_box("Non esiste il campo %s", fieldname); fatal_box("Non esiste il campo %s", fieldname);
return(-1); return(-1);
} }
} }
class TIsam_date_converter : public TApplication class TIsam_date_converter : public TApplication
{ {
TFilename _logfile; TFilename _logfile;
bool _errors_found;
protected: protected:
virtual bool create () ; virtual bool create () ;
virtual bool destroy(); virtual bool destroy();
void update(); void update();
void update_dir(); void update_dir();
void convert_dir(); void convert_dir();
int convert_file(int logicnum); int convert_file(int logicnum);
public: public:
TIsam_date_converter() {} TIsam_date_converter() {}
~TIsam_date_converter() {} ~TIsam_date_converter() {}
}; };
bool TIsam_date_converter::create() // initvar e arrmask bool TIsam_date_converter::create() // initvar e arrmask
{ {
TApplication::create(); TApplication::create();
_logfile.temp("convlog"); update();
FILE * fp = fopen((const char*)_logfile,"w"); return FALSE;
fclose(fp); }
update();
return FALSE; bool TIsam_date_converter::destroy() // releasev e arrmask
}
{
bool TIsam_date_converter::destroy() // releasev e arrmask return TApplication::destroy() ;
}
{
return TApplication::destroy() ; void TIsam_date_converter::update()
}
{
void TIsam_date_converter::update() _logfile.temp("cnvlog");
FILE * fp = fopen(_logfile,"w");
{ fclose(fp);
long firm = get_firm(); _errors_found = FALSE;
TString pref;
if (firm == 0) pref = prefix().name(); long firm = get_firm();
TString pref;
do_events(); if (firm == 0) pref = prefix().name();
begin_wait();
// Converte i files in formato DBIII, FOXPRO... do_events();
prefix().set(""); begin_wait();
update_dir(); // Converte i files in formato DBIII, FOXPRO...
set_autoload_new_files(FALSE); prefix().set("");
prefix().set("com"); update_dir();
update_dir(); set_autoload_new_files(FALSE);
convert_dir(); prefix().set("com");
update_dir();
TLocalisamfile ditte(LF_NDITTE); convert_dir();
for (ditte.first(); !ditte.eof(); ditte.next()) TLocalisamfile ditte(LF_NDITTE);
{
const long codditta = ditte.get_long("CODDITTA"); for (ditte.first(); !ditte.eof(); ditte.next())
const TRecnotype rec = ditte.recno(); {
const long codditta = ditte.get_long("CODDITTA");
if (prefix().exist(codditta)) const TRecnotype rec = ditte.recno();
{
set_firm(codditta); if (prefix().exist(codditta))
update_dir(); {
convert_dir(); set_firm(codditta);
} update_dir();
} convert_dir();
}
if (firm > 0) set_firm(firm); }
else prefix().set(pref);
set_autoload_new_files(TRUE); if (firm > 0) set_firm(firm);
end_wait(); else prefix().set(pref);
TString80 s; set_autoload_new_files(TRUE);
s << "Esaminare il file di log " << _logfile << " in caso di errori." ; end_wait();
message_box(s); if (_errors_found)
} {
TString80 s;
void TIsam_date_converter::update_dir() s << "Esaminare il file di log " << _logfile << " per il riepilogo degli errori." ;
message_box(s);
{ } else
TDir d; ::remove(_logfile);
}
d.get(LF_DIR);
const int items = (int)d.eod(); void TIsam_date_converter::update_dir()
TString80 s("Aggiornamento direttorio ");
TString pref(prefix().name()); {
TDir d;
if (pref.empty()) s << "standard";
else d.get(LF_DIR);
if (pref == "com") s << "comune"; const int items = (int)d.eod();
else s << " della ditta " << atol (pref); TString80 s("Aggiornamento direttorio ");
TString pref(prefix().name());
TProgind p((long)(items ? items : 1), s, TRUE, TRUE, 70);
if (pref.empty()) s << "standard";
p.setstatus(1L); else
for (int i = 2; i <= items; i++) if (pref == "com") s << "comune";
{ else s << " della ditta " << atol (pref);
p.addstatus(1L);
d.get(i, _nolock, _nordir, _sysdirop); TProgind p((long)(items ? items : 1), s, TRUE, TRUE, 70);
TFilename s(d.name()); p.setstatus(1L);
for (int i = 2; i <= items; i++)
s.ext(""); {
strcpy((char *) d.name(), s); p.addstatus(1L);
d.put(i, _nordir, _sysdirop); d.get(i, _nolock, _nordir, _sysdirop);
}
} TFilename s(d.name());
void TIsam_date_converter::convert_dir() s.ext("");
strcpy((char *) d.name(), s);
{ d.put(i, _nordir, _sysdirop);
const TString pref(prefix().name()); }
const bool is_com = prefix().is_com(); }
TDir d;
void TIsam_date_converter::convert_dir()
d.get(LF_DIR);
const int items = (int)d.eod(); {
TString80 s("Aggiornamento archivi "); const TString pref(prefix().name());
const bool is_com = prefix().is_com();
if (pref == "com") s << "comuni"; TDir d;
else s << " della ditta " << atol (pref);
d.get(LF_DIR);
TProgind p((long)(items ? items : 1), s, TRUE, TRUE, 70); const int items = (int)d.eod();
TString80 s("Aggiornamento archivi ");
p.setstatus(1L);
if (pref == "com") s << "comuni";
for (int i = 2; i <= items; i++) else s << " della ditta " << atol (pref);
{
p.setstatus((long)(i+1)); TProgind p((long)(items ? items : 1), s, TRUE, TRUE, 70);
d.get(i, _nolock, _nordir, _sysdirop);
p.setstatus(1L);
const bool to_convert = (is_com ? d.is_com() : d.is_firm());
for (int i = 2; i <= items; i++)
if (to_convert) {
convert_file(i); p.setstatus((long)(i+1));
} d.get(i, _nolock, _nordir, _sysdirop);
}
const bool to_convert = (is_com ? d.is_com() : d.is_firm());
int TIsam_date_converter::convert_file(int logicnum)
if (to_convert)
{ convert_file(i);
TDir dir; }
TTrec r; }
int err = NOERR;
bool restore_original=FALSE; int TIsam_date_converter::convert_file(int logicnum)
r.get(logicnum);
RecDes *rd=r.rec(); {
TRecnotype i; TDir dir;
const int nflds = r.fields(); TTrec r;
const int nkeys = r.keys(); int err = NOERR;
bool restore_original=FALSE, retry_file=FALSE;
dir.get(logicnum); r.get(logicnum);
if (dir.len() == 0 || nflds < 1 || nkeys < 1) return 0; RecDes *rd=r.rec();
const char * fp = dir.name(); TRecnotype i;
TFilename old(fp); const int nflds = r.fields();
const TRecnotype nitems = dir.eod(); const int nkeys = r.keys();
const TRecnotype neox = dir.eox();
TFile f(dir.len());
do // External loop creation file in case of a disk full error.
old.ext("dta"); { // Appending records can easily reduce disk space!
if (fexist(old)) dir.get(logicnum);
{ if (dir.len() == 0 || nflds < 1 || nkeys < 1) return 0;
f.open(old); const char * fp = dir.name();
{ TFilename old(fp);
TSystemisamfile newfile(logicnum); const TRecnotype nitems = dir.eod();
const TRecnotype neox = dir.eox();
if (newfile.build(10) != NOERR) TFile f(dir.len());
fatal_box("Non riesco a creare il file %s : errore n. %d", fp, newfile.status()); old.ext("dta");
} if (fexist(old))
{
TString s(80); f.open(old);
{
s.format("Aggiornamento archivio %s", fp); TSystemisamfile newfile(logicnum);
TProgind p((long)(nitems ? nitems : 1), s, TRUE, TRUE, 70); bool retry = FALSE;
TLocalisamfile newfile(logicnum); do // Internal loop creation file in case of a disk full error.
TToken_string ts(128); // Build token_string with the names of date fields and logical fields { // The program asks to continue (suspending momentanely execution),
TToken_string tslog(128); newfile.build(10); // permitting the user to switch to a DOS session and free space on disk.
switch (newfile.status())
for (int j=0; j<r.fields(); j++) {
if (rd->Fd[j].TypeF == _datefld) case NOERR:
ts.add(rd->Fd[j].Name); retry=FALSE;
else break;
if (rd->Fd[j].TypeF == _boolfld) case _isfilefull:
tslog.add(rd->Fd[j].Name); if (!yesno_box("Il disco e' pieno. Non riesco a creare il file %s. Riprovo?", fp))
const int tslog_items = tslog.items(); {
const int ts_items = ts.items(); message_box("Liberare spazio sull'unita' interessata e rieseguire la conversione.");
for (i = 1; newfile.good() && i <= dir.eod(); i++) stop_run();
{ }
f.read(newfile.curr().string(),i); retry=TRUE;
if (newfile.curr().string()[0] == '\0') break;
{ default:
newfile.curr().recall(); fatal_box("Non riesco a creare il file %s : errore n. %d", fp, newfile.status());
if (tslog_items > 0) break;
for (const char * field_name = tslog.get(0); field_name != NULL; field_name = tslog.get()) }
{ } while (retry);
const TString16 value(newfile.curr().get_str(field_name)); }
newfile.put(field_name,value == "X"); TString s(80);
}
if (ts_items > 0) s.format("Aggiornamento archivio %s", fp);
for (const char *field_name = ts.get(0); field_name != NULL; field_name = ts.get()) TProgind p((long)(nitems ? nitems : 1), s, TRUE, TRUE, 70);
{ TLocalisamfile newfile(logicnum);
long wd; TToken_string ts(128); // Build token_string with the names of date fields and logical fields
CGetField(field_name,rd,newfile.curr().string(),&wd); TToken_string tslog(128);
TDate d(wd);
newfile.put(field_name,d); for (int j=0; j<r.fields(); j++)
} if (rd->Fd[j].TypeF == _datefld)
} ts.add(rd->Fd[j].Name);
else else
newfile.curr().discard(); if (rd->Fd[j].TypeF == _boolfld)
if ((i % 50) == 0) p.setstatus((long)(i + 1)); tslog.add(rd->Fd[j].Name);
if (!newfile.curr().isdeleted()) const int tslog_items = tslog.items();
newfile.write(); const int ts_items = ts.items();
}
p.setstatus((long)nitems); for (i = 1; newfile.good() && i <= dir.eod(); i++)
f.close(); {
err=newfile.status(); f.read(newfile.curr().string(),i);
if (newfile.good()) newfile.curr().setdirty();
{ if (newfile.curr().string()[0] == '\0')
old.ext("dta"); {
::remove(old); newfile.curr().recall();
old.ext("ndx"); if (tslog_items > 0)
::remove(old); for (const char * field_name = tslog.get(0); field_name != NULL; field_name = tslog.get())
} {
else const TString16 value(newfile.curr().get_str(field_name));
{
error_box("Errore n.ro %d nella conversione dell' archivio %s:\n %ld records non convertiti.", newfile.put(field_name,value == "X");
err, fp, nitems - i + 2); }
restore_original=TRUE; if (ts_items > 0)
} for (const char *field_name = ts.get(0); field_name != NULL; field_name = ts.get())
} {
else long wd;
{ CGetField(field_name,rd,newfile.curr().string(),&wd);
// Crea il file se non esiste il relativo .DTA. TDate d(wd);
const TString pref(prefix().name()); newfile.put(field_name,d);
const bool is_com = prefix().is_com(); }
}
prefix().set(""); else
dir.get(logicnum); newfile.curr().discard();
const int module = abs((int)dir.flags()); if ((i % 50) == 0) p.setstatus((long)(i + 1));
prefix().set(pref); if (!newfile.curr().isdeleted())
dir.get(logicnum, _nolock, _nordir, _sysdirop); newfile.write();
bool to_create = (is_com ? dir.is_com() : dir.is_firm()); }
if (to_create && has_module(module, CHK_DONGLE)) p.setstatus((long)nitems);
{ f.close();
dir.get(logicnum); err=newfile.status();
TFilename s(dir.name()); if (newfile.good())
s.ext("dbf"); {
if (!fexist(s)) // Crea il file solo se non esiste il .DBF old.ext("dta");
{ ::remove(old);
TSystemisamfile f(logicnum); old.ext("ndx");
f.build(10L); ::remove(old);
} restore_original=FALSE;
} retry_file=FALSE;
} }
if (restore_original) else
{ {
// Remove files partially converted _errors_found=TRUE;
old.ext("dbf"); if (err == _isfilefull)
::remove(old); {
TToken_string t(10); if (!yesno_box("Il disco e' pieno. Non riesco a scrivere sul file %s. Riprovo?", fp))
get_idx_names(logicnum,t); {
for (const char * name=t.get(0); name != NULL; name=t.get()) message_box("Liberare spazio sull'unita' interessata e rieseguire la conversione.");
::remove(name); retry_file=FALSE;
if (t.items() > 1) // A .cgp must be removed too! } else
{ retry_file=TRUE;
old.ext("cgp"); }
::remove(old); else
} {
// Put dir to restore original EOD and EOX. error_box("Errore n.ro %d nella conversione dell' archivio %s:\n %ld records non convertiti.",
dir.get(logicnum,_lock,_nordir,_sysdirop); err, fp, nitems - i + 2);
dir.eod()=nitems; retry_file=FALSE;
dir.eox()=neox; }
dir.put(logicnum,_nordir,_sysdirop); restore_original=TRUE;
}
FILE *fp = fopen((const char*)_logfile,"a"); }
old.ext("dta"); else
fprintf(fp,"File: %s (%d). %ld records non convertiti. Errore %d.\n", {
(const char*) old, logicnum, nitems-i+2, err); // Crea il file se non esiste il relativo .DTA.
fclose(fp); const TString pref(prefix().name());
} const bool is_com = prefix().is_com();
return err;
} prefix().set("");
dir.get(logicnum);
const int module = abs((int)dir.flags());
int main(int argc, char** argv) prefix().set(pref);
{ dir.get(logicnum, _nolock, _nordir, _sysdirop);
TIsam_date_converter a; bool to_create = (is_com ? dir.is_com() : dir.is_firm());
if (to_create && has_module(module, CHK_DONGLE))
a.run(argc, argv, "Conversione a CodeBase"); {
return 0; dir.get(logicnum);
} TFilename s(dir.name());
s.ext("dbf");
if (!fexist(s)) // Crea il file solo se non esiste il .DBF
{
TSystemisamfile f(logicnum);
bool retry = FALSE;
do
{
f.build(10);
switch (f.status())
{
case NOERR:
break;
case _isfilefull:
if (!yesno_box("Il disco e' pieno. Non riesco a creare il file %s. Riprovo?", fp))
{
message_box("Liberare spazio sull'unita' interessata e rieseguire la conversione.");
stop_run();
}
retry=TRUE;
break;
default:
fatal_box("Non riesco a creare il file %s : errore n. %d", fp, f.status());
break;
}
} while (retry);
}
}
}
if (restore_original)
{
// Remove files partially converted
old.ext("dbf");
::remove(old);
TToken_string t(10);
get_idx_names(logicnum,t);
for (const char * name=t.get(0); name != NULL; name=t.get())
::remove(name);
if (t.items() > 1) // A .cgp must be removed too!
{
old.ext("cgp");
::remove(old);
}
// Put dir to restore original EOD and EOX.
dir.get(logicnum,_lock,_nordir,_sysdirop);
dir.eod()=nitems;
dir.eox()=neox;
dir.put(logicnum,_nordir,_sysdirop);
if (!retry_file)
{
FILE *f = fopen((const char*)_logfile,"a");
old.ext("dta");
fprintf(f,"File: %s (%d). %ld records non convertiti. Errore %d.\n",
(const char*) old, logicnum, nitems-i+2, err);
fclose(f);
}
}
} while (retry_file && (err == _isfilefull));
if (err == _isfilefull) // This happens only when the user decides to answer NO.
stop_run();
return err;
}
int main(int argc, char** argv)
{
TIsam_date_converter a;
a.run(argc, argv, "Conversione a CodeBase");
return 0;
}