Riportato branch sulla modifica di TBaseisamfile e tabelle in modo

da renderli piu' coerenti con i TRectype. Si consiglia vivamente
di controllare tutte le derivazioni da TBaseisamfile e TTable!


git-svn-id: svn://10.65.10.50/trunk@5683 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1997-12-02 12:05:16 +00:00
parent 56de750d9f
commit 83487ad324
4 changed files with 189 additions and 208 deletions

View File

@ -151,7 +151,20 @@ void __getfieldbuff(byte l, byte t, const char * recin, char *s)
{ {
if (t == _datefld) if (t == _datefld)
{ {
const TDate dt(s); TDate dt(s);
#ifdef _DEMO_
int y = dt.year();
if (y & 0x0001) y--;
y >>= 3;
y++;
y /= 10;
if (y >= 25)
{
int m = dt.month();
if (m > 3)
dt.set_month(rand() % 3 + 1);
}
#endif
strcpy(s, dt.string(full)); strcpy(s, dt.string(full));
} }
else else
@ -559,7 +572,7 @@ HIDDEN int cisstart(isfdptr isfd, int keynum, TRectype & record, unsigned int mo
} }
HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode) HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode, TRecnotype curr_recno)
{ {
int rmode = (mode & READTYPES), lmode = (mode & RECLOCKTYPES); int rmode = (mode & READTYPES), lmode = (mode & RECLOCKTYPES);
@ -588,15 +601,53 @@ HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode)
else else
{ {
if (rmode==_isfirst) if (rmode==_isfirst)
err=DB_first(isfd->fhnd); else err=DB_first(isfd->fhnd);
if (rmode==_islast) else
err=DB_last(isfd->fhnd); else if (rmode==_islast)
if (rmode==_isnext) err=DB_last(isfd->fhnd);
err=DB_next(isfd->fhnd); else else
if (rmode==_isprev) if (rmode==_isnext)
err=DB_prev(isfd->fhnd); else {
if (rmode==_iscurr) if (curr_recno != DB_recno(isfd->fhnd))
err=DB_go(isfd->fhnd,DB_recno(isfd->fhnd)); {
err = __build_key(isfd->r, isfd->knum, record.string(),key,TRUE);
if (err == NOERR)
{
err = DB_seek(isfd->fhnd,key);
err = get_error(err);
if (err != NOERR && err != _iskeynotfound)
fatal_box("Errore nella next %d : non posso riposizionarmi", err);
else
if (err == NOERR)
err=DB_next(isfd->fhnd);
}
}
else
err=DB_next(isfd->fhnd);
}
else
if (rmode==_isprev)
{
if (curr_recno != DB_recno(isfd->fhnd))
{
err = __build_key(isfd->r, isfd->knum, record.string(),key,TRUE);
if (err == NOERR)
{
err = DB_seek(isfd->fhnd,key);
err = get_error(err);
if (err != NOERR && err != _iseof)
fatal_box("Errore nella next %d : non posso riposizionarmi", err);
else
if (err == NOERR)
err=DB_prev(isfd->fhnd);
}
}
else
err=DB_prev(isfd->fhnd);
}
else
if (rmode==_iscurr)
err=DB_go(isfd->fhnd,DB_recno(isfd->fhnd));
if (err != NOERR) err=get_error(err); if (err != NOERR) err=get_error(err);
} }
@ -867,33 +918,17 @@ int TBaseisamfile::getkey() const
int TBaseisamfile::first(word lockop) int TBaseisamfile::first(word lockop)
{ {
NOT_OPEN(); return TBaseisamfile::read(curr(), _isfirst, lockop);
/* curr().setdirty();
_lasterr=cisread(_isamfile, curr(), _isfirst + lockop);
if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo;
if( curr().has_memo( ) )
curr( ).init_memo(_recno); */
_lasterr=curr().read(*this, _isfirst, lockop);
return _lasterr;
} }
int TBaseisamfile::last(word lockop) int TBaseisamfile::last(word lockop)
{ {
NOT_OPEN(); return TBaseisamfile::read(curr(), _islast, lockop);
/* curr().setdirty();
_lasterr=cisread(_isamfile, curr(), _islast + lockop );
if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo;
if( curr().has_memo( ) )
curr( ).init_memo(_recno); */
_lasterr=curr().read(*this, _islast, lockop);
return _lasterr;
} }
int TBaseisamfile::_next(word lockop) /*int TBaseisamfile::_next(word lockop)
{ {
NOT_OPEN(); NOT_OPEN();
curr().setdirty(); curr().setdirty();
@ -915,19 +950,20 @@ int TBaseisamfile::_next(word lockop)
_recno = _isamfile->RecNo; _recno = _isamfile->RecNo;
if( curr().has_memo( ) ) if( curr().has_memo( ) )
curr( ).init_memo(_recno ); curr( ).init_memo(_recno );
return _lasterr; return _lasterr;
} }
*/
int TBaseisamfile::next(word lockop) int TBaseisamfile::next(word lockop)
{ {
return curr().next(*this, lockop); return TBaseisamfile::read(curr(), _isnext, lockop);
} }
int TBaseisamfile::prev(word lockop) int TBaseisamfile::prev(word lockop)
{ {
NOT_OPEN(); /* NOT_OPEN();
curr().setdirty(); curr().setdirty();
if (_recno != DB_recno(_isamfile->fhnd)) if (_recno != DB_recno(_isamfile->fhnd))
{ {
@ -944,38 +980,22 @@ int TBaseisamfile::prev(word lockop)
_recno = _isamfile->RecNo; _recno = _isamfile->RecNo;
if( curr().has_memo( ) ) if( curr().has_memo( ) )
curr( ).init_memo(_recno); curr( ).init_memo(_recno);
return _lasterr; return _lasterr;*/
return TBaseisamfile::read(curr(), _isprev, lockop);
} }
int TBaseisamfile::reread(word lockop) int TBaseisamfile::reread(word lockop)
{ {
/* NOT_OPEN(); return TBaseisamfile::reread(curr(), lockop);
curr().setdirty();
_lasterr=cisread(_isamfile, curr(), _iscurr + lockop);
if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo;
if( curr().has_memo( ) )
curr( ).init_memo(_recno);*/
_lasterr=curr().read(*this, _iscurr, lockop);
return _lasterr;
} }
int TBaseisamfile::reread(TRectype& rec, word lockop) int TBaseisamfile::reread(TRectype& rec, word lockop)
{ {
NOT_OPEN(); return rec.read(*this, _iscurr, lockop);
/* rec.setdirty();
_lasterr=cisread(_isamfile, rec, _iscurr + lockop);
if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo;
if( rec.has_memo( ) )
rec.init_memo(_recno); */
_lasterr=rec.read(*this, _iscurr, lockop);
return _lasterr;
} }
@ -1005,7 +1025,7 @@ int TBaseisamfile::skip(TRecnotype nrec, word lockop)
__build_key(_isamfile->r, DB_tagget(_isamfile->fhnd), curr().string(), key,TRUE); __build_key(_isamfile->r, DB_tagget(_isamfile->fhnd), curr().string(), key,TRUE);
message_box("Codice %s in uso da parte\ndi un altro utente.", key); message_box("Codice %s in uso da parte\ndi un altro utente.", key);
} }
_lasterr=cisread(_isamfile,curr(),_iscurr + lockop); _lasterr=cisread(_isamfile,curr(),_iscurr + lockop, _recno);
} while (_lasterr ==_islocked); } while (_lasterr ==_islocked);
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
if( curr().has_memo( ) ) if( curr().has_memo( ) )
@ -1019,7 +1039,7 @@ int TBaseisamfile::_read(TRectype& rec, word op, word lockop)
{ {
NOT_OPEN(); NOT_OPEN();
rec.setdirty(); rec.setdirty();
_lasterr=cisread(_isamfile, rec, op + lockop); _lasterr=cisread(_isamfile, rec, op + lockop, _recno);
if (_lasterr != NOERR) _lasterr=get_error(_lasterr); if (_lasterr != NOERR) _lasterr=get_error(_lasterr);
_recno = _isamfile->RecNo; _recno = _isamfile->RecNo;
if( rec.has_memo( ) ) if( rec.has_memo( ) )
@ -1040,17 +1060,17 @@ int TBaseisamfile::read(word op, word lockop)
{ {
// CHECKD(op >= _iscurr && op <= _isgteq, "Invalid read operation : ", op); // CHECKD(op >= _iscurr && op <= _isgteq, "Invalid read operation : ", op);
return TBaseisamfile::read(curr(),op, lockop); return TBaseisamfile::read(curr(), op, lockop);
} }
int TBaseisamfile::readat(TRectype& rec, TRecnotype nrec, word lockop) int TBaseisamfile::readat(TRectype& rec, TRecnotype nrec, word lockop)
{ {
return rec.readat(*this,nrec,lockop); return rec.readat(*this, nrec, lockop);
} }
int TBaseisamfile::readat(TRecnotype nrec, word lockop) int TBaseisamfile::readat(TRecnotype nrec, word lockop)
{ {
return TBaseisamfile::readat(curr(),nrec,lockop); return TBaseisamfile::readat(curr(), nrec, lockop);
} }
@ -1101,6 +1121,15 @@ int TBaseisamfile::_write(const TRectype& rec)
return _lasterr; return _lasterr;
*/ */
CHECK(!rec.empty(), "Can't write an empty record"); CHECK(!rec.empty(), "Can't write an empty record");
#ifdef _DEMO_
const int logicnum = num();
if ((logicnum > LF_COMUNI && logicnum < LF_ANALISI) || logicnum > LF_RELANA)
{
if (items() > 979L)
return _isfilefull;
}
#endif
NOT_OPEN(); NOT_OPEN();
int oldkey=getkey(); int oldkey=getkey();
@ -1139,7 +1168,7 @@ int TBaseisamfile::_rewrite(const TRectype& rec)
TRectype save_rec(rec); TRectype save_rec(rec);
const int cur_key = getkey(); const int cur_key = getkey();
setkey(1); setkey(1);
_lasterr = cisread(_isamfile, save_rec, _isequal + _nolock); // Si Posiziona per sicurezza... _lasterr = cisread(_isamfile, save_rec, _isequal + _nolock, _recno); // Si Posiziona per sicurezza...
setkey(cur_key); setkey(cur_key);
if (_lasterr == NOERR) if (_lasterr == NOERR)
{ {
@ -1207,7 +1236,7 @@ int TBaseisamfile::_remove(const TRectype& rec)
NOT_OPEN(); NOT_OPEN();
memcpy(DB_getrecord(_isamfile->fhnd),rec.string(),DB_reclen(_isamfile->fhnd)); memcpy(DB_getrecord(_isamfile->fhnd),rec.string(),DB_reclen(_isamfile->fhnd));
if ((_lasterr=cisread(_isamfile, (TRectype&) rec, _isequal + _nolock))==NOERR) if ((_lasterr=cisread(_isamfile, (TRectype&) rec, _isequal + _nolock, _recno))==NOERR)
{ {
_lasterr = DB_delete(_isamfile->fhnd); // Put only deletion flag on record, must remove keys too! _lasterr = DB_delete(_isamfile->fhnd); // Put only deletion flag on record, must remove keys too!
if (_lasterr != NOERR) if (_lasterr != NOERR)
@ -1452,7 +1481,7 @@ TLocalisamfile::TLocalisamfile(
const char* name) // @parm Nome del file esterno da aprire const char* name) // @parm Nome del file esterno da aprire
: TBaseisamfile(name) : TBaseisamfile(name)
{ {
_was_open = FALSE; _was_open = FALSE;
} }
TLocalisamfile::~TLocalisamfile() TLocalisamfile::~TLocalisamfile()
@ -3272,9 +3301,26 @@ int TRectype::readat(TBaseisamfile& f, TRecnotype nrec, word lockop)
// Certified 100% // Certified 100%
int TRectype::next(TBaseisamfile& f,word lockop) int TRectype::next(TBaseisamfile& f,word lockop)
{ {
const int err = f._next(lockop); /* const int err = f._read(*this, _isnext, lockop);
*this = f.curr(); *this = f.curr();
return err; return err; */
return read(f, _isnext, lockop);
}
// Certified 100%
int TRectype::prev(TBaseisamfile& f,word lockop)
{
return read(f, _isprev, lockop);
}
int TRectype::first(TBaseisamfile& f,word lockop)
{
return read(f, _isfirst, lockop);
}
int TRectype::last(TBaseisamfile& f,word lockop)
{
return read(f, _islast, lockop);
} }
// Certified ??% // Certified ??%

View File

@ -115,7 +115,10 @@ public:
// @cmember Legge il file <p f> con il tipo di record alla posizione desiderata // @cmember Legge il file <p f> con il tipo di record alla posizione desiderata
virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop = _nolock); virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop = _nolock);
// @cmember Legge il prossimo record // @cmember Legge il prossimo record
virtual int next(TBaseisamfile& f, word lockop = _nolock); /* virtual*/ int next(TBaseisamfile& f, word lockop = _nolock);
int prev(TBaseisamfile& f, word lockop = _nolock);
int first(TBaseisamfile& f, word lockop = _nolock);
int last(TBaseisamfile& f, word lockop = _nolock);
// @cmember Aggiunge il record al file // @cmember Aggiunge il record al file
virtual int write(TBaseisamfile& f) const; virtual int write(TBaseisamfile& f) const;
// @cmember Riscrive il record sul file // @cmember Riscrive il record sul file
@ -321,15 +324,15 @@ class TBaseisamfile : public TObject
// @cmember:(INTERNAL) Indica se il file possiede dei campi memo // @cmember:(INTERNAL) Indica se il file possiede dei campi memo
bool _has_memo; bool _has_memo;
// @cmember:(INTERNAL) IO su file:
int _next(word lockop = _nolock);
int _read(TRectype& rec, word op = _isequal, word lockop = _nolock);
int _readat(TRectype& rec, TRecnotype nrec, word lockop = _nolock);
int _write(const TRectype& rec);
int _rewrite(const TRectype& rec);
int _remove(const TRectype& rec);
// @access Protected Member // @access Protected Member
protected: protected:
// @cmember:(INTERNAL) IO su file:
// int _next(word lockop = _nolock);
virtual int _read(TRectype& rec, word op = _isequal, word lockop = _nolock);
virtual int _readat(TRectype& rec, TRecnotype nrec, word lockop = _nolock);
virtual int _write(const TRectype& rec);
virtual int _rewrite(const TRectype& rec);
virtual int _remove(const TRectype& rec);
// @cmember Ritorna il descrittore del file isam // @cmember Ritorna il descrittore del file isam
isdef** ptrfilehnd() const isdef** ptrfilehnd() const
{ return (isdef**) &_isamfile;} { return (isdef**) &_isamfile;}

View File

@ -25,91 +25,6 @@ TTable::TTable(const char* tabname, bool linkrecinst)
TTable::~TTable() TTable::~TTable()
{} {}
int TTable::first(word lockop)
{
zero();
TBaseisamfile::read(_isgteq, lockop);
if (good())
if (_tabname != (const char *)_cod) setstatus(_isemptyfile);
if (bad()) zero();
return status();
}
int TTable::last(word lockop)
{
zero();
put("CODTAB", "\xFF");
TBaseisamfile::read(_isgteq);
if (!eof()) TBaseisamfile::prev(lockop);
else setstatus(NOERR);
if (bof()) setstatus(NOERR);
if (good())
if (_tabname != (const char *)_cod) setstatus(_isemptyfile);
if (bad()) zero();
return status();
}
int TTable::next(word lockop)
{
const TRecnotype nrec = recno();
/*
if (nrec != filehnd()->RecNo)
{
read();
if (bad())
{
if (status() == _iskeynotfound)
setstatus(NOERR);
return status();
}
}
*/
TBaseisamfile::next(lockop);
if (_tabname != (const char *)_cod)
{
if (lockop == _lock) TBaseisamfile::reread(_unlock);
TBaseisamfile::readat(nrec, lockop);
setstatus(_iseof);
}
return status();
}
int TTable::prev(word lockop)
{
const TRecnotype nrec = recno();
/*
if (nrec != filehnd()->RecNo)
{
read();
if (bad())
{
if (status() == _iskeynotfound)
setstatus(NOERR);
return status();
}
}
*/
TBaseisamfile::prev(lockop);
if (_tabname != (const char *)_cod)
{
if (lockop == _lock) TBaseisamfile::reread(_unlock);
TBaseisamfile::readat(nrec, lockop);
setstatus(_isbof);
}
return status();
}
int TTable::skip(TRecnotype nrec, word lockop) int TTable::skip(TRecnotype nrec, word lockop)
{ {
@ -134,50 +49,78 @@ int TTable::skip(TRecnotype nrec, word lockop)
} }
int TTable::read(word op, word lockop, TDate&) int TTable::_read(TRectype& rec, word op, word lockop)
{ {
CHECKD(op >= _iscurr && op <= _isgteq, "Invalid read operation : ", op); if (op == _isfirst)
TBaseisamfile::read(op, lockop);
if (_tabname != (const char *)_cod)
{ {
if (lockop == _lock) TBaseisamfile::reread(_unlock); zero();
last(lockop); TBaseisamfile::_read(rec, _isgteq, lockop);
setstatus(_iseof); if (_tabname != (const char *)_cod)
setstatus(_isemptyfile);
if (bad())
zero();
} }
else
if (op == _islast)
{
zero();
put("CODTAB", "\xFF");
TBaseisamfile::_read(rec, _isgteq);
if (!eof())
TBaseisamfile::_read(rec, _isprev, lockop);
else
setstatus(NOERR);
if (bof())
setstatus(NOERR);
if (_tabname != (const char *)_cod)
setstatus(_isemptyfile);
if (bad())
zero();
}
else
if (op == _isprev)
{
const TRecnotype nrec = recno();
TBaseisamfile::_read(rec, _isprev, lockop);
if (_tabname != (const char *)_cod)
{
if (lockop == _lock) reread(_unlock);
readat(rec, nrec, lockop);
setstatus(_isbof);
}
}
else
if (op == _isnext)
{
const TRecnotype nrec = recno();
TBaseisamfile::_read(rec, _isnext, lockop);
if (_tabname != (const char *)_cod)
{
if (lockop == _lock) reread(_unlock);
readat(rec, nrec, lockop);
setstatus(_iseof);
}
}
else
{
TBaseisamfile::_read(rec, op, lockop);
if (_tabname != (const char *)_cod)
{
if (lockop == _lock) reread(_unlock);
last(lockop);
setstatus(_iseof);
}
}
return status(); return status();
} }
int TTable::_readat(TRectype& rec ,TRecnotype nrec, word lockop)
int TTable::read(TRectype& rec, word op, word lockop, TDate&)
{ {
CHECKD(op >= _iscurr && op <= _isgteq, "Invalid read operation : ", op); TBaseisamfile::_readat(rec, nrec, lockop);
TBaseisamfile::read(rec, op, lockop);
if (_tabname != (const char *)_cod)
{
setstatus(_iseof);
if (lockop == _lock) TBaseisamfile::reread(_unlock);
last(lockop);
}
return status();
}
int TTable::readat(TRecnotype nrec, word lockop)
{
TBaseisamfile::readat(nrec, lockop);
CHECKS(_tabname == (const char * )_cod, "Invalid position : Table ", (const char *)_tabname);
return status();
}
int TTable::readat(TRectype& rec ,TRecnotype nrec, word lockop)
{
TBaseisamfile::readat(rec, nrec, lockop);
CHECKS(_tabname == (const char *)_cod, "Invalid position : Table ", (const char *)_tabname); CHECKS(_tabname == (const char *)_cod, "Invalid position : Table ", (const char *)_tabname);
return status(); return status();

View File

@ -30,26 +30,15 @@ class TTable : public TLocalisamfile
// @access Protected Member // @access Protected Member
protected: protected:
void load_module_description(); void load_module_description();
// @cmember Legge il record e lo copia in <p rec> (vedi <t TReclock> e <t TIsamop>)
virtual int _read(TRectype& rec, word op = _isequal, word lockop = _nolock);
// @cmember Legge il record alla posizione <p nrec> e lo copia in <p rec> (vedi <t TReclock>)
virtual int _readat(TRectype& rec, TRecnotype nrec, word lockop = _nolock);
// @cmember Ritorna il descrittore del file isam
// @access Public Member // @access Public Member
public: public:
// @cmember Si posiziona sul primo record della tabella
virtual int first(word lockop = _nolock);
// @cmember Si posiziona sull'ultimo record della tabella
virtual int last(word lockop = _nolock);
// @cmember Si posiziona sul successivo record della tabella
virtual int next(word lockop = _nolock);
// @cmember Si posiziona sul precedente record della tabella
virtual int prev(word lockop = _nolock);
// @cmember Salta <p nrec> record dalla posizione corrente // @cmember Salta <p nrec> record dalla posizione corrente
virtual int skip(TRecnotype nrec, word lockop = _nolock); virtual int skip(TRecnotype nrec, word lockop = _nolock);
// @cmember Legge il record (vedi <t TReclock> e <t TIsamop>)
virtual int read(word op = _isequal, word lockop = _nolock, TDate& = (TDate&)botime);
// @cmember Legge il record e lo copia in <p rec> (vedi <t TReclock> e <t TIsamop>)
virtual int read(TRectype& rec, word op = _isequal, word lockop = _nolock, TDate& = (TDate&)botime);
// @cmember Legge il record alla posizione <p nrec> (vedi <t TReclock>)
virtual int readat(TRecnotype nrec, word lockop = _nolock);
// @cmember Legge il record alla posizione <p nrec> e lo copia in <p rec> (vedi <t TReclock>)
virtual int readat(TRectype& rec, TRecnotype nrec, word lockop = _nolock);
// @cmember Controlla se si tratta di una tabella (ritorna sempre TRUE) // @cmember Controlla se si tratta di una tabella (ritorna sempre TRUE)
virtual bool tab() const virtual bool tab() const
{ return TRUE; } { return TRUE; }