From fbff7d949b15e9a5230dc10455f74e548dd466bd Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 15 Mar 1995 16:19:56 +0000 Subject: [PATCH] Corretta formattazione git-svn-id: svn://10.65.10.50/trunk@1125 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ba/ba1301.cpp | 1210 +++++++++++++++++++++++++------------------------ 1 file changed, 607 insertions(+), 603 deletions(-) diff --git a/ba/ba1301.cpp b/ba/ba1301.cpp index 5b39f65f3..d5cd503ea 100755 --- a/ba/ba1301.cpp +++ b/ba/ba1301.cpp @@ -1,603 +1,607 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if XVT_OS!=XVT_OS_SCOUNIX -#include -#endif - -#include "ba1300.h" - -extern "C" { - void cgettime(char *); -} - -TTestSheet::TTestSheet(const char* titolo, const char* colonne,byte bottoni) -:TDir_sheet(titolo, colonne, bottoni) -{} - -TTestSheet::~TTestSheet() -{} - -void TTestSheet::page_build(long first, byte rows) - -{ - TToken_string l(128); - for (byte i = 0; i < rows; i++) - { - const int n = int(i+first+1); - dir()->get (n,_nolock,_nordir,_sysdirop); - l.cut(0); - l.add(""); - l.add(format("%3d", n)); // Numero progressivo del file - l.add(dir()->name()); - const TRecnotype eod = dir()->eod(); - l.add(format("%ld", eod)); - const TRecnotype eox = dir()->eox(); - l.add(format("%ld", eox)); - const word len = dir()->len(); - l.add(format("%u", len)); - l.add(dir()->des()); - l.add(format("%ld", dir()->flags())); - set_row(l, i); - } -} - -void TTestSheet::sr_status(bool save) -{ - for (int i=0; i>1; - cbits++; - } - scale=(unsigned int)0x8000; - for (i=1;i<=(long)cbits;i++) - { - scale=scale>>1; - scale |= 0x8000; - } - // Extracts "random" seed from time - time(&tloc); - parm=(unsigned int)(tloc & 0x0000FFFF); - srand(parm); - // Mix array... - for (i=0;i>1; - if (((long) rnd)>=eod) // Difficile che accada... - rnd=(unsigned int) eod-1; - com=_randseq[i]; - _randseq[i]=_randseq[(long)rnd]; - _randseq[(long)rnd]=com; - } -} - -int TTestProc::ctrl_keys() -{ - int err=1; - - for (int nk=1;nk<=_nkeys;nk++) - { - _workf->setkey(nk); - if ((err=_workf->first())==NOERR) - return NOERR; - } - return err; -} - -void TTestProc::do_test_1() -{ - bool FoundError; - long i,EOD; - int err; - time_t inix,finix; - - _nfile=0; - while ((_nfile++ <= get_isheet()->items()) && !_block) - { - EOD=get_isheet()->row(_nfile-1).get_long(3); - if (get_isheet()->checked(_nfile-1) && EOD > 0) - { - get_win()->WriteW(33,7,(const char*)TString(18).format("%-18s",get_isheet()->row(_nfile-1).get(2))); - get_win()->WriteW(33,12,"000:00:00"); - get_win()->WriteW(33,13,"000:00:00"); - if (_ntest == 1) - { - TSystemisamfile f(_nfile); - get_win()->WriteW(33,10,"COMPATTAMENTO "); - if ((f.packfile(FALSE)!=NOERR)||(f.packindex(FALSE) != NOERR)) - error_box("Errore in compattamento file %d",_nfile); - get_win()->WriteW(33,10,"COPIA DI SICUREZZA "); - filecopy(); - set_rmc(TRUE); - } // If it was test # 1 - _workf = new TTestFile(_nfile); - time(&inix); - if (_workf->open(_excllock) == NOERR) - { - TTrec r; - r.get(_nfile); - _nkeys=r.keys(); - FoundError=FALSE; - i=0; - EOD=_workf->eod(); - get_win()->WriteW(33,9,(const char*)TString(14).format(" 0/%-7ld",EOD)); - get_win()->WriteW(33,10,"TEST1 (cisreadrec-cisdelete)"); - _randseq = new long[EOD]; - do_random(EOD); - while (!FoundError && ireadat(number(i++)))==NOERR) - err=_workf->remove(); - if (err!=NOERR) - FoundError=TRUE; - if (get_win()->iscancelled()) - _block=TRUE; - if ((i%20)==0) - get_win()->WriteW(33,9,(const char*)TString(20).format("%7ld/%-7ld",i,EOD)); - time(&finix); - get_win()->WriteW(33,12,(const char*)TString(10).format("%s",fmttime(finix-inix))); - if (((finix-inix)%3)==0) - { - long com=((finix-inix)*EOD)/(i+1); - get_win()->WriteW(33,13,(const char*)TString(10).format("%s",fmttime(com))); - } - } - if (!_block && ((ctrl_keys()==NOERR) || FoundError)) - do_test_2(); - _workf->close(); - get_win()->WriteW(33,10,"RIPRISTINO ARCHIVI "); - filecopy(FALSE); //restore copies - if (_randseq!=NULL) - delete _randseq; - } // If it was open - if (_workf != NULL) - delete _workf; - } // If it was selected - } // While test is in progress -} - -void TTestProc::do_test_2() -{ - time_t alpha,omega; - long i=0,j; - int err=NOERR; - - get_win()->WriteW(33,10,"TEST2: RIPRISTINO ARCHIVI "); - _workf->close(); - filecopy(FALSE); - if (_workf->open(_excllock) == NOERR) - { - long EOD=_workf->eod(); - long optot=sumop(EOD); - long optr=1; - - get_win()->WriteW(33,10,"TEST2 (cisreadrec-cisdelete)"); - time(&alpha); - while (!_block && ireadat(number(i)); - err=_workf->remove(); - j=i+1; - get_win()->WriteW(33,10,"TEST2: CONTROLLO CHIAVI "); - get_win()->WriteW(33,9,(const char*)TString(20).format("%7ld/%-7ld",j,EOD)); - while (!_block && jiscancelled()) _block=TRUE; - time(&omega); - get_win()->WriteW(33,12,(const char*)TString(10).format("%s",fmttime(omega-alpha))); - if ((omega-alpha)%3==0) - get_win()->WriteW(33,13,(const char*)TString(10).format("%s",fmttime(((omega-alpha)*optot)/optr))); - err=_workf->readat(number(j)); - optr++; - int k=1; - while (k<=_nkeys && err==NOERR) - { - TTrec r; - r.get(_nfile); - TToken_string def(r.keydef(k-1)); - - _workf->setkey(k); - err=_workf->read(); - if (def.get_char(1)=='X') // if keys are duplicated - { - TString ksaved(_workf->curr().key(k)); - bool Fnd=FALSE; - - while (err==NOERR && !Fnd && ksaved==_workf->curr().key(k)) - if (_workf->recno()==number(j)) - Fnd=TRUE; - else - err=_workf->next(); - } - if (err!=NOERR || number(j)!=_workf->recno()) - { - get_win()->WriteW(33,10,"Trovati errori scrittura report"); - DumpReport(err,i,j,k); - if (err==NOERR) - err=999; //errore fittizio, tanto per farlo uscire - } - k++; - } - j++; - } - get_win()->WriteW(33,10,"TEST2 (cisreadrec-cisdelete) "); - i++; - } - } -} - -void TTestProc::DumpReport(int err, long i, long x, int key) -{ - static rnum=0; - char ora[10]; - TString RandomFile,ReportFile; - FILE * fp; - - get_win()->WriteW(33,15,(const char*)TString(35).format("File nr. %d Test nr. %ld",_nfile,_ntest)); - cgettime(ora); - if (!fexist("test")) // create directory -#if XVT_OS==XVT_OS_SCOUNIX - mkdir("test",0777); -#else - _mkdir("test"); -#endif - RandomFile.format("test%crnd%d.dat",Separator,rnum++); - if ((fp=fopen((const char*)RandomFile,"w"))!=NULL) - { - for (int j=0;j<_workf->eod();j++) - if (j==i) - fprintf(fp,"%9ld*\n",number(j)); - else - fprintf(fp,"%9ld \n",number(j)); - fclose(fp); - } - ReportFile.format("test%creport.txt",Separator); - if ((fp=fopen((const char*)ReportFile,"a"))!=NULL) - { - fprintf(fp,"REPORT sulla verifica della stabilita' dell'ISAM\n"); - fprintf(fp,"------\n"); - fprintf(fp,"\n"); - fprintf(fp,"Eseguito il : %s Alle : %s\n",(const char*)TDate(TODAY),ora); - fprintf(fp,"\n"); - fprintf(fp,"File nr. : %4d %s\n",_nfile,get_isheet()->row(_nfile-1).get(2)); - fprintf(fp,"File Random : %s\n",(const char*)RandomFile); - fprintf(fp,"Nr. Record cancellato: %5ld Nr. Record letto: %5ld\n",number(i),number(x)); - fprintf(fp,"Nr. Chiave elaborata: %3d\n",key); - if (err!=NOERR) - fprintf(fp,"Errore generato dal record letto: %d\n",err); - else - fprintf(fp,"Errore generato dal record letto: Numero di record non corretto.\n\n"); - fprintf(fp,"------\n\n\n"); - fclose(fp); - } -} - -void TTestProc::load_random(const TString& st) -{ - FILE *fp; - char c; - - _kriminal=0; - if ((fp=fopen((const char*)st,"r"))!=NULL) - { - TDir d; - d.get(_nfile,_nolock,_nordir,_sysdirop); - _randseq = new long[d.eod()]; - for (long i=0;id.eod()) - { - _block=TRUE; - break; - } - } - } -} - -void TTestProc::do_debug() -{ - TDir d; - - d.get(_nfile,_nolock,_nordir,_sysdirop); - get_win()->set_color(COLOR_BLACK,COLOR_WHITE); - get_win()->clear(COLOR_WHITE); - get_win()->set_caption("Ricerca dell'errore"); - get_win()->WriteW(8,5,(const char*)TString(25).format("File numero : %4d\t\t\t%s",_nfile,(const char*)d.name())); - get_win()->WriteW(8,7,"Record Cancellati :"); - get_win()->WriteW(8,9,"Operazione in corso : COPIA DI SICUREZZA"); - get_win()->WriteW(8,11,"Record cancellato :"); - get_win()->WriteW(8,12,"Record letto :"); - get_win()->WriteW(8,14,"Errore rilevato :"); - - filecopy(); // Backup copies. Must be placed here - // otherwise I get a "File already open error" - _workf = new TTestFile(_nfile); - if (_workf->open(_excllock) == NOERR) - { - TTrec r; - r.get(_nfile); - _nkeys=r.keys(); - long i=0,j; - int k,err=NOERR; - bool step=FALSE; - get_win()->WriteW(30,9,"Cancello fino al Kriminale..."); - while (!stopped() && i<_workf->eod() && err==NOERR) - { - if (number(i)==_kriminal) - step=TRUE; // Put here a Break Point to debug step by step - err=_workf->readat(number(i)); - if (err!=NOERR || step) - _block=show_mess(1,err,number(i),number(i),0); - err=_workf->remove(); - if (err!=NOERR || step) - _block=show_mess(2,err,number(i),number(i),0); - j=i+1; - get_win()->WriteW(30,9,"TEST 2: CONTROLLO CHIAVI "); - get_win()->WriteW(30,7,(const char*)TString(20).format("%5ld/%-5ld",j,_workf->eod())); - get_win()->WriteW(30,11,(const char*)TString(10).format("%5ld",number(i))); - while (!stopped() && j<_workf->eod() && err==NOERR) - { - if (get_win()->iscancelled()) - _block=TRUE; - err=_workf->readat(number(j)); - if (err!=NOERR || step) - _block=show_mess(3,err,number(j),number(j),0); - get_win()->WriteW(30,12,(const char*)TString(10).format("%5ld",number(j))); - k=1; - while (k<=_nkeys && err==NOERR && !stopped()) - { - TToken_string def(r.keydef(k-1)); - - _workf->setkey(k); - err=_workf->read(); - if (err!=NOERR || step) - _block=show_mess(4,err,number(j),_workf->recno(),k); - if (def.get_char(1)=='X') // if keys are duplicated - { - TString ksaved(_workf->curr().key(k)); - bool Fnd=FALSE; - - while (!stopped() && err==NOERR && !Fnd && ksaved==_workf->curr().key(k)) - if (_workf->recno()==number(j)) - Fnd=TRUE; - else - { - err=_workf->next(); - if (err!=NOERR || step) - _block=show_mess(5,err,number(j),_workf->recno(),k); - } - } // if keys are duplicated - if (err!=NOERR || number(j)!=_workf->recno()) - { - _block=show_mess(6,err,number(j),number(j),0); - err=999; // So it will exit - } - k++; - } - j++; - } - get_win()->WriteW(30,9,"Cisreadrec -- Cisdelete "); - i++; - } - _workf->close(); - } - get_win()->WriteW(30,9,"RIPRISTINO ARCHIVIO "); - filecopy(FALSE); // Restore copies - get_win()->WriteW(30,9,"CANCELLAZIONE COPIE "); - remove_copy(_nfile); // Delete backup copies - - // Free pointers - if (_workf!=NULL) - delete _workf; - if (_randseq != NULL) - delete _randseq; -} - -bool TTestProc::show_mess(int act, int err, long n1, long n2, int k) -{ - switch (act) - { - case 1: - get_win()->WriteW(30,9,(const char*)TString(42).format("Eseguita la readrec per rec. # %ld",n1)); - get_win()->WriteW(30,11,(const char*)TString(40).spaces()); - break; - case 2: - get_win()->WriteW(30,9,(const char*)TString(42).format("Eseguita la delete per rec. # %ld",n1)); - get_win()->WriteW(30,11,(const char*)TString(10).format("%5ld",n1)); - break; - case 3: - get_win()->WriteW(30,9,(const char*)TString(42).format("Eseguita la readrec per contr. chiavi")); - get_win()->WriteW(30,12,(const char*)TString(10).format("%5ld ",n1)); - break; - case 4: - get_win()->WriteW(30,9,(const char*)TString(42).format("Eseguita la start con chiave %d ",k)); - get_win()->WriteW(30,12,(const char*)TString(15).format("%5ld (%ld)",n1,n2)); - break; - case 5: - get_win()->WriteW(30,9,(const char*)TString(42).format("Eseguita la next per chiavi doppie ")); - get_win()->WriteW(30,12,(const char*)TString(15).format("%5ld (%ld)",n1,n2)); - break; - case 6: - get_win()->WriteW(30,9,(const char*)TString(42).format("Record %ld non trovato nelle chiavi duplicate ",n1)); - break; - } - get_win()->WriteW(30,14,(const char*)TString(5).format("%5d",err)); - KEY tasto=get_win()->run(); - return (tasto == K_ESC); -} - -TTestProc::TTestProc() -: _block(FALSE), _ntest(0), _nfile(0), _randseq(NULL), _rmc(FALSE), _workf(NULL), _sheet(NULL), _win(NULL) -{ - _win = new TTestWin; -} - -TTestProc::~TTestProc() -{ - if (_win != NULL) - delete _win; -} - -TTestWin::TTestWin() -:TIndwin(1L,"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",TRUE,FALSE,70) -{} - -void TTestWin::handler(WINDOW w, EVENT *e) -{ - switch (e->type) - { - case E_CHAR: - if (e->v.chr.ch == K_ENTER) - stop_run(K_ENTER); - break; - default: - break; - } - TIndwin::handler(w,e); -} - -TTestReport::TTestReport(const char* title) -{ - WINDOW parent=TASK_WIN; - long flags=WSF_CLOSE | WSF_SIZE | WSF_VSCROLL | WSF_HSCROLL; - WIN_TYPE wt=W_DOC; - create(6,2,68,20,title,flags,wt,parent); - set_color(COLOR_BLACK,COLOR_WHITE); -} - -void TTestReport::load_report() -{ - FILE *fp; - char line[256]; - - fp=fopen((const char *)TString(20).format("test%creport.txt",Separator),"r"); - while (fgets(line,256,fp)!=NULL) - { - TString element(line); - _report.add(element); - } - fclose(fp); - set_scroll_max(80,_report.items()); -} - -void TTestReport::update() -{ - for (int i=0; i<_report.items(); i++) - stringat(1,i+1,(const char*)get_row(i)); -} - -bool TTestReport::on_key(KEY key) -{ - switch (key) - { - case K_ESC: - stop_run(key); - break; - default: - break; - } - return TScroll_window::on_key(key); -} +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if XVT_OS!=XVT_OS_SCOUNIX +#include +#endif + +#include "ba1300.h" + +extern "C" { + void cgettime(char *); +} + +TTestSheet::TTestSheet(const char* titolo, const char* colonne,byte bottoni) +:TDir_sheet(titolo, colonne, bottoni) +{} + +TTestSheet::~TTestSheet() +{} + +void TTestSheet::page_build(long first, byte rows) + +{ + TToken_string l(128); + for (byte i = 0; i < rows; i++) + { + const int n = int(i+first+1); + dir()->get (n,_nolock,_nordir,_sysdirop); + l.cut(0); + l.add(""); + l.add(format("%3d", n)); // Numero progressivo del file + l.add(dir()->name()); + const TRecnotype eod = dir()->eod(); + l.add(format("%ld", eod)); + const TRecnotype eox = dir()->eox(); + l.add(format("%ld", eox)); + const word len = dir()->len(); + l.add(format("%u", len)); + l.add(dir()->des()); + l.add(format("%ld", dir()->flags())); + set_row(l, i); + } +} + +void TTestSheet::sr_status(bool save) +{ + for (int i=0; i>1; + cbits++; + } + scale=(unsigned int)0x8000; + for (i=1;i<=(long)cbits;i++) + { + scale=scale>>1; + scale |= 0x8000; + } + // Extracts "random" seed from time + time(&tloc); + parm=(unsigned int)(tloc & 0x0000FFFF); + srand(parm); + // Mix array... + for (i=0;i>1; + if (((long) rnd)>=eod) // Difficile che accada... + rnd=(unsigned int) eod-1; + com=_randseq[i]; + _randseq[i]=_randseq[(long)rnd]; + _randseq[(long)rnd]=com; + } +} + +int TTestProc::ctrl_keys() +{ + int err=1; + + for (int nk=1;nk<=_nkeys;nk++) + { + _workf->setkey(nk); + if ((err=_workf->first())==NOERR) + return NOERR; + } + return err; +} + +void TTestProc::do_test_1() +{ + bool FoundError; + long i,EOD; + int err; + time_t inix,finix; + + _nfile=0; + while ((_nfile++ <= get_isheet()->items()) && !_block) + { + EOD=get_isheet()->row(_nfile-1).get_long(3); + if (get_isheet()->checked(_nfile-1) && EOD > 0) + { + get_win()->WriteW(33,7,(const char*)TString(18).format("%-18s",get_isheet()->row(_nfile-1).get(2))); + get_win()->WriteW(33,12,"000:00:00"); + get_win()->WriteW(33,13,"000:00:00"); + if (_ntest == 1) + { + TSystemisamfile f(_nfile); + get_win()->WriteW(33,10,"COMPATTAMENTO "); + if ((f.packfile(FALSE)!=NOERR)||(f.packindex(FALSE) != NOERR)) + error_box("Errore in compattamento file %d",_nfile); + get_win()->WriteW(33,10,"COPIA DI SICUREZZA "); + filecopy(); + set_rmc(TRUE); + } // If it was test # 1 + _workf = new TTestFile(_nfile); + time(&inix); + if (_workf->open(_excllock) == NOERR) + { + TTrec r; + r.get(_nfile); + _nkeys=r.keys(); + FoundError=FALSE; + i=0; + EOD=_workf->eod(); + get_win()->WriteW(33,9,(const char*)TString(14).format(" 0/%-7ld",EOD)); + get_win()->WriteW(33,10,"TEST1 (cisreadrec-cisdelete)"); + _randseq = new long[EOD]; + do_random(EOD); + while (!FoundError && ireadat(number(i++)))==NOERR) + err=_workf->remove(); + if (err!=NOERR) + FoundError=TRUE; + if (get_win()->iscancelled()) + _block=TRUE; + if ((i%20)==0) + get_win()->WriteW(33,9,(const char*)TString(20).format("%7ld/%-7ld",i,EOD)); + time(&finix); + get_win()->WriteW(33,12,(const char*)TString(10).format("%s",fmttime(finix-inix))); + if (((finix-inix)%3)==0) + { + long com=((finix-inix)*EOD)/(i+1); + get_win()->WriteW(33,13,(const char*)TString(10).format("%s",fmttime(com))); + } + } + if (!_block && ((ctrl_keys()==NOERR) || FoundError)) + do_test_2(); + _workf->close(); + get_win()->WriteW(33,10,"RIPRISTINO ARCHIVI "); + filecopy(FALSE); //restore copies + if (_randseq!=NULL) + delete _randseq; + } // If it was open + if (_workf != NULL) + delete _workf; + } // If it was selected + } // While test is in progress +} + +void TTestProc::do_test_2() +{ + time_t alpha,omega; + long i=0,j; + int err=NOERR; + + get_win()->WriteW(33,10,"TEST2: RIPRISTINO ARCHIVI "); + _workf->close(); + filecopy(FALSE); + if (_workf->open(_excllock) == NOERR) + { + long EOD=_workf->eod(); + long optot=sumop(EOD); + long optr=1; + + get_win()->WriteW(33,10,"TEST2 (cisreadrec-cisdelete)"); + time(&alpha); + while (!_block && ireadat(number(i)); + err=_workf->remove(); + j=i+1; + get_win()->WriteW(33,10,"TEST2: CONTROLLO CHIAVI "); + get_win()->WriteW(33,9,(const char*)TString(20).format("%7ld/%-7ld",j,EOD)); + while (!_block && jiscancelled()) _block=TRUE; + time(&omega); + get_win()->WriteW(33,12,(const char*)TString(10).format("%s",fmttime(omega-alpha))); + if ((omega-alpha)%3==0) + get_win()->WriteW(33,13,(const char*)TString(10).format("%s",fmttime(((omega-alpha)*optot)/optr))); + err=_workf->readat(number(j)); + optr++; + int k=1; + while (k<=_nkeys && err==NOERR) + { + TTrec r; + r.get(_nfile); + TToken_string def(r.keydef(k-1)); + + _workf->setkey(k); + err=_workf->read(); + if (def.get_char(1)=='X') // if keys are duplicated + { + TString ksaved(_workf->curr().key(k)); + bool Fnd=FALSE; + + while (err==NOERR && !Fnd && ksaved==_workf->curr().key(k)) + if (_workf->recno()==number(j)) + Fnd=TRUE; + else + err=_workf->next(); + } + if (err!=NOERR || number(j)!=_workf->recno()) + { + get_win()->WriteW(33,10,"Trovati errori scrittura report"); + DumpReport(err,i,j,k); + if (err==NOERR) + err=999; //errore fittizio, tanto per farlo uscire + } + k++; + } + j++; + } + get_win()->WriteW(33,10,"TEST2 (cisreadrec-cisdelete) "); + i++; + } + } +} + +void TTestProc::DumpReport(int err, long i, long x, int key) +{ + static rnum=0; + char ora[10]; + TString RandomFile,ReportFile; + FILE * fp; + + get_win()->WriteW(33,15,(const char*)TString(35).format("File nr. %d Test nr. %ld",_nfile,_ntest)); + cgettime(ora); + if (!fexist("test")) // create directory +#if XVT_OS==XVT_OS_SCOUNIX + mkdir("test",0777); +#else +#ifdef __WATCOMC__ + mkdir("test"); +#else + _mkdir("test"); +#endif +#endif + RandomFile.format("test%crnd%d.dat",Separator,rnum++); + if ((fp=fopen((const char*)RandomFile,"w"))!=NULL) + { + for (int j=0;j<_workf->eod();j++) + if (j==i) + fprintf(fp,"%9ld*\n",number(j)); + else + fprintf(fp,"%9ld \n",number(j)); + fclose(fp); + } + ReportFile.format("test%creport.txt",Separator); + if ((fp=fopen((const char*)ReportFile,"a"))!=NULL) + { + fprintf(fp,"REPORT sulla verifica della stabilita' dell'ISAM\n"); + fprintf(fp,"------\n"); + fprintf(fp,"\n"); + fprintf(fp,"Eseguito il : %s Alle : %s\n",(const char*)TDate(TODAY),ora); + fprintf(fp,"\n"); + fprintf(fp,"File nr. : %4d %s\n",_nfile,get_isheet()->row(_nfile-1).get(2)); + fprintf(fp,"File Random : %s\n",(const char*)RandomFile); + fprintf(fp,"Nr. Record cancellato: %5ld Nr. Record letto: %5ld\n",number(i),number(x)); + fprintf(fp,"Nr. Chiave elaborata: %3d\n",key); + if (err!=NOERR) + fprintf(fp,"Errore generato dal record letto: %d\n",err); + else + fprintf(fp,"Errore generato dal record letto: Numero di record non corretto.\n\n"); + fprintf(fp,"------\n\n\n"); + fclose(fp); + } +} + +void TTestProc::load_random(const TString& st) +{ + FILE *fp; + char c; + + _kriminal=0; + if ((fp=fopen((const char*)st,"r"))!=NULL) + { + TDir d; + d.get(_nfile,_nolock,_nordir,_sysdirop); + _randseq = new long[d.eod()]; + for (long i=0;id.eod()) + { + _block=TRUE; + break; + } + } + } +} + +void TTestProc::do_debug() +{ + TDir d; + + d.get(_nfile,_nolock,_nordir,_sysdirop); + get_win()->set_color(COLOR_BLACK,COLOR_WHITE); + get_win()->clear(COLOR_WHITE); + get_win()->set_caption("Ricerca dell'errore"); + get_win()->WriteW(8,5,(const char*)TString(25).format("File numero : %4d\t\t\t%s",_nfile,(const char*)d.name())); + get_win()->WriteW(8,7,"Record Cancellati :"); + get_win()->WriteW(8,9,"Operazione in corso : COPIA DI SICUREZZA"); + get_win()->WriteW(8,11,"Record cancellato :"); + get_win()->WriteW(8,12,"Record letto :"); + get_win()->WriteW(8,14,"Errore rilevato :"); + + filecopy(); // Backup copies. Must be placed here + // otherwise I get a "File already open error" + _workf = new TTestFile(_nfile); + if (_workf->open(_excllock) == NOERR) + { + TTrec r; + r.get(_nfile); + _nkeys=r.keys(); + long i=0,j; + int k,err=NOERR; + bool step=FALSE; + get_win()->WriteW(30,9,"Cancello fino al Kriminale..."); + while (!stopped() && i<_workf->eod() && err==NOERR) + { + if (number(i)==_kriminal) + step=TRUE; // Put here a Break Point to debug step by step + err=_workf->readat(number(i)); + if (err!=NOERR || step) + _block=show_mess(1,err,number(i),number(i),0); + err=_workf->remove(); + if (err!=NOERR || step) + _block=show_mess(2,err,number(i),number(i),0); + j=i+1; + get_win()->WriteW(30,9,"TEST 2: CONTROLLO CHIAVI "); + get_win()->WriteW(30,7,(const char*)TString(20).format("%5ld/%-5ld",j,_workf->eod())); + get_win()->WriteW(30,11,(const char*)TString(10).format("%5ld",number(i))); + while (!stopped() && j<_workf->eod() && err==NOERR) + { + if (get_win()->iscancelled()) + _block=TRUE; + err=_workf->readat(number(j)); + if (err!=NOERR || step) + _block=show_mess(3,err,number(j),number(j),0); + get_win()->WriteW(30,12,(const char*)TString(10).format("%5ld",number(j))); + k=1; + while (k<=_nkeys && err==NOERR && !stopped()) + { + TToken_string def(r.keydef(k-1)); + + _workf->setkey(k); + err=_workf->read(); + if (err!=NOERR || step) + _block=show_mess(4,err,number(j),_workf->recno(),k); + if (def.get_char(1)=='X') // if keys are duplicated + { + TString ksaved(_workf->curr().key(k)); + bool Fnd=FALSE; + + while (!stopped() && err==NOERR && !Fnd && ksaved==_workf->curr().key(k)) + if (_workf->recno()==number(j)) + Fnd=TRUE; + else + { + err=_workf->next(); + if (err!=NOERR || step) + _block=show_mess(5,err,number(j),_workf->recno(),k); + } + } // if keys are duplicated + if (err!=NOERR || number(j)!=_workf->recno()) + { + _block=show_mess(6,err,number(j),number(j),0); + err=999; // So it will exit + } + k++; + } + j++; + } + get_win()->WriteW(30,9,"Cisreadrec -- Cisdelete "); + i++; + } + _workf->close(); + } + get_win()->WriteW(30,9,"RIPRISTINO ARCHIVIO "); + filecopy(FALSE); // Restore copies + get_win()->WriteW(30,9,"CANCELLAZIONE COPIE "); + remove_copy(_nfile); // Delete backup copies + + // Free pointers + if (_workf!=NULL) + delete _workf; + if (_randseq != NULL) + delete _randseq; +} + +bool TTestProc::show_mess(int act, int err, long n1, long n2, int k) +{ + switch (act) + { + case 1: + get_win()->WriteW(30,9,(const char*)TString(42).format("Eseguita la readrec per rec. # %ld",n1)); + get_win()->WriteW(30,11,(const char*)TString(40).spaces()); + break; + case 2: + get_win()->WriteW(30,9,(const char*)TString(42).format("Eseguita la delete per rec. # %ld",n1)); + get_win()->WriteW(30,11,(const char*)TString(10).format("%5ld",n1)); + break; + case 3: + get_win()->WriteW(30,9,(const char*)TString(42).format("Eseguita la readrec per contr. chiavi")); + get_win()->WriteW(30,12,(const char*)TString(10).format("%5ld ",n1)); + break; + case 4: + get_win()->WriteW(30,9,(const char*)TString(42).format("Eseguita la start con chiave %d ",k)); + get_win()->WriteW(30,12,(const char*)TString(15).format("%5ld (%ld)",n1,n2)); + break; + case 5: + get_win()->WriteW(30,9,(const char*)TString(42).format("Eseguita la next per chiavi doppie ")); + get_win()->WriteW(30,12,(const char*)TString(15).format("%5ld (%ld)",n1,n2)); + break; + case 6: + get_win()->WriteW(30,9,(const char*)TString(42).format("Record %ld non trovato nelle chiavi duplicate ",n1)); + break; + } + get_win()->WriteW(30,14,(const char*)TString(5).format("%5d",err)); + KEY tasto=get_win()->run(); + return (tasto == K_ESC); +} + +TTestProc::TTestProc() +: _block(FALSE), _ntest(0), _nfile(0), _randseq(NULL), _rmc(FALSE), _workf(NULL), _sheet(NULL), _win(NULL) +{ + _win = new TTestWin; +} + +TTestProc::~TTestProc() +{ + if (_win != NULL) + delete _win; +} + +TTestWin::TTestWin() +:TIndwin(1L,"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",TRUE,FALSE,70) +{} + +void TTestWin::handler(WINDOW w, EVENT *e) +{ + switch (e->type) + { + case E_CHAR: + if (e->v.chr.ch == K_ENTER) + stop_run(K_ENTER); + break; + default: + break; + } + TIndwin::handler(w,e); +} + +TTestReport::TTestReport(const char* title) +{ + WINDOW parent=TASK_WIN; + long flags=WSF_CLOSE | WSF_SIZE | WSF_VSCROLL | WSF_HSCROLL; + WIN_TYPE wt=W_DOC; + create(6,2,68,20,title,flags,wt,parent); + set_color(COLOR_BLACK,COLOR_WHITE); +} + +void TTestReport::load_report() +{ + FILE *fp; + char line[256]; + + fp=fopen((const char *)TString(20).format("test%creport.txt",Separator),"r"); + while (fgets(line,256,fp)!=NULL) + { + TString element(line); + _report.add(element); + } + fclose(fp); + set_scroll_max(80,_report.items()); +} + +void TTestReport::update() +{ + for (int i=0; i<_report.items(); i++) + stringat(1,i+1,(const char*)get_row(i)); +} + +bool TTestReport::on_key(KEY key) +{ + switch (key) + { + case K_ESC: + stop_run(key); + break; + default: + break; + } + return TScroll_window::on_key(key); +}