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:
parent
a4d326637d
commit
f61a12fc53
165
include/isam.cpp
165
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user