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:
parent
5528812ec3
commit
cb69e4727a
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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 *);
|
||||
|
@ -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');
|
||||
|
@ -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();
|
||||
|
217
include/isam.cpp
217
include/isam.cpp
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
{ }
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user