Corretti campi memo e aggiunto pack dei file memo

git-svn-id: svn://10.65.10.50/trunk@2247 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1995-12-06 14:44:14 +00:00
parent ce29d53f19
commit f283eea0cb
2 changed files with 86 additions and 86 deletions

View File

@ -124,6 +124,21 @@ int get_error(int err)
return(NOERR); return(NOERR);
} }
HIDDEN bool lf_has_memo( const TTrec& r )
{
bool ret = FALSE;
int nfields = r.fields( );
for( int i = 0; i < nfields && !ret; i ++ )
{
TToken_string s( r.fielddef( i ) );
if ( s.get_int( 1 ) == _memofld )
ret = TRUE;
}
return ret;
}
HIDDEN bool lf_has_memo( const int lffile ) HIDDEN bool lf_has_memo( const int lffile )
{ {
TDir d; TDir d;
@ -372,21 +387,28 @@ void TMemo_info::put( const char * fieldname, const char * data )
_data.add( data, index ); _data.add( data, index );
} }
TMemo_info::TMemo_info( const int lfid, const TRecnotype recno ) TMemo_info::TMemo_info( const TRectype * owner, const TRecnotype recno )
{ : _owner(owner), _recno(recno)
_lfid = lfid; {
_recno = recno;
} }
TMemo_info::~TMemo_info( ) TMemo_info::~TMemo_info( )
{ {
}
RecDes * TMemo_info::rec_des( ) const
{
return _owner->rec_des() ;
}
int TMemo_info::num() const
{
return _owner->num() ;
} }
TString& TMemo_info::get( const char * fieldname ) TString& TMemo_info::get( const char * fieldname )
{ {
TLocalisamfile posfile( _lfid ); int index( findfld( rec_des( ), ( char * )fieldname ) );
int index( findfld( posfile.curr( ).rec_des( ), ( char * )( const char * )fieldname ) );
if ( _data.objptr( index ) ) if ( _data.objptr( index ) )
{ {
if( _dirty[ index ] ) if( _dirty[ index ] )
@ -394,6 +416,7 @@ TString& TMemo_info::get( const char * fieldname )
} }
if( _recno >= 0 ) if( _recno >= 0 )
{ {
TLocalisamfile posfile( num() );
isdef * def = posfile.filehnd( ); isdef * def = posfile.filehnd( );
DB_go( def->fhnd, _recno ); DB_go( def->fhnd, _recno );
_data.add( DB_memoptr( def->fhnd, fieldname ), index ); _data.add( DB_memoptr( def->fhnd, fieldname ), index );
@ -403,20 +426,8 @@ TString& TMemo_info::get( const char * fieldname )
return _data.row( index ); return _data.row( index );
} }
RecDes * TMemo_info::rec_des( ) const void TMemo_info::write_data( isdef * def )
{ {
const isdef* i = openf[ _lfid - 1 ];
CHECKD(i, "Can't use a record of closed file ", _lfid );
RecDes* r = i->r;
CHECKD(r, "Missing record description of file", _lfid );
return r;
}
void TMemo_info::write_data( )
{
TLocalisamfile posfile( _lfid );
isdef * def = posfile.filehnd( );
CHECK( _recno > 0, "Maiale! Non fare le GO con _recno < 0 " ); CHECK( _recno > 0, "Maiale! Non fare le GO con _recno < 0 " );
DB_go( def->fhnd, _recno ); DB_go( def->fhnd, _recno );
RecDes *r = rec_des( ); RecDes *r = rec_des( );
@ -427,14 +438,13 @@ void TMemo_info::write_data( )
bool TMemo_info::memo_loaded( const char * fieldname ) bool TMemo_info::memo_loaded( const char * fieldname )
{ {
TLocalisamfile posfile( _lfid ); int index( findfld( rec_des( ), ( char * )( const char * )fieldname ) );
int index( findfld( posfile.curr( ).rec_des( ), ( char * )( const char * )fieldname ) );
return ( _data.objptr( index ) != NULL ); return ( _data.objptr( index ) != NULL );
} }
TMemo_info::TMemo_info( TMemo_info& memoinfo ) TMemo_info::TMemo_info( const TRectype * owner, TMemo_info& memoinfo)
: _owner(owner)
{ {
_lfid = memoinfo._lfid;
_recno = memoinfo._recno; _recno = memoinfo._recno;
_data = memoinfo._data; _data = memoinfo._data;
_dirty = memoinfo._dirty; _dirty = memoinfo._dirty;
@ -446,17 +456,22 @@ void TMemo_info::reset( )
_dirty.reset( ); _dirty.reset( );
} }
void TRectype::init_memo_info( const int lf, const TRecnotype recnum ) void TRectype::init_memo_info(const TRecnotype recnum )
{ {
if( _memoinfo ) if( _memoinfo )
delete _memoinfo; {
_memoinfo = new TMemo_info( lf, recnum ); _memoinfo->reset();
_memoinfo->recno( recnum);
// delete _memoinfo;
}
else
_memoinfo = new TMemo_info( this, recnum );
} }
void TRectype::write_memo_info( ) const void TRectype::write_memo_info( isdef * def ) const
{ {
CHECK( _memoinfo, "Tentativo di registrare una TMemo_info vuota," ); CHECK( _memoinfo, "Tentativo di registrare una TMemo_info vuota," );
_memoinfo->write_data( ); _memoinfo->write_data( def );
} }
@ -485,6 +500,8 @@ TExtrectype::TExtrectype(const TTrec& r) : TRectype(6)
_length = r.len(); _length = r.len();
_rec = new char [ _length ]; _rec = new char [ _length ];
_rd = r.rec(); _rd = r.rec();
if( lf_has_memo(r))
init_memo_info(RECORD_NON_FISICO );
zero(); zero();
} }
@ -684,9 +701,7 @@ int TBaseisamfile::first(word lockop)
if (_lasterr != NOERR) _lasterr = get_error(_lasterr); if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo; _recno = _isamfile->RecNo;
if( has_memo( ) ) if( has_memo( ) )
{ curr( ).init_memo_info(_recno);
curr( ).init_memo_info( _logicnum, _recno );
}
return _lasterr; return _lasterr;
} }
@ -700,9 +715,7 @@ int TBaseisamfile::last(word lockop)
if (_lasterr != NOERR) _lasterr = get_error(_lasterr); if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo; _recno = _isamfile->RecNo;
if( has_memo( ) ) if( has_memo( ) )
{ curr( ).init_memo_info(_recno);
curr( ).init_memo_info( _logicnum, _recno );
}
return _lasterr; return _lasterr;
} }
@ -729,9 +742,7 @@ int TBaseisamfile::next(word lockop)
} }
_recno = _isamfile->RecNo; _recno = _isamfile->RecNo;
if( has_memo( ) ) if( has_memo( ) )
{ curr( ).init_memo_info(_recno );
curr( ).init_memo_info( _logicnum, _recno );
}
return _lasterr; return _lasterr;
} }
@ -763,9 +774,7 @@ int TBaseisamfile::prev(word lockop)
if (_lasterr != NOERR) _lasterr = get_error(_lasterr); if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo; _recno = _isamfile->RecNo;
if( has_memo( ) ) if( has_memo( ) )
{ curr( ).init_memo_info(_recno);
curr( ).init_memo_info( _logicnum, _recno );
}
return _lasterr; return _lasterr;
} }
@ -787,9 +796,7 @@ int TBaseisamfile::reread(word lockop, TDate& atdate)
if (_lasterr != NOERR) _lasterr = get_error(_lasterr); if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo; _recno = _isamfile->RecNo;
if( has_memo( ) ) if( has_memo( ) )
{ curr( ).init_memo_info(_recno);
curr( ).init_memo_info( _logicnum, _recno );
}
return _lasterr; return _lasterr;
} }
@ -803,9 +810,7 @@ int TBaseisamfile::reread(TRectype& rec, word lockop, TDate& atdate)
if (_lasterr != NOERR) _lasterr = get_error(_lasterr); if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo; _recno = _isamfile->RecNo;
if( has_memo( ) ) if( has_memo( ) )
{ rec.init_memo_info(_recno);
rec.init_memo_info( _logicnum, _recno );
}
return _lasterr; return _lasterr;
} }
@ -840,9 +845,7 @@ int TBaseisamfile::skip(TRecnotype nrec, word lockop)
} while (_lasterr ==_islocked); } while (_lasterr ==_islocked);
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
if( has_memo( ) ) if( has_memo( ) )
{ curr( ).init_memo_info(_recno);
curr( ).init_memo_info( _logicnum, _recno );
}
return _lasterr; return _lasterr;
} }
@ -857,9 +860,7 @@ int TBaseisamfile::read(word op, word lockop, TDate& atdate)
if (_lasterr != NOERR) _lasterr=get_error(_lasterr); if (_lasterr != NOERR) _lasterr=get_error(_lasterr);
_recno = _isamfile->RecNo; _recno = _isamfile->RecNo;
if( has_memo( ) ) if( has_memo( ) )
{ curr( ).init_memo_info(_recno);
curr( ).init_memo_info( _logicnum, _recno );
}
return _lasterr; return _lasterr;
} }
@ -874,9 +875,7 @@ int TBaseisamfile::read(TRectype& rec, word op, word lockop, TDate& atdate)
if (_lasterr != NOERR) _lasterr = get_error(_lasterr); if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo; _recno = _isamfile->RecNo;
if( has_memo( ) ) if( has_memo( ) )
{ rec.init_memo_info(_recno);
rec.init_memo_info( _logicnum, _recno );
}
return _lasterr; return _lasterr;
} }
@ -892,9 +891,7 @@ int TBaseisamfile::readat(TRecnotype nrec, word lockop)
memcpy(curr().string(),DB_getrecord(_isamfile->fhnd),DB_reclen(_isamfile->fhnd)); memcpy(curr().string(),DB_getrecord(_isamfile->fhnd),DB_reclen(_isamfile->fhnd));
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
if( has_memo( ) ) if( has_memo( ) )
{ curr( ).init_memo_info(_recno);
curr( ).init_memo_info( _logicnum, _recno );
}
return _lasterr; return _lasterr;
} }
@ -910,9 +907,7 @@ int TBaseisamfile::readat(TRectype& rec, TRecnotype nrec, word lockop)
memcpy(rec.string(),DB_getrecord(_isamfile->fhnd),DB_reclen(_isamfile->fhnd)); memcpy(rec.string(),DB_getrecord(_isamfile->fhnd),DB_reclen(_isamfile->fhnd));
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
if( has_memo( ) ) if( has_memo( ) )
{ rec.init_memo_info( _recno );
rec.init_memo_info( _logicnum, _recno );
}
return _lasterr; return _lasterr;
} }
@ -934,7 +929,7 @@ int TBaseisamfile::write(TDate& atdate)
if( has_memo( ) ) if( has_memo( ) )
{ {
curr( ).memo_info( ).recno( _recno ); curr( ).memo_info( ).recno( _recno );
curr( ).write_memo_info( ); curr( ).write_memo_info( _isamfile);
} }
return _lasterr; return _lasterr;
} }
@ -960,7 +955,7 @@ int TBaseisamfile::write(const TRectype& rec, TDate& atdate)
if( has_memo( ) ) if( has_memo( ) )
{ {
rec.memo_info( ).recno( _recno ); rec.memo_info( ).recno( _recno );
rec.write_memo_info( ); rec.write_memo_info( _isamfile );
} }
} }
return _lasterr; return _lasterr;
@ -986,7 +981,7 @@ int TBaseisamfile::rewrite(TDate& atdate)
if( has_memo( ) ) if( has_memo( ) )
{ {
curr( ).memo_info( ).recno( _recno ); curr( ).memo_info( ).recno( _recno );
curr( ).write_memo_info( ); curr( ).write_memo_info( _isamfile );
} }
} }
return _lasterr; return _lasterr;
@ -1011,7 +1006,7 @@ int TBaseisamfile::rewrite(const TRectype& rec, TDate& atdate)
if( has_memo( ) ) if( has_memo( ) )
{ {
rec.memo_info( ).recno( _recno ); rec.memo_info( ).recno( _recno );
rec.write_memo_info( ); rec.write_memo_info( _isamfile );
} }
} }
return _lasterr; return _lasterr;
@ -1034,7 +1029,7 @@ int TBaseisamfile::rewriteat(TRecnotype nrec)
if( has_memo( ) ) if( has_memo( ) )
{ {
curr( ).memo_info( ).recno( _recno ); curr( ).memo_info( ).recno( _recno );
curr( ).write_memo_info( ); curr( ).write_memo_info( _isamfile );
} }
return _lasterr; return _lasterr;
} }
@ -1055,7 +1050,7 @@ int TBaseisamfile::rewriteat(const TRectype& rec, TRecnotype nrec)
if( has_memo( ) ) if( has_memo( ) )
{ {
rec.memo_info( ).recno( _recno ); rec.memo_info( ).recno( _recno );
rec.write_memo_info( ); rec.write_memo_info( _isamfile );
} }
return _lasterr; return _lasterr;
} }
@ -1830,6 +1825,11 @@ int TSystemisamfile::update(TTrec& newrec, bool vis)
browse_null(nrec.string(),DB_reclen(i0->fhnd)); browse_null(nrec.string(),DB_reclen(i0->fhnd));
memcpy(DB_getrecord(i0->fhnd),nrec.string(),DB_reclen(i0->fhnd)); memcpy(DB_getrecord(i0->fhnd),nrec.string(),DB_reclen(i0->fhnd));
err=DB_add(i0->fhnd); err=DB_add(i0->fhnd);
if ( nrec.has_memo())
{
nrec.memo_info( ).recno( DB_recno(i0->fhnd) );
nrec.write_memo_info( i0);
}
if (err != NOERR) err=get_error(err); if (err != NOERR) err=get_error(err);
setstatus(err); setstatus(err);
} }
@ -1898,6 +1898,8 @@ int TSystemisamfile::packfile(bool vis)
d.get(num(),_nolock, (d.is_com()) ? _comdir : _nordir); d.get(num(),_nolock, (d.is_com()) ? _comdir : _nordir);
CHECKS(filehnd() == NULL, "Can't pack open file", (const char*)filename()); CHECKS(filehnd() == NULL, "Can't pack open file", (const char*)filename());
err=DB_packfile(vis,d.name(),d.eod()); err=DB_packfile(vis,d.name(),d.eod());
if (err == NOERR && has_memo())
err = DB_packmemo(vis,d.name());
if (err != NOERR) err = get_error(err); if (err != NOERR) err = get_error(err);
if (err != NOERR) error_box("Errore in compattamento dati.\nFile %d : %d", num(),err); if (err != NOERR) error_box("Errore in compattamento dati.\nFile %d : %d", num(),err);
setstatus(err); setstatus(err);
@ -2295,9 +2297,7 @@ TRectype::TRectype(const TRectype& r)
{ {
_logicnum = r._logicnum; _logicnum = r._logicnum;
if ( r._memoinfo ) if ( r._memoinfo )
{ _memoinfo = new TMemo_info( this, *r._memoinfo);
_memoinfo = new TMemo_info( *r._memoinfo );
}
else else
_memoinfo = NULL; _memoinfo = NULL;
_length = r.len(); _length = r.len();
@ -2751,9 +2751,7 @@ void TRectype::zero(const char* fieldname)
UNKNOWN_FIELD(num(), fieldname); UNKNOWN_FIELD(num(), fieldname);
} }
if( lf_has_memo( _logicnum ) ) if( lf_has_memo( _logicnum ) )
{ init_memo_info(RECORD_NON_FISICO );
init_memo_info( _logicnum, RECORD_NON_FISICO );
}
} }
@ -2774,9 +2772,7 @@ void TRectype::zero(char c)
*_cod = _tab; *_cod = _tab;
if( lf_has_memo( _logicnum ) ) if( lf_has_memo( _logicnum ) )
{ init_memo_info( RECORD_NON_FISICO );
init_memo_info( _logicnum, RECORD_NON_FISICO );
}
setempty(TRUE); setempty(TRUE);
} }

View File

@ -54,28 +54,31 @@ const int MAX_KEYS = 8;
// @END // @END
class TLocalisamfile; class TLocalisamfile;
class TRectype;
class TMemo_info : public TObject class TMemo_info : public TObject
{ {
protected:
TBit_array _dirty; TBit_array _dirty;
TString_array _data; TString_array _data;
int _lfid; TRecnotype _recno;
TRecnotype _recno; const TRectype * _owner;
protected:
RecDes * rec_des( ) const;
public: public:
TRecnotype recno( ){ return _recno; } TRecnotype recno( ) const { return _recno; }
int num() const ;
void recno( TRecnotype r ){ _recno = r; } void recno( TRecnotype r ){ _recno = r; }
RecDes * rec_des( ) const;
void put( const char * fieldname, const char * data ); void put( const char * fieldname, const char * data );
TString& get( const char * fieldname ); TString& get( const char * fieldname );
void write_data( ); void write_data( isdef * def );
bool memo_loaded( const char * fieldname ); bool memo_loaded( const char * fieldname );
void reset( ); void reset( );
TMemo_info( const int lfid, const TRecnotype recno ); TMemo_info( const TRectype * owner, const TRecnotype recno );
TMemo_info( TMemo_info& memoinfo ); TMemo_info( const TRectype * owner, TMemo_info& memoinfo);
virtual ~TMemo_info( ); virtual ~TMemo_info( );
}; };
@ -199,9 +202,10 @@ public:
virtual ~TRectype(); virtual ~TRectype();
void init_memo_info( const int lf, const TRecnotype recnum ); void init_memo_info(const TRecnotype recnum );
TMemo_info& memo_info( ) const { CHECK( _memoinfo, "Tentativo di accesso ad una memoinfo vuota!" ); return *_memoinfo; } TMemo_info& memo_info( ) const { CHECK( _memoinfo, "Tentativo di accesso ad una memoinfo vuota!" ); return *_memoinfo; }
void write_memo_info( ) const; void write_memo_info( isdef * def ) const;
bool has_memo() const { return _memoinfo != NULL; }
}; };