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

@ -151,7 +151,20 @@ void __getfieldbuff(byte l, byte t, const char * recin, char *s)
{
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));
}
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);
@ -588,15 +601,53 @@ HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode)
else
{
if (rmode==_isfirst)
err=DB_first(isfd->fhnd); else
if (rmode==_islast)
err=DB_last(isfd->fhnd); else
if (rmode==_isnext)
err=DB_next(isfd->fhnd); else
if (rmode==_isprev)
err=DB_prev(isfd->fhnd); else
if (rmode==_iscurr)
err=DB_go(isfd->fhnd,DB_recno(isfd->fhnd));
err=DB_first(isfd->fhnd);
else
if (rmode==_islast)
err=DB_last(isfd->fhnd);
else
if (rmode==_isnext)
{
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 != _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);
}
@ -867,33 +918,17 @@ int TBaseisamfile::getkey() const
int TBaseisamfile::first(word lockop)
{
NOT_OPEN();
/* 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;
return TBaseisamfile::read(curr(), _isfirst, lockop);
}
int TBaseisamfile::last(word lockop)
{
NOT_OPEN();
/* 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;
return TBaseisamfile::read(curr(), _islast, lockop);
}
int TBaseisamfile::_next(word lockop)
/*int TBaseisamfile::_next(word lockop)
{
NOT_OPEN();
curr().setdirty();
@ -915,19 +950,20 @@ int TBaseisamfile::_next(word lockop)
_recno = _isamfile->RecNo;
if( curr().has_memo( ) )
curr( ).init_memo(_recno );
return _lasterr;
}
return _lasterr;
}
*/
int TBaseisamfile::next(word lockop)
{
return curr().next(*this, lockop);
return TBaseisamfile::read(curr(), _isnext, lockop);
}
int TBaseisamfile::prev(word lockop)
{
NOT_OPEN();
/* NOT_OPEN();
curr().setdirty();
if (_recno != DB_recno(_isamfile->fhnd))
{
@ -944,38 +980,22 @@ int TBaseisamfile::prev(word lockop)
_recno = _isamfile->RecNo;
if( curr().has_memo( ) )
curr( ).init_memo(_recno);
return _lasterr;
return _lasterr;*/
return TBaseisamfile::read(curr(), _isprev, lockop);
}
int TBaseisamfile::reread(word lockop)
{
/* NOT_OPEN();
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;
return TBaseisamfile::reread(curr(), lockop);
}
int TBaseisamfile::reread(TRectype& rec, word lockop)
{
NOT_OPEN();
/* 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;
return rec.read(*this, _iscurr, lockop);
}
@ -1005,7 +1025,7 @@ int TBaseisamfile::skip(TRecnotype nrec, word lockop)
__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);
}
_lasterr=cisread(_isamfile,curr(),_iscurr + lockop);
_lasterr=cisread(_isamfile,curr(),_iscurr + lockop, _recno);
} while (_lasterr ==_islocked);
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
if( curr().has_memo( ) )
@ -1019,7 +1039,7 @@ int TBaseisamfile::_read(TRectype& rec, word op, word lockop)
{
NOT_OPEN();
rec.setdirty();
_lasterr=cisread(_isamfile, rec, op + lockop);
_lasterr=cisread(_isamfile, rec, op + lockop, _recno);
if (_lasterr != NOERR) _lasterr=get_error(_lasterr);
_recno = _isamfile->RecNo;
if( rec.has_memo( ) )
@ -1040,17 +1060,17 @@ int TBaseisamfile::read(word op, word lockop)
{
// 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)
{
return rec.readat(*this,nrec,lockop);
return rec.readat(*this, nrec, 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;
*/
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();
int oldkey=getkey();
@ -1139,7 +1168,7 @@ int TBaseisamfile::_rewrite(const TRectype& rec)
TRectype save_rec(rec);
const int cur_key = getkey();
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);
if (_lasterr == NOERR)
{
@ -1207,7 +1236,7 @@ int TBaseisamfile::_remove(const TRectype& rec)
NOT_OPEN();
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!
if (_lasterr != NOERR)
@ -1452,7 +1481,7 @@ TLocalisamfile::TLocalisamfile(
const char* name) // @parm Nome del file esterno da aprire
: TBaseisamfile(name)
{
_was_open = FALSE;
_was_open = FALSE;
}
TLocalisamfile::~TLocalisamfile()
@ -3272,9 +3301,26 @@ int TRectype::readat(TBaseisamfile& f, TRecnotype nrec, word lockop)
// Certified 100%
int TRectype::next(TBaseisamfile& f,word lockop)
{
const int err = f._next(lockop);
/* const int err = f._read(*this, _isnext, lockop);
*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 ??%

@ -115,7 +115,10 @@ public:
// @cmember Legge il file <p f> con il tipo di record alla posizione desiderata
virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop = _nolock);
// @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
virtual int write(TBaseisamfile& f) const;
// @cmember Riscrive il record sul file
@ -321,15 +324,15 @@ class TBaseisamfile : public TObject
// @cmember:(INTERNAL) Indica se il file possiede dei campi 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
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
isdef** ptrfilehnd() const
{ return (isdef**) &_isamfile;}

@ -25,91 +25,6 @@ TTable::TTable(const char* tabname, bool linkrecinst)
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)
{
@ -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);
TBaseisamfile::read(op, lockop);
if (_tabname != (const char *)_cod)
if (op == _isfirst)
{
if (lockop == _lock) TBaseisamfile::reread(_unlock);
last(lockop);
setstatus(_iseof);
zero();
TBaseisamfile::_read(rec, _isgteq, lockop);
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();
}
int TTable::read(TRectype& rec, word op, word lockop, TDate&)
int TTable::_readat(TRectype& rec ,TRecnotype nrec, word lockop)
{
CHECKD(op >= _iscurr && op <= _isgteq, "Invalid read operation : ", op);
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);
TBaseisamfile::_readat(rec, nrec, lockop);
CHECKS(_tabname == (const char *)_cod, "Invalid position : Table ", (const char *)_tabname);
return status();

@ -30,26 +30,15 @@ class TTable : public TLocalisamfile
// @access Protected Member
protected:
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
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
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)
virtual bool tab() const
{ return TRUE; }