diff --git a/include/cfiles.c b/include/cfiles.c index efe7fdb92..dff04a15c 100755 --- a/include/cfiles.c +++ b/include/cfiles.c @@ -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 diff --git a/include/cfiles.h b/include/cfiles.h index bfc484371..73055c90a 100755 --- a/include/cfiles.h +++ b/include/cfiles.h @@ -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 */ diff --git a/include/codeb.c b/include/codeb.c index c90245db9..2522edb65 100755 --- a/include/codeb.c +++ b/include/codeb.c @@ -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; diff --git a/include/codeb.h b/include/codeb.h index 8f5ad979e..bb208c5c6 100755 --- a/include/codeb.h +++ b/include/codeb.h @@ -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); diff --git a/include/extcdecl.h b/include/extcdecl.h index b8fc17757..ca5d51dca 100755 --- a/include/extcdecl.h +++ b/include/extcdecl.h @@ -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 *); diff --git a/include/files.cpp b/include/files.cpp index 9bd05d5fe..69fe99f22 100755 --- a/include/files.cpp +++ b/include/files.cpp @@ -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; iKy[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; nFd[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'); diff --git a/include/files.h b/include/files.h index 573e54035..0b5b7fd3d 100755 --- a/include/files.h +++ b/include/files.h @@ -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

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

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(); diff --git a/include/isam.cpp b/include/isam.cpp index 798dd95ad..5fa524710 100755 --- a/include/isam.cpp +++ b/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 { - 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 { - 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; } } diff --git a/include/isam.h b/include/isam.h index 2f26b919b..499dddbc9 100755 --- a/include/isam.h +++ b/include/isam.h @@ -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;} diff --git a/include/maskfld.cpp b/include/maskfld.cpp index 71b98d37f..9968969dc 100755 --- a/include/maskfld.cpp +++ b/include/maskfld.cpp @@ -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); diff --git a/include/multirec.cpp b/include/multirec.cpp index a522c7556..fdf8616b3 100755 --- a/include/multirec.cpp +++ b/include/multirec.cpp @@ -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); } diff --git a/include/prefix.cpp b/include/prefix.cpp index 563016e93..77eb611e9 100755 --- a/include/prefix.cpp +++ b/include/prefix.cpp @@ -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) diff --git a/include/progind.cpp b/include/progind.cpp index bc0756360..0a523090d 100755 --- a/include/progind.cpp +++ b/include/progind.cpp @@ -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() diff --git a/include/progind.h b/include/progind.h index 55a3141ad..2774ae7dc 100755 --- a/include/progind.h +++ b/include/progind.h @@ -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(); diff --git a/include/recarray.cpp b/include/recarray.cpp index 0dbcb7ce8..baba22edc 100755 --- a/include/recarray.cpp +++ b/include/recarray.cpp @@ -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); } diff --git a/include/relapp.cpp b/include/relapp.cpp index 714b9d1c6..5aa7b73fe 100755 --- a/include/relapp.cpp +++ b/include/relapp.cpp @@ -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); diff --git a/include/relation.cpp b/include/relation.cpp index ddb1cc69c..b198fff4f 100755 --- a/include/relation.cpp +++ b/include/relation.cpp @@ -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; } diff --git a/include/relation.h b/include/relation.h index 72d6b647a..3ddea7b69 100755 --- a/include/relation.h +++ b/include/relation.h @@ -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 diff --git a/include/tabmod.cpp b/include/tabmod.cpp index 4bdab864b..8dd3e2a30 100755 --- a/include/tabmod.cpp +++ b/include/tabmod.cpp @@ -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(); } diff --git a/include/varrec.cpp b/include/varrec.cpp index 5e660aee2..ef6e4d53c 100755 --- a/include/varrec.cpp +++ b/include/varrec.cpp @@ -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; -} +{ } diff --git a/include/varrec.h b/include/varrec.h index f40bf53e5..5d447a976 100755 --- a/include/varrec.h +++ b/include/varrec.h @@ -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: