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_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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user