diff --git a/include/isam.cpp b/include/isam.cpp index 4f036ec1f..77a7d2db2 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -1,5 +1,5 @@ #include -#include +#include #define __ISAM_CPP @@ -298,7 +298,7 @@ HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode) } if (rmode != _isequal && err == _iskeynotfound) err = NOERR; } - if (rmode != _isequal && err == _iseof) + if (err == _iseof) DB_last(isfd->fhnd); if (err == NOERR && (lmode == _lock || lmode == _testandlock)) // _lock e _testandlock { @@ -740,11 +740,13 @@ int TBaseisamfile::write(TDate& atdate) { NOT_OPEN(); int oldkey=getkey(); - browse_null(curr().string(),DB_reclen(_isamfile->fhnd)); - memcpy(DB_getrecord(_isamfile->fhnd),curr().string(),DB_reclen(_isamfile->fhnd)); + browse_null(curr().string(),DB_reclen(_isamfile->fhnd)); + TRectype r(curr()); + setkey(1); - if (cisread(_isamfile, curr(), _isequal + _nolock) == _iskeynotfound) + if (cisread(_isamfile, r, _isequal + _nolock) != NOERR) { + memcpy(DB_getrecord(_isamfile->fhnd),curr().string(),DB_reclen(_isamfile->fhnd)); _lasterr = DB_add(_isamfile->fhnd); if (_lasterr != NOERR) _lasterr = get_error(_lasterr); } @@ -762,10 +764,12 @@ int TBaseisamfile::write(const TRectype& rec, TDate& atdate) NOT_OPEN(); int oldkey=getkey(); browse_null(rec.string(),DB_reclen(_isamfile->fhnd)); - memcpy(DB_getrecord(_isamfile->fhnd),rec.string(),DB_reclen(_isamfile->fhnd)); + TRectype r(rec); + setkey(1); - if (cisread(_isamfile, (TRectype&)rec, _isequal + _nolock) == _iskeynotfound) + if (cisread(_isamfile, r, _isequal + _nolock) == _iskeynotfound) { + memcpy(DB_getrecord(_isamfile->fhnd),rec.string(),DB_reclen(_isamfile->fhnd)); _lasterr = DB_add(_isamfile->fhnd); if (_lasterr != NOERR) _lasterr = get_error(_lasterr); } @@ -786,9 +790,11 @@ int TBaseisamfile::rewrite(TDate& atdate) _lasterr = cisread(_isamfile, curr(), _isequal + _nolock); // Si Posiziona per sicurezza... memcpy(DB_getrecord(_isamfile->fhnd),save_rec.string(),DB_reclen(_isamfile->fhnd)); if (_lasterr == NOERR) + { _lasterr = DB_rewrite(_isamfile->fhnd); - if (_lasterr != NOERR) _lasterr = get_error(_lasterr); - _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); + if (_lasterr != NOERR) _lasterr = get_error(_lasterr); + _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); + } return _lasterr; } @@ -801,9 +807,11 @@ int TBaseisamfile::rewrite(const TRectype& rec, TDate& atdate) _lasterr = cisread(_isamfile,(TRectype&) rec, _isequal + _nolock); // Si Posiziona per sicurezza... memcpy(DB_getrecord(_isamfile->fhnd),save_rec.string(),DB_reclen(_isamfile->fhnd)); if (_lasterr == NOERR) + { _lasterr = DB_rewrite(_isamfile->fhnd); - if (_lasterr != NOERR) _lasterr = get_error(_lasterr); - _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); + if (_lasterr != NOERR) _lasterr = get_error(_lasterr); + _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); + } return _lasterr; }