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_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