diff --git a/include/isam.cpp b/include/isam.cpp index aed555ce0..f258ba040 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -32,7 +32,7 @@ #define NOT_LINKED(i,f) CHECKS(i != NULL, "Record senza tracciato: impossibile eseguire ", f) #define NOT_OPEN() CHECKS(_isamfile != NULL, "File chiuso: ", (const char*)name()) -#define INTTLOCK 0x600 +//#define INTTLOCK 0x600 #define RECLOCKTYPES 0xFF00 #define READTYPES 0x00FF @@ -172,77 +172,61 @@ HIDDEN int CBuildKey(RecDes *recd, int numkey, RecType recin, char *key, bool b /* *key; valore della chiave */ /* build_x_cb flag di costruzione per codebase */ { - int i, nf, l = 0, len, off; - /* TrDate wd ; - char s1[10]; - */ - BOOLEAN upp; - - strcpy(key, ""); + key[0] = '\0'; if (numkey-- <= recd->NKeys) - { - for (i = 0; i < recd->Ky[numkey].NkFields; i++) - { - if ((upp = (recd->Ky[numkey].FieldSeq[i] > MaxFields)) == TRUE) - nf = recd->Ky[numkey].FieldSeq[i] - MaxFields; - else - nf = recd->Ky[numkey].FieldSeq[i]; - if (recd->Ky[numkey].FromCh[i] == 255) + { + int l = 0; + for (int i = 0; i < recd->Ky[numkey].NkFields; i++) + { + const KeyDes& kd = recd->Ky[numkey]; + const bool upp = kd.FieldSeq[i] > MaxFields; + const int nf = upp ? kd.FieldSeq[i] - MaxFields : kd.FieldSeq[i]; + const RecFieldDes& rf = recd->Fd[nf]; + + int off, len; + if (kd.FromCh[i] == 255) { - off = recd->Fd[nf].RecOff; - len = recd->Fd[nf].Len; + off = rf.RecOff; + len = rf.Len; } else { - /* - if (recd->Fd[nf].TypeF == _datefld) - { - off = recd->Fd[nf].RecOff; - len = recd->Fd[nf].Len; - strncpy(s1, (recin + off), len); - s1[len] = '\0'; - off = recd->Ky[numkey].FromCh[i]; - len = recd->Ky[numkey].ToCh[i] - - recd->Ky[numkey].FromCh[i] + 1; - } - else - { - */ - off = recd->Fd[nf].RecOff + recd->Ky[numkey].FromCh[i]; - len = recd->Ky[numkey].ToCh[i] - - recd->Ky[numkey].FromCh[i] + 1; - /* } */ + off = rf.RecOff + kd.FromCh[i]; + len = kd.ToCh[i] - kd.FromCh[i] + 1; } if ((l + len) > 80) { - strcpy(key, ""); + key[0] = '\0'; return(_iskeylenerr); } - /* if ((recd->Fd[nf].TypeF == _datefld) && (recd->Ky[numkey].FromCh[i] != 255)) - strncpy((key + l), &s1[off], len); - else - { - */ strncpy((key + l), (recin + off), len); -#ifdef XVT_OS - if (recin[off] == '\0') memset(key + l, ' ', len); + + const TFieldtypes f = (TFieldtypes) rf.TypeF; + if (recin[off] == '\0') + { + memset(key + l, ' ', len); + if (build_x_cb && ((f == _intfld) || (f == _longfld) || (f == _wordfld))) + key[l + len - 1] = '0'; + } else - if (!build_x_cb && ((recd->Fd[nf].TypeF == _intfld) || - (recd->Fd[nf].TypeF == _longfld) || - (recd->Fd[nf].TypeF == _wordfld))) - { + if (!build_x_cb && ((f == _intfld) || (f == _longfld) || (f == _wordfld))) + { int w = l, j = l + len; while (w < j && key[w] == ' ') w++; while (w < j && key[w] == '0') key[w++] = ' '; } -#endif - /* } */ + + if (upp) + for (int i = l+len-1; i >= l; i--) + key[i] = toupper(key[i]); + l += len; } + + while (l > 0 && key[l-1] == ' ') l--; key[l] = '\0'; - crtrim(key); - if (upp) CUpString(key) ; + return(NOERR); } return(_ispatherr); @@ -259,38 +243,24 @@ HIDDEN int cisstart(isfdptr isfd, int keynum, TRectype & record, unsigned int mo HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode) { - // Non usare mai _isnextn o _isprevn, usare il metodo skip! - int rmode = (mode & READTYPES), lmode = (mode & RECLOCKTYPES); - BOOLEAN nolock = (lmode == _nolock); - BOOLEAN unlock = (lmode == _unlock); - BOOLEAN tlock = (lmode == INTTLOCK); + + // Non usare mai _isnextn o _isprevn, usare il metodo skip! + CHECK (rmode !=_isnextn && rmode !=_isprevn, "_isnextn and _isprevn not supported in cisread"); + + // BOOLEAN nolock = (lmode == _nolock); + // BOOLEAN unlock = (lmode == _unlock); + // BOOLEAN tlock = (lmode == INTTLOCK); char key[128]; int err = NOERR ; - - if (nolock || unlock || tlock) lmode = 0; + // if (nolock || unlock /* || tlock */) lmode = 0; + do { - if (rmode==_isfirst) - err=DB_first(isfd->fhnd); - if (rmode==_islast) - err=DB_last(isfd->fhnd); - if (rmode==_isnext) - err=DB_next(isfd->fhnd); - if (rmode==_isprev) - err=DB_prev(isfd->fhnd); - if (rmode==_iscurr) - err=DB_go(isfd->fhnd,DB_recno(isfd->fhnd)); - if (err != NOERR) err=get_error(err); - if (rmode==_isnextn || rmode==_isprevn) - { - error_box("_isnextn and _isprevn not supported in cisread"); - err=_iskeynotfound; - } if (rmode>=_isequal && rmode<=_isgteq) { - err=CBuildKey(isfd->r,DB_tagget(isfd->fhnd),record.string(),key,TRUE); + err=CBuildKey(isfd->r, isfd->knum, record.string(),key,TRUE); if (err == NOERR) { err=DB_seek(isfd->fhnd,key); @@ -298,6 +268,21 @@ HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode) } if (rmode != _isequal && err == _iskeynotfound) err = NOERR; } + 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)); + if (err != NOERR) err=get_error(err); + } + if (err == _iseof) DB_last(isfd->fhnd); if (err == NOERR && (lmode == _lock || lmode == _testandlock)) // _lock e _testandlock @@ -306,17 +291,20 @@ HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode) if (err != NOERR) err=get_error(err); if (err == _islocked && lmode == _testandlock) break; } - if (!tlock && err == _islocked) + if (/* !tlock && */ err == _islocked) { - CBuildKey(isfd->r, DB_tagget(isfd->fhnd), record.string(), key, TRUE); + memcpy(record.string(),DB_getrecord(isfd->fhnd),DB_reclen(isfd->fhnd)); + CBuildKey(isfd->r, isfd->knum, record.string(), key, TRUE); message_box("Codice %s in uso da parte\ndi un altro utente.", key); } - } while (!tlock && err ==_islocked); - if (err == NOERR && unlock) + } while (/* !tlock && */ err ==_islocked); + + if (err == NOERR && lmode == _unlock) { err=DB_unlock(isfd->fhnd); if (err != NOERR) err=get_error(err); } + memcpy(record.string(),DB_getrecord(isfd->fhnd),DB_reclen(isfd->fhnd)); isfd->RecNo = DB_recno(isfd->fhnd); return err; @@ -324,7 +312,7 @@ HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode) HIDDEN int delkeys(isfdptr fd, char* record,long recno) { - int rt=NOERR,oldkey=DB_tagget(fd->fhnd); + int rt=NOERR,oldkey = fd->knum; for (int i=1; i<=fd->r->NKeys;i++) @@ -396,7 +384,6 @@ TExtrectype::~TExtrectype() TBaseisamfile::TBaseisamfile(int logicnum, bool linkrecinst) { - _isamfile = NULL; _logicnum = logicnum; _lasterr = NOERR; @@ -562,7 +549,8 @@ void TBaseisamfile::setkey(int nkey) int TBaseisamfile::getkey() const { NOT_OPEN(); - return (DB_tagget(_isamfile->fhnd)); + CHECK(DB_tagget(_isamfile->fhnd) == _isamfile->knum, "Chiave inconsistente"); + return _isamfile->knum; } int TBaseisamfile::first(word lockop) @@ -657,9 +645,9 @@ int TBaseisamfile::skip(TRecnotype nrec, word lockop) { int rmode = (lockop & READTYPES), lmode = (lockop & RECLOCKTYPES); - BOOLEAN nolock = (lmode == _nolock); - BOOLEAN unlock = (lmode == _unlock); - BOOLEAN tlock = (lmode == INTTLOCK); + // BOOLEAN nolock = (lmode == _nolock); + // BOOLEAN unlock = (lmode == _unlock); + // BOOLEAN tlock = (lmode == INTTLOCK); char key[128]; NOT_OPEN(); @@ -668,13 +656,13 @@ int TBaseisamfile::skip(TRecnotype nrec, word lockop) _lasterr=DB_skip(_isamfile->fhnd,nrec); if (_lasterr != NOERR) _lasterr = get_error(_lasterr); do { - if (!tlock && _lasterr == _islocked) + if (/* !tlock && */ _lasterr == _islocked) { CBuildKey(_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); - } while (!tlock && _lasterr ==_islocked); + } while (/* !tlock && */ _lasterr ==_islocked); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); return _lasterr; } @@ -983,6 +971,7 @@ int TBaseisamfile::_open(unsigned int mode) _recno = -1L; CHECKD(filehnd()->r->NKeys > 0, "File senza indici: ", num()); + setkey(1); _lasterr = NOERR; } else