Patch level : 10.0

Files correlati     : agalib.lib
Ricompilazione Demo : [ ]
Commento            :
Eliminati puntatori a FileDes e RecDes che ora sono riferimenti.
Supporto per percorsi lunghi dei file dati
Corretto filtraggio cursori


git-svn-id: svn://10.65.10.50/trunk@17856 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2008-12-10 16:52:43 +00:00
parent 5528812ec3
commit cb69e4727a
21 changed files with 422 additions and 402 deletions

View File

@ -112,11 +112,15 @@ void COpenFile(logicname,filed,lockmode,dirflg)
if (TESTLOCK(fdir[dirflg].IOR))
{
char msg[256];
sprintf(msg, "Sono in attesa della directory n.ro %d", logicname);
sprintf(msg, "Sono in attesa del file n.ro %d", logicname);
xvt_dm_post_message(msg);
}
} while TESTLOCK(fdir[dirflg].IOR) ;
strcpy(filed->SysName, CAddPref(filed->SysName)) ;
#ifndef _NDEBUG
if (strlen(filed->SysName) >= sizeof(filed->SysName))
xvt_dm_post_error(filed->SysName);
#endif
}
/*
@ -145,18 +149,14 @@ void COpenFile(logicname,filed,lockmode,dirflg)
@(FN)
*/
void CCloseFile(logicname,filed,dirflg)
int logicname; /* numero logico file */
FileDes *filed; /* puntatore al descrittore di un archivio */
int dirflg; /* flag per file comuni */
void CCloseFile(int logicname, const FileDes* filed, int dirflg)
{
FileDes wd;
CRead(&fdir[dirflg],(RecType) &wd,(long) logicname, NoLock);
CRead(&fdir[dirflg],(RecType) &wd,(RecNoType) logicname, NoLock);
wd.EOD = filed->EOD;
wd.Flags = filed->Flags;
CWrite(&fdir[dirflg],(RecType) &wd,(long) logicname, UnLock);
CWrite(&fdir[dirflg],(RecType) &wd,(RecNoType) logicname, UnLock);
}
/*
@($) CGetFile FILES

View File

@ -87,7 +87,7 @@ extern "C" {
void COpenDir(int, int);
void CCloseDir(int);
void COpenFile(int, FileDes *, int, int);
void CCloseFile(int, FileDes *, int);
void CCloseFile(int, const FileDes *, int);
void CGetFile(int, FileDes *, int, int);
void CPutFile(int, FileDes *, int);
/* @(:) 2.3.01.144 */

View File

@ -476,11 +476,11 @@ int DB_lockfile(int handle)
return(rt);
}
HIDDEN void do_key(const char *fname, RecDes *r, TAG4INFO *tag_info, int n_keys)
HIDDEN void do_key(const char *fname, const RecDes* r, TAG4INFO* tag_info, int n_keys)
{
int i,j;
char tiname[_MAX_FNAME]; /* Tag name */
_splitpath(fname, NULL, NULL, tiname, NULL);
xvt_fsys_parse_pathname(fname, NULL, NULL, tiname, NULL, NULL);
xvt_str_make_upper(tiname);
for (i=0; ((i < MaxKeys) && (i < n_keys)); i++)
{
@ -588,19 +588,20 @@ int DB_packfile(short vis, const char * filename, long eod)
code_base.autoOpen = 0;
handle=DB_open(filename,1,0); /* Exclusive mode open! */
if (handle > -1)
if (handle >= 0)
{
long rc = 0L;
if (vis)
{
char s[_MAX_PATH];
strcpy(s,"Compattamento ");
strcat(s, filename);
progind_create(100L,s,0,0,60);
progind_create(1,s,0,0,60);
}
if (eod < d4recCount(dbdata[handle]))
{
rt=d4zap(dbdata[handle],++eod,d4recCount(dbdata[handle]));
} else
rc = d4recCount(dbdata[handle]);
if (eod < rc)
rt=d4zap(dbdata[handle],++eod,rc);
else
rt=d4pack(dbdata[handle]);
if (vis)
progind_destroy();
@ -644,7 +645,7 @@ int DB_packmemo(short vis, const char * filename)
/*-------------------------------------------------------------------------
Elimina i record duplicati
--------------------------------------------------------------------------*/
static int DB_clean_file(int handle, const char* filename, const char* ff, RecDes* r, short vis)
static int DB_clean_file(int handle, const char* filename, const RecDes* r, short vis)
{
TAG4INFO tags[2];
TAG4 * t;
@ -658,7 +659,7 @@ static int DB_clean_file(int handle, const char* filename, const char* ff, RecDe
return 0;
s[0] = '\0';
do_key(ff, r, tags, 1);
do_key(filename, r, tags, 1);
strcat((char *) tags[0].expression, "+STR(RECNO(),9)");
w = i4create(dbdata[handle],(char*)filename,tags);
u4free((char *) tags[0].name);
@ -723,26 +724,22 @@ int DB_packindex(short vis, const char * filename, RecDes *r, long *peod, bool a
if (handle >= 0)
{
int i;
const char *ff = find_slash_backslash(filename);
if (vis)
progind_create((long)r->NKeys,s,0,1,60);
if ((ff == NULL) || *ff == '\0')
ff = filename;
else
ff++;
do_key(ff,r,tags, r->NKeys);
progind_create(1,s,0,1,60);
do_key(filename, r,tags, r->NKeys);
w = i4create(dbdata[handle],NULL,tags);
if (vis)
{
progind_set_status((long)r->NKeys);
progind_destroy();
}
if (w == NULL) rt = code_base.errorCode;
if (w == NULL)
rt = code_base.errorCode;
if (rt == e4unique || rt == r4unique)
{
rt = 0;
if (!ask || DB_yesnobox("Sono stati rilevati alcuni records duplicati:\nsi desidera eliminarli?"))
rt = DB_clean_file(handle, filename, ff, r, vis);
rt = DB_clean_file(handle, filename, r, vis);
else
tags[0].unique = r4unique_continue;
if (rt == 0)
@ -795,9 +792,8 @@ int DB_packindex(short vis, const char * filename, RecDes *r, long *peod, bool a
costruisce il file filename
--------------------------------------------------------------------------*/
int DB_build(const char * filename, RecDes *r)
int DB_build(const char* filename, const RecDes* r)
{
FIELD4INFO field_info[MaxFields+1]; /* Numero di campi in un record */
TAG4INFO tag_info[MaxKeys+1]; /* Numero di chiavi in un file */
DATA4 *dbuilded = NULL;

View File

@ -49,7 +49,7 @@ extern "C" {
int DB_packfile(short vis, const char * filename, long eod);
int DB_packmemo(short vis, const char * filename);
int DB_packindex(short vis, const char * filename, RecDes *r, long *peod, bool ask );
int DB_build(const char * filename, RecDes *r);
int DB_build(const char * filename, const RecDes *r);
int DB_recinfo(const char * filename, FileDes *d, RecDes *r, char* keys);
int DB_get_error(void);
void DB_zero_error(void);

View File

@ -56,7 +56,7 @@ extern "C" {
void CPutRec(int, RecDes *, int);
void zerordes(RecDes *);
word setrdes(RecDes *);
char *CAddPref(char *);
char *CAddPref(const char *);
const char* CGetCampoIni(void);
const char* CGetPref(void);
void CPutPref(const char *);

View File

@ -105,39 +105,41 @@ void TFile::write (
}
int TFile::status () const
{
return _file->IOR;
}
TDir::TDir () : _num(-1), _com(FALSE)
TDir::TDir () : _num(-1), _com(false)
{
_dir = new FileDes;
zero ();
}
TDir::TDir(const TDir & d)
TDir::TDir(int logicnum) : _num(logicnum), _com(false)
{
zero();
get(logicnum, _nolock, _nordir, _sysdirop);
}
TDir::TDir(const TDir& d)
{
_dir = new FileDes;
*_dir = *d._dir;
_dir = d._dir;
_num = d._num;
_com = d._com;
}
TDir::~TDir ()
{
delete _dir;
}
{ }
const char *TDir::name () const
{
return _dir->SysName;
return _dir.SysName;
}
const char* TDir::filename() const
{
TString& tmp = get_tmp_string();
tmp = CAddPref(_dir->SysName);
tmp = CAddPref(_dir.SysName);
for (int i=tmp.len()-1; i>=0; i--)
{
const char c = tmp[i];
@ -169,13 +171,13 @@ void TDir::set_name(const char* name)
break;
}
strncpy(_dir->SysName, name, 42);
_dir->SysName[41] = '\0';
strncpy(_dir.SysName, name, 42);
_dir.SysName[41] = '\0';
}
const char *TDir::des () const
{
return _dir->Des;
return _dir.Des;
}
const char* TDir::tab_des(const char* tab)
@ -194,61 +196,68 @@ const char* TDir::tab_des(const char* tab)
const char *TDir::expr () const
{
return _dir->FCalc;
return _dir.FCalc;
}
TRecnotype & TDir::eod () const
TRecnotype TDir::eod () const
{
return _dir->EOD;
return _dir.EOD;
}
TRecnotype & TDir::eox () const
TRecnotype TDir::eox () const
{
return _dir->EOX;
return _dir.EOX;
}
long& TDir::flags () const
long TDir::flags () const
{
return _dir->Flags;
return _dir.Flags;
}
word & TDir::len () const
word TDir::len () const
{
return (word &) _dir->LenR;
return _dir.LenR;
}
int TDir::status (TDirtype dirop) const
{
return fdir[dirop].IOR;
}
void TDir::set_len (const UINT16 len)
{
_dir->LenR = len;
_dir.LenR = len;
}
void TDir::set_eox (const RecNoType eox)
void TDir::set_flags(const RecNoType f)
{
_dir->EOX = eox;
_dir.Flags = f;
}
void TDir::set_eod (const RecNoType eod)
void TDir::set_eox(const RecNoType eox)
{
_dir->EOD = eod;
_dir.EOX = eox;
if (eox < eod())
set_eod(eox);
}
void TDir::reset_eox()
{ set_eox(0); }
void TDir::set_eod(const RecNoType eod)
{
_dir.EOD = eod;
if (eod > eox())
set_eox(eod);
}
void TDir::set (const char *name, const RecNoType eod, const RecNoType flag, const char *des, const char *calc)
{
strncpy (_dir->SysName, name, sizeof (_dir->SysName));
_dir->EOD = eod;
_dir->Flags = flag;
strncpy (_dir->Des, des, sizeof (_dir->Des));
strncpy (_dir->FCalc, calc, sizeof (_dir->FCalc));
strncpy (_dir.SysName, name, sizeof (_dir.SysName));
set_eod(eod);
set_flags(flag);
strncpy(_dir.Des, des, sizeof (_dir.Des));
strncpy(_dir.FCalc, calc, sizeof (_dir.FCalc));
}
// @doc EXTERNAL
@ -261,14 +270,14 @@ void TDir::get (
TDirop op) // @parm Tipo di operazioni effettuabili sul file (default _nordirop)
{
int whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
const int whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
if (op == _nordirop)
COpenFile (nfile, _dir, int(lock), whichdir);
COpenFile (nfile, &_dir, int(lock), whichdir);
else
CGetFile (nfile, _dir, int(lock), whichdir);
CGetFile (nfile, &_dir, int(lock), whichdir);
_num = nfile;
_com = _dir->SysName[0] != '$';
_com = _dir.SysName[0] != '$';
}
// @doc EXTERNAL
@ -284,35 +293,32 @@ void TDir::put (
const int whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
if (op == _nordirop)
CCloseFile (nfile, _dir, whichdir);
CCloseFile (nfile, &_dir, whichdir);
else
CPutFile (nfile, _dir, whichdir);
CPutFile (nfile, &_dir, whichdir);
}
void TDir::zero ()
{
zerofdes (_dir);
zerofdes(&_dir);
}
void TDir::print_on (ostream & out) const
{
CHECK(_dir,"Can't print a NULL _dir");
out << _num << '\n';
out << (int)_com << '\n';
out << _dir->SysName << '|';
out << _dir->EOD << '|';
out << _dir->EOX << '|';
out << _dir->LenR << '|';
out << _dir->Flags << '|';
out << _dir->Des << '|';
out << _dir->FCalc << '|';
out << _dir->GenPrompt << '|' << '\n';
out << _dir.SysName << '|';
out << _dir.EOD << '|';
out << _dir.EOX << '|';
out << _dir.LenR << '|';
out << _dir.Flags << '|';
out << _dir.Des << '|';
out << _dir.FCalc << '|';
out << _dir.GenPrompt << '|' << '\n';
}
void TDir::read_from (istream & in)
{
CHECK(_dir,"Can't read into a NULL _dir");
TToken_string line(256, '|');
char* buf = line.get_buffer();
const int bufsize = line.size();
@ -324,14 +330,14 @@ void TDir::read_from (istream & in)
in.getline (buf, bufsize, '\n');
line.restart();
strcpy(_dir->SysName,line.get());
_dir->EOD = line.get_long();
_dir->EOX = line.get_long();
_dir->LenR = line.get_int();
_dir->Flags = line.get_long();
strcpy(_dir->Des,line.get());
strcpy(_dir->FCalc,line.get());
strcpy(_dir->GenPrompt,line.get());
strncpy(_dir.SysName, line.get(), sizeof(_dir.SysName));
_dir.EOD = line.get_long();
_dir.EOX = line.get_long();
_dir.LenR = line.get_int();
_dir.Flags = line.get_long();
strncpy(_dir.Des, line.get(), sizeof(_dir.Des));
strncpy(_dir.FCalc, line.get(), sizeof(_dir.FCalc));
strncpy(_dir.GenPrompt, line.get(), sizeof(_dir.GenPrompt));
}
// @doc EXTERNAL
@ -343,50 +349,47 @@ int TDir::items (
TDirtype dirtype) const // @parm Directory della quale contare i file
{
const int whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
FileDes f;
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CGetFile (1, &f, _nolock, _whichdir);
CGetFile (LF_DIR, &f, _nolock, whichdir);
return (int) f.EOD;
}
TTrec::TTrec ()
: _des(NULL), _tab("")
TTrec::TTrec (int logicnum) : _des(NULL), _num(-1)
{
_rec = new RecDes;
zero ();
_num = -1;
zero();
get(logicnum);
}
TTrec::TTrec(const TTrec & r)
: _des(NULL), _tab("")
TTrec::TTrec () : _des(NULL), _num(-1)
{
zero ();
}
TTrec::TTrec(const TTrec & r) : _des(NULL)
{
_rec = new RecDes;
*_rec = *r._rec;
_rec = r._rec;
_num = r._num;
}
TTrec::~TTrec ()
{
delete _rec;
}
{ }
int TTrec::compare(const TSortable & a) const
{
const TTrec & r = (const TTrec &) a;
int res = 0;
if (_rec->NFields != r._rec->NFields || _rec->NKeys != r._rec->NKeys) // Confronta prima il numero dei campi o il numero delle chiavi
if (_rec.NFields != r._rec.NFields || _rec.NKeys != r._rec.NKeys) // Confronta prima il numero dei campi o il numero delle chiavi
res = 1;
else
{
const int nkeys = _rec->NKeys;
const int nkeys = _rec.NKeys;
for (int i=0; i<nkeys && res==0; i++) // scorre la lista delle chiavi (sono meno del numero di campi)
{
const KeyDes& k1 = _rec->Ky[i];
const KeyDes& k2 = r._rec->Ky[i];
const KeyDes& k1 = _rec.Ky[i];
const KeyDes& k2 = r._rec.Ky[i];
if (k1.DupKeys != k2.DupKeys || k1.NkFields != k2.NkFields)
res = 1;
else
@ -398,11 +401,11 @@ int TTrec::compare(const TSortable & a) const
if (res == 0) // se sono ancora uguali confronta tutti i campi
{
const int nflds = _rec->NFields;
const int nflds = _rec.NFields;
for (int n=0; n<nflds && res==0; n++)
{
const RecFieldDes& r1 = _rec->Fd[n];
const RecFieldDes& r2 = r._rec->Fd[n];
const RecFieldDes& r1 = _rec.Fd[n];
const RecFieldDes& r2 = r._rec.Fd[n];
if (r1.TypeF != r2.TypeF || r1.Len != r2.Len || r1.Dec != r2.Dec)
res = 1;
else
@ -418,25 +421,25 @@ void TTrec::rehash()
{
int pos, tmppos, nf, i;
for (i = 0; i < MaxFields; i++) _rec->SortFd[i] = INVFLD;
if (_rec->NFields)
for (i = 0; i < MaxFields; i++) _rec.SortFd[i] = INVFLD;
if (_rec.NFields)
{
if (_rec->NFields> MaxFields)
if (_rec.NFields> MaxFields)
fatal_box("Troppi campi in questo tracciato") ;
for (i = 0; i < _rec->NFields; i++)
for (i = 0; i < _rec.NFields; i++)
{
nf = i;
pos = hashfun(_rec->Fd[nf].Name);
pos = hashfun(_rec.Fd[nf].Name);
while (TRUE)
{
if (_rec->SortFd[pos] == INVFLD)
if (_rec.SortFd[pos] == INVFLD)
{
_rec->SortFd[pos] = (byte) nf;
_rec.SortFd[pos] = (byte) nf;
break;
}
else
{
if (strcmp(_rec->Fd[_rec->SortFd[pos]].Name, _rec->Fd[nf].Name) <= 0)
if (strcmp(_rec.Fd[_rec.SortFd[pos]].Name, _rec.Fd[nf].Name) <= 0)
{
pos++;
if (pos >= MaxFields)
@ -444,23 +447,23 @@ void TTrec::rehash()
}
else
{
tmppos = _rec->SortFd[pos];
_rec->SortFd[pos] = (byte) nf;
tmppos = _rec.SortFd[pos];
_rec.SortFd[pos] = (byte) nf;
nf = tmppos;
}
}
}
}
_rec->Fd[0].RecOff = 1;
for (i = 1; i < _rec->NFields; i++)
_rec->Fd[i].RecOff = _rec->Fd[i - 1].RecOff + _rec->Fd[i - 1].Len;
_rec.Fd[0].RecOff = 1;
for (i = 1; i < _rec.NFields; i++)
_rec.Fd[i].RecOff = _rec.Fd[i - 1].RecOff + _rec.Fd[i - 1].Len;
}
}
TTrec & TTrec::operator = (const TTrec & b)
{
_num = b._num;
memcpy (_rec, b._rec, sizeof (*_rec));
_rec = b._rec;
return *this;
}
@ -472,9 +475,8 @@ void TTrec::get (
TDirtype dirtype) // @parm Direttorio nella quale e' contenuto il file (default _nordir)
{
int _whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CGetRec (nfile, _rec, _whichdir);
const int whichdir = (dirtype == _nordir ? NORDIR : COMDIR);
CGetRec (nfile, &_rec, whichdir);
_num = nfile;
}
@ -490,7 +492,7 @@ void TTrec::put (
if (nfile <= 0)
fatal_box ("Bad file number %d", nfile);
CPutRec (nfile, _rec, _whichdir);
CPutRec (nfile, &_rec, _whichdir);
}
void TTrec::zero ()
@ -498,26 +500,26 @@ void TTrec::zero ()
{
int i;
_rec->NFields = 0;
_rec.NFields = 0;
for (i = 0; i < MaxFields; i++)
{
strcpy(_rec->Fd[i].Name, "");
_rec->Fd[i].TypeF = _nullfld;
_rec->Fd[i].Len = 0;
_rec->Fd[i].Dec = 0;
_rec->Fd[i].RecOff = 0;
_rec->SortFd[i] = INVFLD;
strcpy(_rec.Fd[i].Name, "");
_rec.Fd[i].TypeF = _nullfld;
_rec.Fd[i].Len = 0;
_rec.Fd[i].Dec = 0;
_rec.Fd[i].RecOff = 0;
_rec.SortFd[i] = INVFLD;
}
_rec->NKeys = 0;
_rec.NKeys = 0;
for (i = 1; i < MaxKeys; i++)
{
_rec->Ky[i].DupKeys = FALSE;
_rec->Ky[i].NkFields = 0;
_rec.Ky[i].DupKeys = FALSE;
_rec.Ky[i].NkFields = 0;
for (int j = 0; j < MKFields; j++)
{
_rec->Ky[i].FieldSeq[j] = INVFLD;
_rec->Ky[i].FromCh[j] = INVFLD;
_rec->Ky[i].ToCh[j] = INVFLD;
_rec.Ky[i].FieldSeq[j] = INVFLD;
_rec.Ky[i].FromCh[j] = INVFLD;
_rec.Ky[i].ToCh[j] = INVFLD;
}
}
}
@ -529,12 +531,12 @@ int TTrec::status (TDirtype dirop) const
int TTrec::field(const char *name) const
{
return findfld(_rec, name);
return findfld(&_rec, name);
}
const char* TTrec::fielddef(int fld) const
{
const RecFieldDes& fd = _rec->Fd[fld];
const RecFieldDes& fd = _rec.Fd[fld];
TString& tmp = get_tmp_string(50);
tmp.format("%s|%d|%d|%d", fd.Name, (int)fd.TypeF, (int)fd.Len, (int)fd.Dec);
return tmp;
@ -545,30 +547,30 @@ const char *TTrec ::keydef (int key) const
TString& s = get_tmp_string(128);
s = "";
for (int j = 0; j < _rec->Ky[key].NkFields; j++)
for (int j = 0; j < _rec.Ky[key].NkFields; j++)
{
const bool upper = _rec->Ky[key].FieldSeq[j] > MaxFields;
const int nfld = _rec->Ky[key].FieldSeq[j] - (upper ? MaxFields : 0);
const bool upper = _rec.Ky[key].FieldSeq[j] > MaxFields;
const int nfld = _rec.Ky[key].FieldSeq[j] - (upper ? MaxFields : 0);
if (j)
s << "+";
if (upper)
s << "UPPER(";
s << _rec->Fd[nfld].Name;
if (_rec->Ky[key].FromCh[j] < INVFLD)
s << format ("[%d,%d]", _rec->Ky[key].FromCh[j] + 1,
_rec->Ky[key].ToCh[j] + 1);
s << _rec.Fd[nfld].Name;
if (_rec.Ky[key].FromCh[j] < INVFLD)
s << format ("[%d,%d]", _rec.Ky[key].FromCh[j] + 1,
_rec.Ky[key].ToCh[j] + 1);
if (upper)
s << ")";
}
s << (_rec->Ky[key].DupKeys ? "|X" : "| ");
s << (_rec.Ky[key].DupKeys ? "|X" : "| ");
return s;
}
int TTrec::len() const
{
const int n = fields();
return (n > 0 && n <= MaxFields) ? _rec->Fd[n - 1].RecOff + _rec->Fd[n - 1].Len : 0;
return (n > 0 && n <= MaxFields) ? _rec.Fd[n - 1].RecOff + _rec.Fd[n - 1].Len : 0;
}
#ifndef FOXPRO
@ -581,7 +583,7 @@ bool TDir::is_active () const
void TTrec::update_fielddef (int nfld, TToken_string& s)
{
RecFieldDes& rfd = _rec->Fd[nfld];
RecFieldDes& rfd = _rec.Fd[nfld];
strcpy (rfd.Name, s.get(0));
rfd.TypeF = s.get_int ();
rfd.Len = s.get_int ();
@ -596,7 +598,7 @@ void TTrec::update_keydef (int key, TToken_string& s)
if (expr.set(ke, _strexpr))
{
const char* dup = s.get();
_rec->Ky[key].DupKeys = (dup && *dup != ' ');
_rec.Ky[key].DupKeys = (dup && *dup != ' ');
TCodearray & c = expr.code ();
c.begin ();
int n = 0;
@ -610,22 +612,22 @@ void TTrec::update_keydef (int key, TToken_string& s)
const char *s = inst.string ();
int i;
for (i = 0; i < _rec->NFields; i++)
if (strcmp (_rec->Fd[i].Name, s) == 0)
for (i = 0; i < _rec.NFields; i++)
if (strcmp (_rec.Fd[i].Name, s) == 0)
break;
_rec->Ky[key].FieldSeq[n] = i;
_rec->Ky[key].FromCh[n] = INVFLD;
_rec->Ky[key].ToCh[n] = INVFLD;
_rec.Ky[key].FieldSeq[n] = i;
_rec.Ky[key].FromCh[n] = INVFLD;
_rec.Ky[key].ToCh[n] = INVFLD;
inst = c.step ();
sym = inst.getsym ();
if (sym == _upper)
_rec->Ky[key].FieldSeq[n] += MaxFields;
_rec.Ky[key].FieldSeq[n] += MaxFields;
else if (sym == _number)
{
_rec->Ky[key].FromCh[n] = (int)inst.number().integer() - 1;
_rec.Ky[key].FromCh[n] = (int)inst.number().integer() - 1;
inst = c.step ();
_rec->Ky[key].ToCh[n] = _rec->Ky[key].FromCh[n] + (int)inst.number ().integer () - 1;
_rec.Ky[key].ToCh[n] = _rec.Ky[key].FromCh[n] + (int)inst.number ().integer () - 1;
inst = c.step ();
}
else
@ -633,7 +635,7 @@ void TTrec::update_keydef (int key, TToken_string& s)
n++;
}
}
_rec->Ky[key].NkFields = n;
_rec.Ky[key].NkFields = n;
}
}
@ -654,7 +656,7 @@ void TTrec::print_on(ostream & out) const
s = fielddef (i);
out << s ;
if (_des)
out << "|" << _des->get(_rec->Fd[i].Name);
out << "|" << _des->get(_rec.Fd[i].Name);
out << '\n';
}
const int nkeys = keys ();
@ -697,7 +699,7 @@ void TTrec::read_from(istream & in)
update_fielddef (i, t);
const int itms = t.items();
if (_des && itms >= 5) // La descrizione viene caricata solo se esiste
_des->set(_rec->Fd[i].Name, t.get(4));
_des->set(_rec.Fd[i].Name, t.get(4));
}
in.getline (t.get_buffer(), t.size(), '\n');

View File

@ -90,7 +90,7 @@ class TDir : public TObject
{
// @cmember:(INTERNAL) Descrittore del file
FileDes* _dir;
FileDes _dir;
// @cmember:(INTERNAL) Numero di file presenti
int _num;
// @cmember:(INTERNAL) Appartenenza al direttorio comune (TRUE) o a quello della ditta
@ -109,10 +109,12 @@ public:
void set_name (const char * name);
// @cmember Setta l'EOX del file
void set_eox(const RecNoType eox);
void reset_eox();
// @cmember Setta l'EOD del file
void set_eod(const RecNoType eod);
// @cmember Setta la lunghezza del file
void set_len(const UINT16 len);
void set_flags(const RecNoType f);
// @cmember Setta il file con i parametri passati
void set (const char * name, const RecNoType eod, const RecNoType flag, const char * des, const char * calc);
@ -132,43 +134,41 @@ public:
// @cmember Ritorna l'espressione associata al file selezionato
const char* expr() const;
// @cmember Ritorna l'EOD del file selezionato
TRecnotype& eod() const;
TRecnotype eod() const;
// @cmember Ritorna l'EOX del file selezionato
TRecnotype& eox() const;
TRecnotype eox() const;
// @cmember Ritorna il flag del file selezionato
long& flags() const;
long flags() const;
// @cmember Ritorna la lunghezza del tracciato record in bytes
word& len() const;
word len() const;
// @cmember Ritorna lo stato d'errore del file
int status(TDirtype dirtype = _nordir) const ;
// @cmember Ritorna il numero di file presenti
int num() const
{ return _num;}
int num() const { return _num;}
// @cmember Ritorna il numero di file presenti nella directory <p dirtype>
int items(TDirtype dirtype = _nordir) const;
// @cmember Ritorna il descrittore del file "dir.gen"
FileDes* filedesc() const
{ return _dir; }
const FileDes& filedesc() const { return _dir; }
FileDes& filedesc() { return _dir; }
// @cmember Controlla se il file appartiene ai dati comuni. Valido solo se
// la get e' stata effettuata con _sysdirop
bool is_com() const
{return _com;}
bool is_com() const { return _com; }
// @cmember Controlla se il file appartiene alla ditta. Valido solo se
// la get e' stata effettuata con _sysdirop
bool is_firm() const
{return !_com;}
bool is_firm() const { return !_com; }
// @cmember Controlle se il file e' valido (nome esistente e dimensione
// diversa da 0)
bool is_valid()
{return name()[0] > ' ' && len() > 0;}
bool is_valid() { return name()[0] > ' ' && len() > 0; }
// @cmember Controlla se il file e' attivato dalla chiave hardware.
// Valido solo se prefhnd e settato a ""
bool is_active() const;
// @cmember Duplica il tracciato record
virtual TObject* dup() const { return new TDir(*this);}
// @cmember Costruttore
// @cmember Costruttore di copia
TDir(const TDir & d);
// @cmember Costruttore "sicuro"
TDir(int logicnum);
// @cmember Costruttore
TDir();
// @cmember Distruttore
@ -189,7 +189,7 @@ class TTrec : public TSortable
{
// @cmember:(INTERNAL) Descrittore del tracciato record
RecDes* _rec;
RecDes _rec;
// @cmember:(INTERNAL) Numero del file di appartenenza
int _num;
// @cmember:(INTERNAL) Puntatore al TConfig delle descrizioni
@ -223,22 +223,20 @@ public:
// @cmember Ritorna il numero del campo <p fieldname>
int field(const char* fieldname) const;
// @cmember Ritorna il descrittore del tracciato record
RecDes* rec() const
{ return _rec;}
const RecDes& rec() const { return _rec;}
RecDes& rec() { return _rec;}
// @cmember Assegna un oggetto TTrec
TTrec& operator =(const TTrec& b);
// @cmember Ritorna il numero di campi del tracciato record
int fields() const
{ return _rec->NFields; }
int fields() const { return _rec.NFields; }
// @cmember Ritorna il numero di chiavi di ordinamento del tracciato record
int keys() const
{ return _rec->NKeys; }
int keys() const { return _rec.NKeys; }
// @cmember Assegna il numero di campi del tracciato record
void set_fields(int nfields)
{ _rec->NFields = short(nfields);}
{ _rec.NFields = short(nfields);}
// @cmember Assegna il numero di chiavi di ordinamento del tracciato record
void set_keys(int nkeys)
{ _rec->NKeys = short(nkeys);}
{ _rec.NKeys = short(nkeys);}
// @cmember Ritorna una token string contenente la descrizione del campo
const char* fielddef(int fld) const;
// @cmember Ritorna una stringa contenente la chiave
@ -263,6 +261,7 @@ public:
// @cmember Costruttore
TTrec(const TTrec & r);
// @cmember Costruttore
TTrec(int logicnum);
TTrec();
// @cmember Distruttore
virtual ~TTrec();

View File

@ -568,7 +568,7 @@ HIDDEN void browse_null(char *start, int nc)
return tmp;
} */
HIDDEN int __build_key(const RecDes *recd, int numkey, RecType recin, char *key, bool build_x_cb)
HIDDEN int __build_key(const RecDes& recd, int numkey, RecType recin, char *key, bool build_x_cb)
/* *recd; descrittore record */
/* numkey; numero chiave */
/* recin; buffer contenente il record */
@ -579,15 +579,15 @@ HIDDEN int __build_key(const RecDes *recd, int numkey, RecType recin, char *key
const char null_char = -1;
key[0] = '\0';
if (numkey-- <= recd->NKeys)
if (numkey-- <= recd.NKeys)
{
int l = 0;
for (int i = 0; i < recd->Ky[numkey].NkFields; i++)
for (int i = 0; i < recd.Ky[numkey].NkFields; i++)
{
const KeyDes& kd = recd->Ky[numkey];
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];
const RecFieldDes& rf = recd.Fd[nf];
const TFieldtypes f = (TFieldtypes) rf.TypeF;
int off, len;
@ -675,7 +675,7 @@ HIDDEN int cisread(int fhnd, int knum, TRectype& record, int mode, TRecnotype& c
{
if (rmode>=_isequal && rmode<=_isgteq)
{
const RecDes* r = record.rec_des();
const RecDes& r = record.rec_des();
err=__build_key(r, knum, record.string(),key,TRUE);
if (err == NOERR)
{
@ -700,7 +700,7 @@ HIDDEN int cisread(int fhnd, int knum, TRectype& record, int mode, TRecnotype& c
{
if (curr_recno != DB_recno(fhnd))
{
RecDes* r = record.rec_des();
const RecDes& r = record.rec_des();
err = __build_key(r, knum, record.string(),key,TRUE);
if (err == NOERR)
{
@ -721,7 +721,7 @@ HIDDEN int cisread(int fhnd, int knum, TRectype& record, int mode, TRecnotype& c
{
if (curr_recno != DB_recno(fhnd))
{
RecDes* r = record.rec_des();
const RecDes& r = record.rec_des();
err = __build_key(r, knum, record.string(),key,TRUE);
if (err == NOERR)
{
@ -756,8 +756,8 @@ HIDDEN int cisread(int fhnd, int knum, TRectype& record, int mode, TRecnotype& c
}
if (err == _islocked)
{
RecDes* r = record.rec_des();
record = (const char *) DB_getrecord(fhnd);
const RecDes& r = record.rec_des();
record = (const char*)DB_getrecord(fhnd);
__build_key(r, knum, record.string(), key, TRUE);
message_box("Codice %s in uso da parte\ndi un altro utente.", key);
if (lmode != _lock)
@ -825,7 +825,7 @@ TBaseisamfile::TBaseisamfile(
TTrec r;
ifstream f(descname);
f >> r;
const int err=DB_build(name, r.rec()) ;
const int err=DB_build(name, &r.rec()) ;
if (err != NOERR)
fatal_box("Non posso creare il file %s : errore n.ro %d", name, err);
}
@ -957,7 +957,7 @@ int TBaseisamfile::skip(TRecnotype nrec, word lockop)
{
const RecDes& r = prefix().get_recdes(num());
TString key(128);
__build_key(&r, _curr_key, curr().string(), key.get_buffer(), TRUE);
__build_key(r, _curr_key, curr().string(), key.get_buffer(), TRUE);
message_box("Codice %s in uso da parte\ndi un altro utente.\nSkipping", (const char*)key);
_lasterr = cisread(fhnd, getkey(), curr(),_iscurr + lockop, _recno);
}
@ -1593,12 +1593,12 @@ TIsamtempfile::TIsamtempfile(int logicnum, const char* radix, bool create, bool
if (!create)
{
TDir dir; dir.get(logicnum,_nolock,_nordir,_sysdirop);
const long len = dir.len();
const long sz = fsize(n);
if (sz == 0)
fatal_box("Impossibile aprire il file %s: %s",(const char*) n,(const char*)_strerror(NULL));
fatal_box("Impossibile aprire il file %s: %s",(const char*)n, (const char*)_strerror(NULL));
const TDir dir(logicnum);
const long len = dir.len();
eod = eox = sz / len;
}
@ -1804,8 +1804,7 @@ int TExternisamfile::close()
int TExternisamfile::zap()
{
RecDes* rd = new RecDes;
memcpy(rd, curr().rec_des(), sizeof(RecDes));
RecDes rd = curr().rec_des();
int err = prefix().close_isamfile(_isam_handle);
if (err == NOERR)
@ -1814,12 +1813,11 @@ int TExternisamfile::zap()
if (err == NOERR)
{
TRecnotype peod;
err = DB_packindex(TRUE, _name, rd, &peod, FALSE);
err = DB_packindex(TRUE, _name, &rd, &peod, FALSE);
}
_isam_handle = prefix().open_isamfile(_logicnum, _name);
}
delete rd;
return err;
}
@ -1834,21 +1832,18 @@ const char* TExternisamfile::name() const
int TSystemisamfile::build(TRecnotype eox, const TTrec& r)
{
int err=NOERR;
TDir d;
d.get(num());
CHECK(r.len() != 0, "Can't create a file with empty field info");
int err = NOERR;
const TDir d(num());
if (r.len() > 0)
{
TFilename f(filename());
TFilename fname(f); fname.ext(""); // sostituto per _filename
TFilename f(filename());
f = f.path(); if (!is_not_slash(f.right(1)[0])) f.rtrim(1);
if (!fexist(f))
make_dir(f);
TFilename fname(f); fname.ext(""); // sostituto per _filename
f = f.path(); if (!is_not_slash(f.right(1)[0])) f.rtrim(1);
if (!fexist(f))
make_dir(f);
if (r.len() != 0)
{
err=DB_build(fname,r.rec());
err=DB_build(fname, &r.rec());
if (err != NOERR)
err = get_error(err);
setstatus(err);
@ -1860,7 +1855,11 @@ int TSystemisamfile::build(TRecnotype eox, const TTrec& r)
if (fexist(lf))
load(lf, '|', '\0', '\n', TRUE, TRUE);
}
}
else
{
NFCHECK("Can't create a file with empty field info");
setstatus(_isbadtrc);
}
return err;
}
@ -2067,10 +2066,7 @@ int TSystemisamfile::update(
else
{
if (dir.eox() > 0L)
{
dir.eod() = 0L;
dir.eox() = 0L;
}
dir.reset_eox();
}
const int oldfields = oldrec.fields(); //numero campi del vecchio file
@ -2116,7 +2112,7 @@ int TSystemisamfile::update(
TRecnotype ni = 0L;
TFilename tmpfname; tmpfname.temp("tf");
err=DB_build(tmpfname, wrec.rec());
err=DB_build(tmpfname, &wrec.rec());
if (err != NOERR)
{
@ -2261,7 +2257,7 @@ int TSystemisamfile::update(
fclose(fp);
}
::remove(tmpfname);
dir.eod() = ni;
dir.set_eod(ni);
}
}
if (err==NOERR)
@ -2295,24 +2291,28 @@ int TSystemisamfile::packfile(
// @xref <mf TSystemisamfile::packindex>
{
TDir d;
d.get(num(),_nolock, _nordir,_sysdirop); // Chi commenta muore!
d.get(num(),_nolock, (d.is_com()) ? _comdir : _nordir);
TFilename fname = filename(); fname.ext("");
TRecnotype new_eod = 0L;
if (!zap)
{
TDir d(num()); // Chi commenta muore!
d.get(num(),_nolock, (d.is_com()) ? _comdir : _nordir, _sysdirop);
new_eod = d.eod();
}
// CHECKS(filehnd() == NULL, "Can't pack open file", (const char*)filename());
int err = DB_packfile(vis, d.name(), zap ? 0L : d.eod());
int err = DB_packfile(vis, fname, new_eod);
if (zap && err == NOERR)
err = packindex(vis, FALSE);
if (err == NOERR && curr().has_memo())
err = DB_packmemo(vis,d.name());
err = DB_packmemo(vis,fname);
if (err != NOERR)
{
err = get_error(err);
if (err != NOERR)
error_box("Errore in compattamento dati.\nFile %d : %d", num(),err);
error_box("Errore in compattamento dati.\nFile %d : %d", num(), err);
}
setstatus(err);
return err;
@ -2337,16 +2337,13 @@ int TSystemisamfile::packindex(
// @xref <mf TSystemisamfile::packfile>
{
int err = NOERR;
TTrec r; r.get(num());
TDir d(num());
const bool is_com = d.is_com();
//d.get(num(),_nolock, is_com ? _comdir : _nordir, _sysdirop);
TFilename name = d.filename(); name.ext("");
TRecnotype peod;
TTrec r;
TDir d;
r.get(num());
d.get(num(), _nolock, _nordir, _sysdirop);
bool is_com = d.is_com();
d.get(num(), _nolock, is_com ? _comdir : _nordir);
err = DB_packindex(vis, d.name(), r.rec(), &peod, ask);
int err=DB_packindex(vis,name,&r.rec(),&peod,ask);
if (err != NOERR)
err = get_error(err);
if (err != NOERR)
@ -2357,7 +2354,7 @@ int TSystemisamfile::packindex(
else
if (peod >= 0 && peod != d.eod())
{
d.eod() = peod;
d.set_eod(peod);
d.put(num(), is_com ? _comdir : _nordir);
}
@ -2700,7 +2697,7 @@ int TSystemisamfile::overwrite(
len[nflds] = wfd.get_int();
nflds++;
}
const RecDes& rd = * curr().rec_des();
const RecDes& rd = curr().rec_des();
const KeyDes& kd = rd.Ky[0];
for (int i = 0 ; i < kd.NkFields; i++)
@ -3314,19 +3311,19 @@ void TRectype::unknown_field(const char* name) const
void TRectype::write_memo(TIsam_handle file, const TRecnotype recno)
{
const RecDes *r = rec_des( );
const RecDes& r = rec_des( );
TIsam_handle orig = _memo_data->file();
if (orig && (file != orig || recno != _memo_data->recno()))
{
TCodeb_handle cb_orig = prefix().get_handle(orig);
DB_go(cb_orig, _memo_data->recno());
for(int i = r->NFields - 1; i >= 0; i--)
for(int i = r.NFields - 1; i >= 0; i--)
{
if (r->Fd[i].TypeF == _memofld)
if (r.Fd[i].TypeF == _memofld)
{
if (_memo_data->objptr(i) == NULL)
{
const char* memo = DB_memoptr(cb_orig, r->Fd[i].Name);
const char* memo = DB_memoptr(cb_orig, r.Fd[i].Name);
if (memo && *memo)
_memo_data->add(memo, i);
}
@ -3341,7 +3338,7 @@ void TRectype::write_memo(TIsam_handle file, const TRecnotype recno)
for( int i = _memo_data->last( ); i > 0; i = _memo_data->pred( i ) )
{
if (_memo_data->is_dirty(i))
DB_memowrite( cb_handle, r->Fd[ i ].Name, ( char * )( const char * )_memo_data->row( i ) );
DB_memowrite( cb_handle, r.Fd[ i ].Name, _memo_data->row( i ) );
}
*this = (const char *) DB_getrecord(cb_handle);
init_memo(recno, file);
@ -3377,11 +3374,11 @@ const char* TRectype::build_key(int num) const
const char* TRectype::last_key_field(int key) const
{
const KeyDes& kd = rec_des()->Ky[key];
const KeyDes& kd = rec_des().Ky[key];
const int last = kd.NkFields-1;
const bool upp = kd.FieldSeq[last] > MaxFields;
const int nf = upp ? kd.FieldSeq[last] - MaxFields : kd.FieldSeq[last];
const RecFieldDes& rf = rec_des()->Fd[nf];
const RecFieldDes& rf = rec_des().Fd[nf];
return rf.Name;
}
@ -3425,7 +3422,7 @@ int TRectype::compare_key(
if (skip_last > 0)
{
int maxlen = 0;
const RecDes& rd = *rec_des();
const RecDes& rd = rec_des();
const KeyDes& kd = rd.Ky[key-1];
const int last = kd.NkFields-skip_last;
for (int l = 0; l < last; l++)
@ -3472,19 +3469,19 @@ HIDDEN int fld_cmp(const char* a, const char* b, int len, bool number)
// TRectype (record di un file)
///////////////////////////////////////////////////////////
RecDes* TRectype::rec_des() const
const RecDes& TRectype::rec_des() const
{
return (RecDes*)&prefix().get_recdes(_logicnum);
return prefix().get_recdes(_logicnum);
}
int TRectype::items() const
{
return rec_des()->NFields;
return rec_des().NFields;
}
const char* TRectype::start(int nf) const
{
return string() + rec_des()->Fd[nf].RecOff;
return string() + rec_des().Fd[nf].RecOff;
}
// Confronto tra record: Attenzione i campi vuoti di s non vengono confrontati!
@ -3495,7 +3492,7 @@ int TRectype::compare(const TSortable& s) const
if (br.empty()) return UNDEFINED;
const RecDes& rd = *rec_des();
const RecDes& rd = rec_des();
for (int i = 0; i < rd.NFields; i++)
{
const char* b = br.start(i);
@ -3525,7 +3522,7 @@ bool TRectype::is_equal(const TRectype& r) const
if (has_memo())
{
const RecDes& rd = *rec_des();
const RecDes& rd = rec_des();
for(int i = rd.NFields - 1; i >= 0; i--)
{
if (rd.Fd[i].TypeF == _memofld)
@ -3541,7 +3538,7 @@ bool TRectype::is_equal(const TRectype& r) const
if (yes && has_memo())
{
const RecDes& rd = *rec_des();
const RecDes& rd = rec_des();
for(int i = rd.NFields - 1; yes && i >= 0; i--)
{
if (rd.Fd[i].TypeF == _memofld)
@ -3553,43 +3550,43 @@ bool TRectype::is_equal(const TRectype& r) const
TFieldtypes TRectype::type(const char* fieldname) const
{
const RecDes* recd = rec_des();
const int p = findfld(recd, fieldname);
return p != FIELDERR ? (TFieldtypes)recd->Fd[p].TypeF : _nullfld;
const RecDes& recd = rec_des();
const int p = findfld(&recd, fieldname);
return p != FIELDERR ? (TFieldtypes)recd.Fd[p].TypeF : _nullfld;
}
int TRectype::length(const char* fieldname) const
{
const RecDes * recd = rec_des();
const int p = findfld(recd, fieldname);
return p != FIELDERR ? recd->Fd[p].Len : 0;
const RecDes& recd = rec_des();
const int p = findfld(&recd, fieldname);
return p != FIELDERR ? recd.Fd[p].Len : 0;
}
int TRectype::ndec(const char* fieldname) const
{
const RecDes* recd = rec_des();
const int p = findfld(recd, fieldname);
return p != FIELDERR ? recd->Fd[p].Dec : 0;
const RecDes& recd = rec_des();
const int p = findfld(&recd, fieldname);
return p != FIELDERR ? recd.Fd[p].Dec : 0;
}
bool TRectype::exist(const char* fieldname) const
{
return findfld(rec_des(), fieldname) != FIELDERR;
return findfld(&rec_des(), fieldname) != FIELDERR;
}
const char* TRectype::fieldname(int i) const
{
const RecDes* recd = rec_des();
return i >= 0 && i < recd->NFields ? recd->Fd[i].Name : NULL;
const RecDes& recd = rec_des();
return i >= 0 && i < recd.NFields ? recd.Fd[i].Name : NULL;
}
const TString& TRectype::get_str(const char* fieldname) const
{
const RecDes* recd = rec_des();
const int nf = findfld(recd, fieldname);
const RecDes& recd = rec_des();
const int nf = findfld(&recd, fieldname);
if (nf != FIELDERR)
{
const RecFieldDes& fd = recd->Fd[nf];
const RecFieldDes& fd = recd.Fd[nf];
TString& tmp = get_tmp_string(fd.Len + (fd.TypeF == _datefld ? 2 : 0));
__getfieldbuff(fd.Len, fd.TypeF, _rec + fd.RecOff, tmp, __file_is_crypted(num()));
return tmp;
@ -3603,8 +3600,8 @@ const TString& TRectype::get(const char* fieldname) const
{
if (_memo_data && type(fieldname) == _memofld)
{
const RecDes* recd = rec_des();
const int index = findfld(recd, fieldname);
const RecDes& recd = rec_des();
const int index = findfld(&recd, fieldname);
if ( _memo_data->objptr( index ))
return _memo_data->row( index );
if(_memo_data->recno() >= 0L)
@ -3719,15 +3716,15 @@ void TRectype::put(const char* fieldname, bool val)
void TRectype::put_str(const char* fieldname, const char* val)
{
const RecDes* recd = rec_des();
const int nf = findfld(recd, fieldname);
const RecDes& recd = rec_des();
const int nf = findfld(&recd, fieldname);
if (nf == FIELDERR)
{
unknown_field(fieldname);
return;
}
const RecFieldDes& fd = recd->Fd[nf];
const RecFieldDes& fd = recd.Fd[nf];
const TFieldtypes ft = TFieldtypes(fd.TypeF);
if (val == NULL)
@ -3769,17 +3766,17 @@ void TRectype::zero(const char* fieldname)
put("COD", _tab);
else
{
const RecDes * recd = rec_des();
const int nf = findfld(recd, fieldname);
const RecDes& recd = rec_des();
const int nf = findfld(&recd, fieldname);
if (nf == FIELDERR)
unknown_field(fieldname);
else
{
const int recoff = recd->Fd[nf].RecOff;
const int recoff = recd.Fd[nf].RecOff;
char * p = _rec + recoff;
const byte len = recd->Fd[nf].Len;
const byte dec = recd->Fd[nf].Dec;
const TFieldtypes type = (TFieldtypes) recd->Fd[nf].TypeF;
const byte len = recd.Fd[nf].Len;
const byte dec = recd.Fd[nf].Dec;
const TFieldtypes type = (TFieldtypes) recd.Fd[nf].TypeF;
switch (type)
{
case _datefld:
@ -4011,13 +4008,13 @@ bool TRectype::edit(int logicnum, const char* alternate_key_fields, const char*
r.get_relapp(app);
if (app.not_empty())
{
const RecDes* recd = r.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd->Ky[0]; // Elenco dei campi della chiave 1
const RecDes& recd = r.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd.Ky[0]; // Elenco dei campi della chiave 1
TToken_string key_labels;
for (int i = 0; i < kd.NkFields; i++)
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = recd->Fd[nf];
const RecFieldDes& rf = recd.Fd[nf];
key_labels.add(rf.Name);
}
@ -4114,9 +4111,9 @@ TRecfield::TRecfield(TRectype& rec, const char* name, int from, int to)
else
_name = name;
const RecDes* rd = _rec->rec_des();
const RecDes& rd = _rec->rec_des();
const int nf = findfld(rd, _name);
const int nf = findfld(&rd, _name);
if (nf == FIELDERR)
{
@ -4133,19 +4130,19 @@ TRecfield::TRecfield(TRectype& rec, const char* name, int from, int to)
NFCHECK("Invalid Start %d", from);
from = 0;
}
_p = _rec->string() + rd->Fd[nf].RecOff;
_dec = rd->Fd[nf].Dec;
_type = (TFieldtypes)rd->Fd[nf].TypeF;
_p = _rec->string() + rd.Fd[nf].RecOff;
_dec = rd.Fd[nf].Dec;
_type = (TFieldtypes)rd.Fd[nf].TypeF;
if (_sub_field.empty())
{
_p += from;
if (to >= 0)
{
CHECK(from <= to && to <= rd->Fd[nf].Len, "Invalid Range");
CHECK(from <= to && to <= rd.Fd[nf].Len, "Invalid Range");
_len = to - from + 1;
}
else
_len = rd->Fd[nf].Len - from;
_len = rd.Fd[nf].Len - from;
}
else
{
@ -4155,7 +4152,7 @@ TRecfield::TRecfield(TRectype& rec, const char* name, int from, int to)
if (_type == _memofld)
_len = 0;
else
_len = rd->Fd[nf].Len;
_len = rd.Fd[nf].Len;
}
}

View File

@ -232,7 +232,7 @@ public:
TRectype& operator =(const TBaseisamfile& f);
// @cmember Ritorna il descrittore del record
virtual RecDes * rec_des() const;
virtual const RecDes& rec_des() const;
// @cmember Ritorna il numero logico del record
int num() const
{ return _logicnum;}

View File

@ -2288,7 +2288,7 @@ int TBrowse::do_input(
ne++; // Increment not empty fields count
}
}
TFieldref fldref(_inp_fn.get(), 0); // Output field
const TFieldref fldref(_inp_fn.get(), 0); // Output field
fldref.write(val, *_cursor->relation());
if (tofilter)
{
@ -2551,13 +2551,13 @@ bool TBrowse::do_link(bool insert)
// Uso sempre la chiave 1 per collegarmi agli altri programmi
const TRelation& rel = *_cursor->relation();
const RecDes* recd = rel.curr().rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd->Ky[0]; // Elenco dei campi della chiave 1
const RecDes& recd = rel.curr().rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd.Ky[0]; // Elenco dei campi della chiave 1
TString inp_val;
for (int i = 0; i < kd.NkFields; i++)
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = recd->Fd[nf];
const RecFieldDes& rf = recd.Fd[nf];
const TFieldref fldref(rf.Name, 0);
inp_val = fldref.read(rel);
fldref.write(ini, paragraph, inp_val);

View File

@ -5,7 +5,7 @@
bool TMultiple_rectype::key_complete() const
{
const RecDes& recd = *rec_des(); // Descrizione del record
const RecDes& recd = rec_des(); // Descrizione del record
const KeyDes& kd = recd.Ky[0];
const int nf = kd.FieldSeq[kd.NkFields - 1] % MaxFields; //posizione ultimo campo chiave principale
const RecFieldDes& rf = recd.Fd[nf];
@ -25,7 +25,7 @@ bool TMultiple_rectype::key_complete() const
//assegna il prossimo numero all'ultimo campo della chiave principale della testata
bool TMultiple_rectype::renum()
{
const RecDes& recd = *rec_des(); // Descrizione del record
const RecDes& recd = rec_des(); // Descrizione del record
const KeyDes& kd = recd.Ky[0];
const int nf = kd.FieldSeq[kd.NkFields - 1] % MaxFields; //posizione ultimo campo chiave principale
const RecFieldDes& rf = recd.Fd[nf];
@ -64,14 +64,14 @@ bool TMultiple_rectype::renum()
void TMultiple_rectype::set_body_key(TRectype & rowrec)
{
const RecDes* recd = rowrec.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd->Ky[0]; // Elenco dei campi della chiave 1
const RecDes& recd = rowrec.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd.Ky[0]; // Elenco dei campi della chiave 1
// Copia tutti i campi chiave, tranne l'ultimo, in tutti i records
for (int i = kd.NkFields-2; i >= 0; i--)
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = recd->Fd[nf];
const RecFieldDes& rf = recd.Fd[nf];
const TString& val = get(rf.Name);
rowrec.renum_key(rf.Name, val);
}

View File

@ -262,7 +262,7 @@ bool TRecord_info::create(TTrec& rec, TToken_string& keys)
translate_key(trans); // Traduce l'espressione chiave di CodeBase
rec.update_keydef(i, trans);
}
memcpy(&_recdes, rec.rec(), sizeof(RecDes));
_recdes = rec.rec();
compute_len();
return _len > 0;
}
@ -284,7 +284,7 @@ TRecord_info::TRecord_info(const char* name)
fname.ext("");
FileDes fd;
TTrec rec;
int err = DB_recinfo(fname, &fd, rec.rec(), keys.get_buffer());
int err = DB_recinfo(fname, &fd, (RecDes*)&rec.rec(), keys.get_buffer());
if (err != NOERR)
create(rec, keys);
else
@ -364,9 +364,11 @@ int TFile_info::open_low(bool exclusive, bool index)
if (num() < LF_EXTERNAL && (_dir == _nordir || _dir == _comdir))
{
const TRecnotype n = DB_reccount(_handle);
TDir d; d.get(num(),_nolock,_dir,_sysdirop);
_filedes.EOD = d.eod() = n;
_filedes.EOX = d.eox() = n;
_filedes.EOD = n;
_filedes.EOX = n;
TDir d; d.get(num(), _nolock, _dir, _sysdirop);
d.set_eod(n);
d.set_eox(n);
d.put(num(), _dir, _sysdirop);
}
@ -528,10 +530,10 @@ TFile_info::TFile_info(int logicnum, TFilename& name)
_name.ext("");
TTrec rec;
int err = DB_recinfo(_name, &_filedes, rec.rec(), keys.get_buffer());
int err = DB_recinfo(_name, &_filedes, (RecDes*)&rec.rec(), keys.get_buffer());
if (err == NOERR && prefix().add_recdes(logicnum, rec, keys))
{
strncpy(_filedes.SysName, _name, 40);
strncpy(_filedes.SysName, _name, sizeof(_filedes.SysName));
_filedes.SysName[41] = '\0';
}
else
@ -1322,7 +1324,7 @@ bool TPrefix::build_firm_data(long codditta, bool flagcom)
dir.get(LF_DIR, _nolock, _nordir, _sysdirop);
if (dir.eod() == 0)
{
dir1.eod() = 1L;
dir1.set_eod(1);
dir1.put(LF_DIR, _nordir, _sysdirop);
dir.get(LF_DIR, _nolock, _nordir, _sysdirop);
}
@ -1331,7 +1333,7 @@ bool TPrefix::build_firm_data(long codditta, bool flagcom)
if (maxeod0 > maxeod1)
{
dir.get(LF_DIR, _nolock, _nordir, _sysdirop);
dir.eod() = maxeod0;
dir.set_eod(maxeod0);
dir.put(LF_DIR, _nordir, _sysdirop);
rec.zero();
}
@ -1349,7 +1351,7 @@ bool TPrefix::build_firm_data(long codditta, bool flagcom)
prefix().set_codditta(codditta);
dir.put(i, _nordir, _sysdirop);
rec.put(i);
dir.flags() = 0L;
dir.set_flags(0);
create_now = create_now && (flagcom ? dir.is_com() : dir.is_firm());
if (dir.is_valid() && create_now)

View File

@ -327,9 +327,9 @@ void progind_create(long m, const char* t, bool b, bool c, int n)
__indwin__p = new TProgind(m,t,b,c,n);
}
void progind_set_status(long l)
bool progind_set_status(long l)
{
((TProgind*)__indwin__p)->setstatus(l);
return ((TProgind*)__indwin__p)->setstatus(l);
}
void progind_cancel()

View File

@ -162,7 +162,7 @@ extern "C" {
#endif
// Non commentate perche' destinate a sparire
void progind_create(long, const char*, bool, bool, int);
void progind_set_status(long);
bool progind_set_status(long s);
void progind_cancel();
bool progind_iscancelled();
bool progind_isfinished();

View File

@ -66,15 +66,15 @@ void TRecord_array::set_key(TRectype* r)
_data.add(r, 0); // Setta il nuovo campo chiave
if (rows() > 0)
{
const RecDes* recd = r->rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd->Ky[0]; // Elenco dei campi della chiave 1
const RecDes& recd = r->rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd.Ky[0]; // Elenco dei campi della chiave 1
// Copia tutti i campi chiave, tranne l'ultimo, in tutti i records
TString val;
for (int i = kd.NkFields-2; i >= 0; i--)
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = recd->Fd[nf];
const RecFieldDes& rf = recd.Fd[nf];
val = r->get(rf.Name);
renum_key(rf.Name, val);
CHECKS(i > 0 || val.full(), "First key field can't be empty: ", rf.Name);
@ -607,12 +607,12 @@ const TObject& TFile_cache::query(const char* code)
TRectype& curr = f.curr();
if (_code.full())
{
const RecDes* recd = curr.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd->Ky[_key-1]; // Elenco dei campi della chiave
const RecDes& recd = curr.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd.Ky[_key-1]; // Elenco dei campi della chiave
for (int i = 0; i < kd.NkFields; i++) // Riempie la chiave selezionata
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = recd->Fd[nf];
const RecFieldDes& rf = recd.Fd[nf];
const char* val = _code.get();
if (val && *val)
curr.put(rf.Name, val);
@ -666,8 +666,8 @@ long TFile_cache::fill()
TLocalisamfile& f = file();
TRectype& curr = f.curr();
const RecDes* recd = curr.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd->Ky[_key-1]; // Elenco dei campi della chiave
const RecDes& recd = curr.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd.Ky[_key-1]; // Elenco dei campi della chiave
f.setkey(_key);
for (int err = f.first(); err == NOERR; err = f.next())
@ -676,7 +676,7 @@ long TFile_cache::fill()
for (int i = f.tab() ? 1 :0; i < kd.NkFields; i++) // Riempie la chiave selezionata
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = recd->Fd[nf];
const RecFieldDes& rf = recd.Fd[nf];
const char* val = curr.get(rf.Name);
_code.add(val);
}
@ -854,7 +854,7 @@ const TRectype& TDB_cache::get(const char* table, const char* key)
const TRectype& TDB_cache::get(const TRectype& curr)
{
const int num = curr.num(); // Numero logico del file (o tabella)
const RecDes& recd = *curr.rec_des(); // Descrizione del record della testata
const RecDes& recd = curr.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd.Ky[0]; // Elenco dei campi della chiave 1
TToken_string key;
for (int i = 0; i < kd.NkFields; i++) // Riempie la chiave
@ -881,14 +881,14 @@ bool TDB_cache::discard(const char *table, const char* key)
bool TDB_cache::discard(const TRectype& curr)
{
const int file = curr.num(); // Numero logico del file (o tabella)
const RecDes* recd = curr.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd->Ky[0]; // Elenco dei campi della chiave 1
const RecDes& recd = curr.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd.Ky[0]; // Elenco dei campi della chiave 1
TToken_string code;
for (int i = 0; i < kd.NkFields; i++) // Riempie la chiave
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = recd->Fd[nf];
const RecFieldDes& rf = recd.Fd[nf];
const char* val = curr.get(rf.Name);
code.add(val);
}

View File

@ -1548,7 +1548,7 @@ void TRelation_application::main_loop()
bool TRelation_application::filter()
{
if (parse_command_line())
return TRUE;
return true;
TMailbox mail;
TMessage* msg = mail.next_s(MSG_FS);

View File

@ -1033,7 +1033,7 @@ bool TCursor::has_simple_filter() const
bool yes = _filterfunction == NULL;
if (yes && _fexpr != NULL && _fexpr->numvar() > 0)
{
const RecDes& recd = *curr().rec_des(); // Descrizione del record della testata
const RecDes& recd = curr().rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd.Ky[_nkey-1]; // Elenco dei campi della chiave del cursore
for (int i = _fexpr->numvar()-1; yes && i >= 0; i--)
{
@ -1070,7 +1070,7 @@ TRecnotype TCursor::buildcursor(TRecnotype rp)
FILE* indf = NULL;
const int l = strlen(to());
int junk = DB_index_seek(fhnd, (char*)(const char*) from());
int junk = DB_index_seek(fhnd, from());
if (junk < 0) junk=get_error(junk);
if (junk == _iseof) return 0;
@ -1133,16 +1133,16 @@ TRecnotype TCursor::buildcursor(TRecnotype rp)
return ap;
}
bool TCursor::call_filterfunction(const TRelation * r, TRecnotype recno) const
bool TCursor::call_filterfunction(TRecnotype recno) const
{
bool ok = true;
if (_filterfunction)
{
// memorizzo la chiave prima di eventuali spostamenti
const TString256 s0 = DB_index_getkey(file().handle());
ok = _filterfunction(_if);
// ripristino la chiave dopo eventuali spostamenti
const int handle = file().handle();
// memorizzo la chiave prima di eventuali spostamenti
const TString256 s0 = DB_index_getkey(handle);
ok = _filterfunction(_if);
// ripristino la chiave dopo eventuali spostamenti
if (recno != DB_index_recno(handle))
DB_index_go(handle, s0, recno);
}
@ -1164,7 +1164,7 @@ bool TCursor::filtercursor(TRecnotype recno)
DB_index_go(handle, s0, recno);
}
bool ok = call_filterfunction(_if, recno);
bool ok = call_filterfunction(recno);
if (ok && _fexpr)
ok = __evalcondition(*_if, _fexpr, _frefs);
@ -1176,7 +1176,7 @@ bool TCursor::simple_filtercursor(const char* key) const
if (_fexpr == NULL)
return true;
const RecDes& recd = *curr().rec_des(); // Descrizione del record della testata
const RecDes& recd = curr().rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd.Ky[_nkey-1]; // Elenco dei campi della chiave del cursore
TFieldref f;
@ -1267,7 +1267,7 @@ bool TCursor::ok() const
file().readat(old);
}
if (call_filterfunction(_if, old) &&
if (call_filterfunction(old) &&
(_fexpr ? __evalcondition(*_if, _fexpr, _frefs) : true))
return true;
@ -1321,9 +1321,10 @@ TRecnotype TCursor::update()
HIDDEN void matildator(const TRectype& oldrec, int key, bool tilde, TString& str)
{
/*
if (tilde)
{
TRectype rec(oldrec);
TRectype rec(oldrec); // Utile duplicazione di record
const RecDes* recd = rec.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd->Ky[key-1]; // Elenco dei campi della chiave
TString80 val;
@ -1347,6 +1348,28 @@ HIDDEN void matildator(const TRectype& oldrec, int key, bool tilde, TString& str
else
str = oldrec.key(key);
str.replace('~', ' ');
*/
str = oldrec.key(key);
if (tilde)
{
const RecDes& recd = oldrec.rec_des(); // Descrizione del record della testata
const KeyDes& kd = recd.Ky[key-1]; // Elenco dei campi della chiave
const int len = str.len();
for (int i = kd.NkFields-1; i >= 0; i--)
{
const int foc = kd.FromCh[i];
const int toc = kd.ToCh[i];
if ((foc < len && str[foc] > ' ') || (toc < len && str[toc] > ' '))
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = recd.Fd[nf];
if (rf.TypeF == _alfafld)
str.left_just(toc, '~');
break;
}
}
}
str.replace('~', ' ');
}
// @doc EXTERNAL
@ -1365,36 +1388,38 @@ void TCursor::filter(
TString kf(_keyfrom), kto(_keyto);
const bool filterchanged = (fil != NULL) && (_filter != fil);
switch (file().num())
{
case LF_TABGEN:
case LF_TABCOM:
case LF_TAB:
if (!real::is_natural(file().name())) // E' veramente una tabella o è un file normale?
{
// kf = kto = file().name();
const TString4 k = file().name();
kf.overwrite(k, 0);
kto.overwrite(k, 0);
};
break;
case LF_TABMOD:
if (!real::is_natural(file().name())) // E' veramente una tabella di modulo o è un file normale?
{
const TModule_table& t = (TModule_table&)file();
TString16 k;
k.format("%2s%6ld%3s", t.module(), t.customer(), t.name());
kf.overwrite(k, 0);
kto.overwrite(k, 0);
}
break;
default:
break;
}
if (from != NULL)
matildator(*from, _nkey, (tilde & 0x1) != 0, kf);
if (to != NULL)
matildator(*to, _nkey, (tilde & 0x2) != 0, kto);
if (kf[0] <= ' ' || kto[0] <= ' ')
{
switch (file().num())
{
case LF_TABGEN:
case LF_TABCOM:
case LF_TAB:
if (!real::is_natural(file().name())) // E' veramente una tabella o è un file normale?
{
kf.overwrite(file().name(), 0);
kto.overwrite(file().name(), 0);
};
break;
case LF_TABMOD:
if (!real::is_natural(file().name())) // E' veramente una tabella di modulo o è un file normale?
{
const TModule_table& t = (TModule_table&)file();
TString16 k;
k.format("%2s%6ld%3s", t.module(), t.customer(), t.name());
kf.overwrite(k, 0);
kto.overwrite(k, 0);
}
break;
default:
break;
}
}
if (filterchanged || (_keyfrom != kf) || (_keyto != kto))
{
@ -1552,7 +1577,10 @@ TRecnotype TCursor::read(TIsamop op, TReclock lockop)
match = curfile.curr().key(_nkey);
if (changed())
{
NFCHECK("Com'e' possibile che ci sia nuovamente bisogno di update?");
update();
}
if (err != NOERR)
{
@ -1650,23 +1678,22 @@ TCursor::~TCursor()
TRecnotype TCursor::readrec()
{
TRecnotype nrec = 0L;
TLocalisamfile& f = file();
if (_pos >= items())
{
file().setstatus(_iseof);
file().zero();
f.setstatus(_iseof);
f.zero();
return nrec;
}
file().setstatus(NOERR);
f.setstatus(NOERR);
if (_pos < _pagefirstpos || _pos >= _pagefirstpos + _cmaxelpage)
read_page(_pos / _cmaxelpage);
nrec = _page[_pos - _pagefirstpos];
CHECKD(nrec >= 0, "Bad record position ", nrec);
curr().setdirty();
file().readat(nrec);
curr().readat(f, nrec);
repos();
return nrec;
}

View File

@ -309,7 +309,7 @@ protected:
int filter_limit() const { return _filter_limit; }
void set_filter_limit(int l) { _filter_limit = l; }
bool call_filterfunction(const TRelation * r, TRecnotype recno) const;
bool call_filterfunction(TRecnotype recno) const;
// @access Public Member

View File

@ -167,7 +167,7 @@ int TModule_table::_read(TRectype& rec, word op, word lockop)
int TModule_table::_readat(TRectype& rec ,TRecnotype nrec, word lockop)
{
TBaseisamfile::_readat(rec, nrec, lockop);
CHECKS(in_table(), "Invalid position : Table ", (const char *)_tabname);
CHECKS(in_table(), "Invalid module table position in ", (const char *)_tabname);
return status();
}

View File

@ -364,14 +364,11 @@ TExtrectype::TExtrectype(const TTrec& r) : TVariable_rectype(r.num())
delete _rec;
_length = r.len();
_rec = new char [ _length ];
_rd = new RecDes;
memcpy(_rd, r.rec(),sizeof(RecDes));
_rd = r.rec();
if(has_memo())
init_memo(RECORD_NON_FISICO );
zero();
}
TExtrectype::~TExtrectype()
{
delete _rd;
}
{ }

View File

@ -217,10 +217,10 @@ public:
class TExtrectype : public TVariable_rectype
{
RecDes* _rd;
RecDes _rd;
protected: // TRectype
virtual RecDes* rec_des() const { return _rd; }
virtual const RecDes& rec_des() const { return _rd; }
virtual bool auto_virtual_fields() const { return TRUE; }
public: