Ottimizzata la getkey e la buildkey

git-svn-id: svn://10.65.10.50/trunk@1560 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1995-07-05 14:38:49 +00:00
parent a4d326637d
commit f61a12fc53

View File

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