Modifiche per derivare i TVarrec dai TRectype.

git-svn-id: svn://10.65.10.50/trunk@3480 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1996-09-02 14:20:24 +00:00
parent 1c27eca32a
commit 4cb3dd15ae
2 changed files with 163 additions and 219 deletions

View File

@ -19,6 +19,7 @@
#include <utility.h> #include <utility.h>
#include <memo.h> #include <memo.h>
#include <codeb.h> #include <codeb.h>
#include <varrec.h>
#if XVT_OS==XVT_OS_WIN #if XVT_OS==XVT_OS_WIN
#include <process.h> #include <process.h>
@ -53,9 +54,6 @@ extern "C" {
HIDDEN char _isam_string[257]; HIDDEN char _isam_string[257];
HIDDEN void UNKNOWN_FIELD(int num, const char* name)
{ yesnofatal_box("Il campo '%s' non appartiene al file %d", name, num); }
#define NOALLOC (char **) -1 #define NOALLOC (char **) -1
HIDDEN bool __autoload = TRUE; HIDDEN bool __autoload = TRUE;
@ -350,7 +348,8 @@ HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode)
} }
if (err == _islocked) if (err == _islocked)
{ {
memcpy(record.string(),DB_getrecord(isfd->fhnd),DB_reclen(isfd->fhnd)); record = DB_getrecord(isfd->fhnd);
//memcpy(record.string(),DB_getrecord(isfd->fhnd),DB_reclen(isfd->fhnd));
CBuildKey(isfd->r, isfd->knum, record.string(), key, TRUE); CBuildKey(isfd->r, isfd->knum, record.string(), key, TRUE);
message_box("Codice %s in uso da parte\ndi un altro utente.", key); message_box("Codice %s in uso da parte\ndi un altro utente.", key);
} }
@ -361,8 +360,8 @@ HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode)
err=DB_unlock(isfd->fhnd); err=DB_unlock(isfd->fhnd);
if (err != NOERR) err=get_error(err); if (err != NOERR) err=get_error(err);
} }
record = DB_getrecord(isfd->fhnd);
memcpy(record.string(),DB_getrecord(isfd->fhnd),DB_reclen(isfd->fhnd)); //memcpy(record.string(),DB_getrecord(isfd->fhnd),DB_reclen(isfd->fhnd));
isfd->RecNo = DB_recno(isfd->fhnd); isfd->RecNo = DB_recno(isfd->fhnd);
return err; return err;
} }
@ -479,44 +478,24 @@ void TMemo_info::reset( )
_dirty.reset( ); _dirty.reset( );
} }
void TRectype::init_memo_info(const TRecnotype recnum )
{
if( _memoinfo )
{
_memoinfo->reset();
_memoinfo->recno( recnum);
// delete _memoinfo;
}
else
_memoinfo = new TMemo_info( this, recnum );
}
void TRectype::write_memo_info( isdef * def ) const
{
CHECK( _memoinfo, "Tentativo di registrare una TMemo_info vuota," );
_memoinfo->write_data( def );
}
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
// TExtrectype // TExtrectype
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
class TExtrectype : public TRectype class TExtrectype : public TVariable_rectype
{ {
RecDes* _rd; RecDes* _rd;
protected: // TRectype protected: // TRectype
virtual RecDes* rec_des() const { return _rd; } virtual RecDes* rec_des() const { return _rd; }
virtual bool auto_virtual_fields() const { return TRUE ; }
public: public:
// FPUB
TExtrectype(const TTrec& r); // Costruisce il record a partire da r TExtrectype(const TTrec& r); // Costruisce il record a partire da r
virtual ~TExtrectype() {} virtual ~TExtrectype() {}
}; };
TExtrectype::TExtrectype(const TTrec& r) : TRectype(r.num()) TExtrectype::TExtrectype(const TTrec& r) : TVariable_rectype(r.num())
{ {
delete _rec; delete _rec;
@ -524,7 +503,7 @@ TExtrectype::TExtrectype(const TTrec& r) : TRectype(r.num())
_rec = new char [ _length ]; _rec = new char [ _length ];
_rd = r.rec(); _rd = r.rec();
if( lf_has_memo(r)) if( lf_has_memo(r))
init_memo_info(RECORD_NON_FISICO ); init_memo(RECORD_NON_FISICO );
zero(); zero();
} }
@ -551,6 +530,7 @@ TBaseisamfile::TBaseisamfile(int logicnum, bool linkrecinst)
} }
else else
{ {
NFCHECK("linkrecinst sparira' quanto prima, poiche' non sicura");
_current = openrec[_logicnum - 1]; _current = openrec[_logicnum - 1];
_delrec = FALSE; _delrec = FALSE;
} }
@ -695,6 +675,15 @@ TRecnotype TBaseisamfile::eod() const
return(DB_reccount(_isamfile->fhnd)); return(DB_reccount(_isamfile->fhnd));
} }
void TBaseisamfile::set_curr(TRectype * curr)
{
CHECK(curr != NULL, "You must pass a valid record");
if (_current != NULL)
delete _current;
_current = curr;
}
void TBaseisamfile::setkey(int nkey) void TBaseisamfile::setkey(int nkey)
{ {
@ -723,8 +712,8 @@ int TBaseisamfile::first(word lockop)
_lasterr=cisread(_isamfile, curr(), _isfirst + lockop); _lasterr=cisread(_isamfile, curr(), _isfirst + 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( curr().has_memo( ) )
curr( ).init_memo_info(_recno); curr( ).init_memo(_recno);
return _lasterr; return _lasterr;
} }
@ -737,8 +726,8 @@ int TBaseisamfile::last(word lockop)
_lasterr=cisread(_isamfile, curr(), _islast + lockop ); _lasterr=cisread(_isamfile, curr(), _islast + 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( curr().has_memo( ) )
curr( ).init_memo_info(_recno); curr( ).init_memo(_recno);
return _lasterr; return _lasterr;
} }
@ -764,8 +753,8 @@ int TBaseisamfile::next(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( curr().has_memo( ) )
curr( ).init_memo_info(_recno ); curr( ).init_memo(_recno );
return _lasterr; return _lasterr;
} }
@ -796,8 +785,8 @@ int TBaseisamfile::prev(word lockop)
_lasterr=cisread(_isamfile, curr(), _isprev + lockop); _lasterr=cisread(_isamfile, curr(), _isprev + 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( curr().has_memo( ) )
curr( ).init_memo_info(_recno); curr( ).init_memo(_recno);
return _lasterr; return _lasterr;
} }
@ -818,8 +807,8 @@ int TBaseisamfile::reread(word lockop, TDate& atdate)
_lasterr=cisread(_isamfile, curr(), _iscurr + lockop); _lasterr=cisread(_isamfile, curr(), _iscurr + 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( curr().has_memo( ) )
curr( ).init_memo_info(_recno); curr( ).init_memo(_recno);
return _lasterr; return _lasterr;
} }
@ -832,8 +821,8 @@ int TBaseisamfile::reread(TRectype& rec, word lockop, TDate& atdate)
_lasterr=cisread(_isamfile, rec, _iscurr + lockop); _lasterr=cisread(_isamfile, rec, _iscurr + 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( rec.has_memo( ) )
rec.init_memo_info(_recno); rec.init_memo(_recno);
return _lasterr; return _lasterr;
} }
@ -867,8 +856,8 @@ int TBaseisamfile::skip(TRecnotype nrec, word lockop)
_lasterr=cisread(_isamfile,curr(),_iscurr + lockop); _lasterr=cisread(_isamfile,curr(),_iscurr + 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( curr().has_memo( ) )
curr( ).init_memo_info(_recno); curr( ).init_memo(_recno);
return _lasterr; return _lasterr;
} }
@ -882,8 +871,8 @@ int TBaseisamfile::read(word op, word lockop, TDate& atdate)
_lasterr=cisread(_isamfile, curr(), op + lockop); _lasterr=cisread(_isamfile, curr(), op + 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( curr().has_memo( ) )
curr( ).init_memo_info(_recno); curr( ).init_memo(_recno);
return _lasterr; return _lasterr;
} }
@ -897,8 +886,8 @@ int TBaseisamfile::read(TRectype& rec, word op, word lockop, TDate& atdate)
_lasterr=cisread(_isamfile, rec, op + lockop); _lasterr=cisread(_isamfile, rec, op + 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( rec.has_memo( ) )
rec.init_memo_info(_recno); rec.init_memo(_recno);
return _lasterr; return _lasterr;
} }
@ -912,10 +901,11 @@ int TBaseisamfile::readat(TRecnotype nrec, word lockop)
if (_lasterr != NOERR) if (_lasterr != NOERR)
_lasterr = get_error(_lasterr); _lasterr = get_error(_lasterr);
else else
memcpy(curr().string(),DB_getrecord(_isamfile->fhnd),DB_reclen(_isamfile->fhnd)); curr() = DB_getrecord(_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( curr().has_memo( ) )
curr( ).init_memo_info(_recno); curr( ).init_memo(_recno);
return _lasterr; return _lasterr;
} }
@ -928,10 +918,11 @@ int TBaseisamfile::readat(TRectype& rec, TRecnotype nrec, word lockop)
_lasterr=DB_go(_isamfile->fhnd,nrec); _lasterr=DB_go(_isamfile->fhnd,nrec);
if (_lasterr != NOERR) _lasterr = get_error(_lasterr); if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
else else
memcpy(rec.string(),DB_getrecord(_isamfile->fhnd),DB_reclen(_isamfile->fhnd)); rec = DB_getrecord(_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( rec.has_memo( ) )
rec.init_memo_info( _recno ); rec.init_memo( _recno );
return _lasterr; return _lasterr;
} }
@ -950,11 +941,8 @@ int TBaseisamfile::write(TDate& atdate)
if (_lasterr != NOERR) _lasterr = get_error(_lasterr); if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
setkey(oldkey); setkey(oldkey);
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
if( _lasterr == NOERR && has_memo( ) ) if( _lasterr == NOERR && curr().has_memo( ) )
{ curr( ).write_memo( _isamfile, _recno);
curr( ).memo_info( ).recno( _recno );
curr( ).write_memo_info( _isamfile);
}
return _lasterr; return _lasterr;
} }
@ -974,14 +962,8 @@ int TBaseisamfile::write(const TRectype& rec, TDate& atdate)
if (_lasterr != NOERR) _lasterr = get_error(_lasterr); if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
setkey(oldkey); setkey(oldkey);
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
if (_lasterr == NOERR ) if (_lasterr == NOERR && rec.has_memo( ) )
{ ((TRectype &) rec).write_memo( _isamfile, _recno );
if( has_memo( ) )
{
rec.memo_info( ).recno( _recno );
rec.write_memo_info( _isamfile );
}
}
return _lasterr; return _lasterr;
} }
@ -1002,11 +984,8 @@ int TBaseisamfile::rewrite(TDate& atdate)
_lasterr = DB_rewrite(_isamfile->fhnd); _lasterr = DB_rewrite(_isamfile->fhnd);
if (_lasterr != NOERR) _lasterr = get_error(_lasterr); if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
if( _lasterr == NOERR && has_memo( ) ) if( _lasterr == NOERR && curr().has_memo( ) )
{ curr( ).write_memo( _isamfile, _recno );
curr( ).memo_info( ).recno( _recno );
curr( ).write_memo_info( _isamfile );
}
} }
return _lasterr; return _lasterr;
} }
@ -1027,11 +1006,8 @@ int TBaseisamfile::rewrite(const TRectype& rec, TDate& atdate)
_lasterr = DB_rewrite(_isamfile->fhnd); _lasterr = DB_rewrite(_isamfile->fhnd);
if (_lasterr != NOERR) _lasterr = get_error(_lasterr); if (_lasterr != NOERR) _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
if( _lasterr == NOERR && has_memo( ) ) if( _lasterr == NOERR && rec.has_memo( ) )
{ ((TRectype &) rec).write_memo( _isamfile, _recno );
rec.memo_info( ).recno( _recno );
rec.write_memo_info( _isamfile );
}
} }
return _lasterr; return _lasterr;
} }
@ -1050,11 +1026,8 @@ int TBaseisamfile::rewriteat(TRecnotype nrec)
} else } else
_lasterr = get_error(_lasterr); _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
if( _lasterr == NOERR && has_memo( ) ) if( _lasterr == NOERR && curr().has_memo( ) )
{ curr( ).write_memo( _isamfile, _recno );
curr( ).memo_info( ).recno( _recno );
curr( ).write_memo_info( _isamfile );
}
return _lasterr; return _lasterr;
} }
@ -1071,11 +1044,8 @@ int TBaseisamfile::rewriteat(const TRectype& rec, TRecnotype nrec)
} else } else
_lasterr = get_error(_lasterr); _lasterr = get_error(_lasterr);
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
if( _lasterr == NOERR && has_memo( ) ) if( _lasterr == NOERR && rec.has_memo( ) )
{ ((TRectype &) rec).write_memo( _isamfile, _recno );
rec.memo_info( ).recno( _recno );
rec.write_memo_info( _isamfile );
}
return _lasterr; return _lasterr;
} }
@ -1086,26 +1056,6 @@ int TBaseisamfile::remove(TDate& atdate)
NOT_OPEN(); NOT_OPEN();
/*// rimozione campi memo
#ifndef FOXPRO
TMemo_file* memo = NULL;
for (int i = 0; i < curr().items(); i++)
{
if ( curr().type(curr().fieldname(i)) == _memofld )
{
long val = curr().get_long(curr().fieldname(i));
if (val > 0l)
{
if (memo == NULL)
memo = new TMemo_file(filename());
memo->remove_field(val);
}
}
}
if (memo != NULL) delete memo;
#endif
*/
if ((_lasterr=cisread(_isamfile, curr(), _isequal + _nolock)) == NOERR) if ((_lasterr=cisread(_isamfile, curr(), _isequal + _nolock)) == NOERR)
{ {
_lasterr = DB_delete(_isamfile->fhnd); // Put only deletion flag on record, must remove keys too! _lasterr = DB_delete(_isamfile->fhnd); // Put only deletion flag on record, must remove keys too!
@ -1121,7 +1071,7 @@ int TBaseisamfile::remove(TDate& atdate)
} }
} }
} }
if(_lasterr == NOERR && has_memo()) if(_lasterr == NOERR && curr().has_memo())
curr().memo_info().recno(RECORD_NON_FISICO); curr().memo_info().recno(RECORD_NON_FISICO);
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
@ -1151,7 +1101,7 @@ int TBaseisamfile::remove(const TRectype& rec, TDate& atdate)
} }
} }
if(_lasterr == NOERR && has_memo()) if(_lasterr == NOERR && curr().has_memo())
curr().memo_info().recno(RECORD_NON_FISICO); curr().memo_info().recno(RECORD_NON_FISICO);
_recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd);
@ -1935,11 +1885,8 @@ int TSystemisamfile::update(
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()) if ( err == NOERR && nrec.has_memo())
{ nrec.write_memo(i0, DB_recno(i0->fhnd));
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);
} }
@ -2023,7 +1970,7 @@ int TSystemisamfile::packfile(
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()) if (err == NOERR && curr().has_memo())
err = DB_packmemo(vis,d.name()); 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);
@ -2431,6 +2378,8 @@ TRectype::TRectype(int logicnum) : _cod(NULL)
} }
_rec = new char [ _length ]; _rec = new char [ _length ];
*_tab = '\0'; *_tab = '\0';
if( lf_has_memo( _logicnum ) )
init_memo(RECORD_NON_FISICO );
if (_length) if (_length)
zero(); zero();
else else
@ -2454,6 +2403,8 @@ TRectype::TRectype(const TBaseisamfile* i): _cod(NULL)
} }
*_tab = '\0'; *_tab = '\0';
_rec = new char [ _length ]; _rec = new char [ _length ];
if( lf_has_memo( _logicnum ) )
init_memo(RECORD_NON_FISICO );
if (_length) if (_length)
zero(); zero();
else else
@ -2488,6 +2439,29 @@ TRectype::~TRectype()
if (_memoinfo != NULL ) delete _memoinfo; if (_memoinfo != NULL ) delete _memoinfo;
} }
void TRectype::unknown_field(const char* name) const
{
yesnofatal_box("Il campo '%s' non appartiene al file %d", name, _logicnum);
}
void TRectype::write_memo(isdef * file, const TRecnotype recno)
{
CHECK( _memoinfo, "Tentativo di registrare una TMemo_info vuota," );
_memoinfo->recno(recno);
_memoinfo->write_data( file );
}
void TRectype::init_memo( const TRecnotype recno)
{
if( _memoinfo )
{
_memoinfo->reset();
_memoinfo->recno( recno);
}
else
_memoinfo = new TMemo_info( this, recno );
}
void TRectype::settab(const char *tab) void TRectype::settab(const char *tab)
{ {
if (_cod != NULL) if (_cod != NULL)
@ -2677,29 +2651,34 @@ const char* TRectype::fieldname(int i) const
return i >= 0 && i < rd->NFields ? rd->Fd[i].Name : NULL; return i >= 0 && i < rd->NFields ? rd->Fd[i].Name : NULL;
} }
const char* TRectype::get_str(const char* fieldname) const const TString& TRectype::get_str(const char* fieldname) const
{ {
char * s = _isam_string;
static TFixed_string tmp(_isam_string, sizeof(_isam_string));
RecDes* rd = rec_des(); RecDes* rd = rec_des();
if (CFieldType((char*) fieldname, rd) == _datefld) if (CFieldType((char*) fieldname, rd) == _datefld)
{ {
const TRecfield f((TRectype&)*this, fieldname); const TRecfield f((TRectype&)*this, fieldname);
strcpy(_isam_string, (const char*) f); tmp = f;
} }
else else
{ {
if (CGetFieldBuff((char*) fieldname, rd, _rec, _isam_string) == FIELDERR) if (CGetFieldBuff((char*) fieldname, rd, _rec, s) == FIELDERR)
UNKNOWN_FIELD(num(), fieldname); {
unknown_field(fieldname);
*s = '\0';
}
if (CFieldType((char*) fieldname,rd) == _boolfld) if (CFieldType((char*) fieldname,rd) == _boolfld)
{ {
if (toupper(*_isam_string) == 'T' || toupper(*_isam_string) == 'Y' if (toupper(*s) == 'T' || toupper(*s) == 'Y'
|| toupper(*_isam_string) == 'S' || toupper(*_isam_string) == 'X') || toupper(*s) == 'S' || toupper(*s) == 'X')
strcpy(_isam_string,"X"); strcpy(s,"X");
else else
strcpy(_isam_string," "); strcpy(s," ");
} }
} }
return _isam_string; return tmp;
} }
#ifndef FOXPRO #ifndef FOXPRO
@ -2718,34 +2697,26 @@ const TString& TRectype::get(const char* fieldname) const
int TRectype::get_int(const char* fieldname) const int TRectype::get_int(const char* fieldname) const
{ {
if (CGetFieldBuff((char*) fieldname, rec_des(), _rec, _isam_string) == FIELDERR) return atoi(get_str(fieldname));
UNKNOWN_FIELD(num(), fieldname);
return atoi(_isam_string);
} }
long TRectype::get_long(const char* fieldname) const long TRectype::get_long(const char* fieldname) const
{ {
if (CGetFieldBuff((char*) fieldname, rec_des(), _rec, _isam_string) == FIELDERR) return atol(get_str(fieldname));
UNKNOWN_FIELD(num(), fieldname);
return atol(_isam_string);
} }
word TRectype::get_word(const char* fieldname) const word TRectype::get_word(const char* fieldname) const
{ {
if (CGetFieldBuff((char*) fieldname, rec_des(), _rec, _isam_string) == FIELDERR) return (word)atoi(get_str(fieldname));
UNKNOWN_FIELD(num(), fieldname);
return (word)atoi(_isam_string);
} }
real TRectype::get_real(const char* fieldname) const real TRectype::get_real(const char* fieldname) const
{ {
if (CGetFieldBuff((char*) fieldname, rec_des(), _rec, _isam_string) == FIELDERR) real r(get_str(fieldname));
UNKNOWN_FIELD(num(), fieldname);
real r(_isam_string);
return r; return r;
} }
@ -2753,22 +2724,14 @@ real TRectype::get_real(const char* fieldname) const
char TRectype::get_char(const char* fieldname) const char TRectype::get_char(const char* fieldname) const
{ {
if (CGetFieldBuff((char*) fieldname, rec_des(), _rec, _isam_string) == FIELDERR) return *(get_str(fieldname));
UNKNOWN_FIELD(num(), fieldname);
return *_isam_string;
} }
bool TRectype::get_bool(const char* fieldname) const bool TRectype::get_bool(const char* fieldname) const
{ {
if (CGetFieldBuff((char*) fieldname, rec_des(), _rec, _isam_string) == FIELDERR) return *(get_str(fieldname)) == 'X';
UNKNOWN_FIELD(num(), fieldname);
if (toupper(*_isam_string) == 'T' || toupper(*_isam_string) == 'Y'
|| toupper(*_isam_string) == 'S' || toupper(*_isam_string) == 'X')
return TRUE;
else
return FALSE;
} }
// @doc EXTERNAL // @doc EXTERNAL
@ -2798,9 +2761,7 @@ bool TRectype::get_memo(
TDate TRectype::get_date(const char* fieldname) const TDate TRectype::get_date(const char* fieldname) const
{ {
if (CGetFieldBuff((char*) fieldname, rec_des(), _rec, _isam_string) == -1) TDate d(get_str(fieldname));
UNKNOWN_FIELD(num(), fieldname);
TDate d(_isam_string);
return d; return d;
} }
@ -2809,8 +2770,8 @@ TDate TRectype::get_date(const char* fieldname) const
void TRectype::put(const char* fieldname, int val) void TRectype::put(const char* fieldname, int val)
{ {
if (CPutField((char*) fieldname, rec_des(), &val, _rec) == FIELDERR) sprintf(_isam_string, "%d", val);
UNKNOWN_FIELD(num(), fieldname); put_str( fieldname, _isam_string);
setempty(FALSE); setempty(FALSE);
} }
@ -2818,8 +2779,8 @@ void TRectype::put(const char* fieldname, int val)
void TRectype::put(const char* fieldname, long val) void TRectype::put(const char* fieldname, long val)
{ {
if (CPutField((char*) fieldname, rec_des(), &val, _rec) == FIELDERR) sprintf(_isam_string, "%ld", val);
UNKNOWN_FIELD(num(), fieldname); put_str( fieldname, _isam_string);
setempty(FALSE); setempty(FALSE);
} }
@ -2833,10 +2794,9 @@ void TRectype::put(const char* fieldname, TTextfile& txt)
long id = memo.set_field(txt, isnew ? FIELDERR : val); long id = memo.set_field(txt, isnew ? FIELDERR : val);
if (isnew) val = id; if (isnew) val = id;
TString16 str; str << val;
sprintf(_isam_string, "%ld", val);
if (CPutFieldBuff((char*) fieldname, rec_des(), (char*)(const char*)str, _rec) == FIELDERR) put_str( fieldname, _isam_string);
UNKNOWN_FIELD(num(), fieldname);
setempty(FALSE); setempty(FALSE);
} }
@ -2844,22 +2804,20 @@ void TRectype::put(const char* fieldname, TTextfile& txt)
void TRectype::put(const char* fieldname, word val) void TRectype::put(const char* fieldname, word val)
{ {
if (CPutField((char*) fieldname, rec_des(), &val, _rec) == FIELDERR) sprintf(_isam_string, "%u", val);
UNKNOWN_FIELD(num(), fieldname); put_str( fieldname, _isam_string);
setempty(FALSE); setempty(FALSE);
} }
void TRectype::put(const char* fieldname, const real& val) void TRectype::put(const char* fieldname, const real& val)
{ {
if (CPutFieldBuff((char*) fieldname, rec_des(), (char*)(const char*)val.string(), _rec) == FIELDERR) put_str( fieldname, val.string());
UNKNOWN_FIELD(num(), fieldname);
setempty(FALSE); setempty(FALSE);
} }
void TRectype::put(const char* fieldname, const TDate& val) void TRectype::put(const char* fieldname, const TDate& val)
{ {
TRecfield f(*this, fieldname); put_str(fieldname,val.string(full));
f = val.string(full);
setempty(FALSE); setempty(FALSE);
} }
@ -2868,8 +2826,7 @@ void TRectype::put(const char* fieldname, char val)
{ {
char w[2] = {val, '\0'}; char w[2] = {val, '\0'};
if (CPutFieldBuff((char*) fieldname, rec_des(), w, _rec) == FIELDERR) put_str( fieldname, w);
UNKNOWN_FIELD(num(), fieldname);
setempty(FALSE); setempty(FALSE);
} }
@ -2878,15 +2835,14 @@ void TRectype::put(const char* fieldname, bool val)
{ {
char s[2] = { val ? 'T' : 'F', '\0'}; char s[2] = { val ? 'T' : 'F', '\0'};
if (CPutFieldBuff((char*) fieldname, rec_des(), s, _rec) == FIELDERR) put_str( fieldname, s);
UNKNOWN_FIELD(num(), fieldname);
setempty(FALSE); setempty(FALSE);
} }
#endif // FOXPRO #endif // FOXPRO
void TRectype::put(const char* fieldname, const char* val) void TRectype::put_str(const char* fieldname, const char* val)
{ {
const TFieldtypes ft = (TFieldtypes)CFieldType((char*) fieldname, rec_des()); const TFieldtypes ft = (TFieldtypes)CFieldType((char*) fieldname, rec_des());
@ -2917,7 +2873,7 @@ void TRectype::put(const char* fieldname, const char* val)
else else
{ {
if (CPutFieldBuff((char*) fieldname, rec_des(), (char*)val, _rec) == FIELDERR) if (CPutFieldBuff((char*) fieldname, rec_des(), (char*)val, _rec) == FIELDERR)
UNKNOWN_FIELD(num(), fieldname); unknown_field(fieldname);
} }
setempty(FALSE); setempty(FALSE);
} }
@ -2937,20 +2893,12 @@ void TRectype::zero(const char* fieldname)
} }
else else
if (CZeroField((char*) fieldname, rec_des(), _rec) == FIELDERR) if (CZeroField((char*) fieldname, rec_des(), _rec) == FIELDERR)
UNKNOWN_FIELD(num(), fieldname); unknown_field(fieldname);
} }
if( lf_has_memo( _logicnum ) ) if( lf_has_memo( _logicnum ) )
init_memo_info(RECORD_NON_FISICO ); init_memo(RECORD_NON_FISICO );
} }
void TRectype::zero()
{
zero('\0');
}
void TRectype::zero(char c) void TRectype::zero(char c)
{ {
@ -2961,7 +2909,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( RECORD_NON_FISICO );
setempty(TRUE); setempty(TRUE);
} }
@ -2993,7 +2941,6 @@ TRectype& TRectype::operator =(const TRectype& rec)
return *this; return *this;
} }
// Certified 100% // Certified 100%
TRectype& TRectype::operator =(const TBaseisamfile& f) TRectype& TRectype::operator =(const TBaseisamfile& f)
{ {

View File

@ -150,18 +150,24 @@ class TRectype : public TSortable
// @access Protected Member // @access Protected Member
protected: // TObject protected: // TObject
// @cmember Segnalazione di un campo inesistente
virtual void unknown_field(const char* name) const;
// @cmember Compara due tipo di record del file (vedi <c TSortable>) // @cmember Compara due tipo di record del file (vedi <c TSortable>)
virtual int compare(const TSortable& s) const; virtual int compare(const TSortable& s) const;
// @cmember Ritorna il nome dell'ultimo campo chiave identificato da <p key> // @cmember Ritorna il nome dell'ultimo campo chiave identificato da <p key>
const char* last_key_field(int key) const; const char* last_key_field(int key) const;
// @cmember Ritorna il contenuto del campo <p nf>-esimo
protected:
// @cmember Ritorna il contenuto del campo <p nf>-esimo
const char* start(int nf) const; const char* start(int nf) const;
// @cmember Permette di settare il valore di <p _isempty> // @cmember Permette di settare il valore di <p _isempty>
void setempty(bool val) void setempty(bool val)
{ _isempty = val;} { _isempty = val;}
// @cmember Ritorna il contenuto del campo <p fieldname> (non tipizzata)
virtual const TString& get_str(const char* fieldname) const;
// @cmember Setta il contenuto del campo <p fieldname> al valore <p val> (non tipizzata)
virtual void put_str(const char* fieldname, const char* val);
// @cmember Ritorna il contenuto del campo <p nf>-esimo
// @access Public Member // @access Public Member
public: // TObject public: // TObject
// @cmember Duplica il tipo di record // @cmember Duplica il tipo di record
@ -179,9 +185,6 @@ public: // TObject
virtual int remove(TBaseisamfile& f) const; virtual int remove(TBaseisamfile& f) const;
// @cmember Cambia il campo <p field> della chiave principale con il valore <p val> // @cmember Cambia il campo <p field> della chiave principale con il valore <p val>
virtual void renum_key(const char* field, const char* val); virtual void renum_key(const char* field, const char* val);
// @access Public Member
public:
// @cmember Ritorna il numero di campi del record // @cmember Ritorna il numero di campi del record
int items() const; int items() const;
// @cmember Setta il record come non suoto (chiama <mf TRectype::setempty> // @cmember Setta il record come non suoto (chiama <mf TRectype::setempty>
@ -206,13 +209,13 @@ public:
int len() const int len() const
{ return _length;} { return _length;}
// @cmember Ritorna il tipo del campo <p fieldname> // @cmember Ritorna il tipo del campo <p fieldname>
TFieldtypes type(const char* fieldname) const; virtual TFieldtypes type(const char* fieldname) const;
// @cmember Ritorna la lunghezza del campo <p fieldname> // @cmember Ritorna la lunghezza del campo <p fieldname>
int length(const char* fieldname) const; virtual int length(const char* fieldname) const;
// @cmember Ritorna numero di decimali del campo <p fieldname> // @cmember Ritorna numero di decimali del campo <p fieldname>
int ndec(const char* fieldname) const; virtual int ndec(const char* fieldname) const;
// @cmember Indica se esiste il campo <p fieldname> // @cmember Indica se esiste il campo <p fieldname>
bool exist(const char* fieldname) const; virtual bool exist(const char* fieldname) const;
// @cmember Ritorna il nome del campo <p i>-esimo // @cmember Ritorna il nome del campo <p i>-esimo
const char* fieldname(int i) const; const char* fieldname(int i) const;
@ -224,8 +227,6 @@ public:
bool same_key(const TRectype& rec, int key = 1, int skip_last = 0) const bool same_key(const TRectype& rec, int key = 1, int skip_last = 0) const
{ return compare_key(rec, key, skip_last) == 0; } { return compare_key(rec, key, skip_last) == 0; }
// @cmember Ritorna il contenuto del campo <p fieldname> (non tipizzata)
const char* get_str(const char* fieldname) const ;
#ifndef FOXPRO #ifndef FOXPRO
// @cmember Ritorna il reference al contenuto del campo <p fieldname> // @cmember Ritorna il reference al contenuto del campo <p fieldname>
const TString& get(const char* fieldname) const ; const TString& get(const char* fieldname) const ;
@ -264,27 +265,23 @@ public:
void put(const char* fieldname, const real& val); void put(const char* fieldname, const real& val);
// @cmember Setta il contenuto del campo <p fieldname> in formato memo // @cmember Setta il contenuto del campo <p fieldname> in formato memo
void put(const char* fieldname, TTextfile& txt); void put(const char* fieldname, TTextfile& txt);
// @cmember Setta il contenuto del campo <p fieldname> (non tipizzata)
void put(const char* fieldname, const char* val) { put_str(fieldname, val); }
#endif #endif
// @cmember Setta il contenuto del campo <p fieldname> (non tipizzata)
void put(const char* fieldname, const char* val);
// void put(const char* fieldname, TString& val);
// @cmember Vuota il campo puntato da <p fieldname> // @cmember Vuota il campo puntato da <p fieldname>
void zero(const char * fieldname); virtual void zero(const char * fieldname);
// @cmember Vuota tutto il record
void zero();
// @cmember Vuota tutto il record usando il carattere <p c> // @cmember Vuota tutto il record usando il carattere <p c>
void zero(char c); virtual void zero(char c = '\0');
// @cmember Riempie il campo <p fieldname> di spazi // @cmember Riempie il campo <p fieldname> di spazi
void blank(const char * fieldname) void blank(const char * fieldname)
{ put(fieldname, " "); } { put(fieldname, " "); }
// @cmember Assegnazione tra TRectype // @cmember Assegnazione tra TRectype
TRectype& operator =(const TRectype& rec); virtual TRectype& operator =(const TRectype& rec);
// @cmember Assegnazione tra TRectype // @cmember Assegnazione tra TRectype
TRectype& operator =(const char* rec); virtual TRectype& operator =(const char* rec);
// @cmember Assegnazione tra TRectype // @cmember Assegnazione tra TRectype
TRectype& operator =(const TBaseisamfile& f); TRectype& operator =(const TBaseisamfile& f);
@ -305,6 +302,17 @@ public:
bool ok() const bool ok() const
{ return _rec != NULL; } { return _rec != NULL; }
// @cmember Inizializza la struttura di <c TMemo_info>
void init_memo(const TRecnotype recno = RECORD_NON_FISICO );
// @cmember Scrive le informazioni contenute in <c TMemo_info>
void write_memo(isdef * file, const TRecnotype recno );
// @cmember Ritorna il refernce alla <c TMemo_info>
TMemo_info& memo_info( ) const
{ CHECK( _memoinfo, "Tentativo di accesso ad una memoinfo vuota!" ); return *_memoinfo; }
// @cmember Indica se il record possiede un campo memo
bool has_memo() const
{ return _memoinfo != NULL; }
// @cmember Costruttore Costruisce un record staccato da un file. // @cmember Costruttore Costruisce un record staccato da un file.
// Sarebbe meglio utilizzare una delle altre due // Sarebbe meglio utilizzare una delle altre due
TRectype(int logicnum); TRectype(int logicnum);
@ -314,20 +322,7 @@ public:
TRectype(const TRectype& r); TRectype(const TRectype& r);
// @cmember Distruttore // @cmember Distruttore
virtual ~TRectype(); virtual ~TRectype();
// @cmember Inizializza la struttura di <c TMemo_info>
void init_memo_info(const TRecnotype recnum );
// @cmember Ritora il refernce alla <c TMemo_info>
TMemo_info& memo_info( ) const
{ CHECK( _memoinfo, "Tentativo di accesso ad una memoinfo vuota!" ); return *_memoinfo; }
// @cmember Scrive le iunformazioni contenute in <c TMemo_info>
void write_memo_info( isdef * def ) const;
// @cmember Indica se il record possiede un campo memo
bool has_memo() const
{ return _memoinfo != NULL; }
}; };
// @doc EXTERNAL // @doc EXTERNAL
@ -416,6 +411,8 @@ protected:
// @access Public Member // @access Public Member
public: public:
// @cmember Sostituisce il record corrente del file
void set_curr(TRectype * curr);
// @cmember Attiva la chiave <p nkey> sul file aperto // @cmember Attiva la chiave <p nkey> sul file aperto
void setkey(int nkey); void setkey(int nkey);
// @cmember Ritorna la chiave attiva sul file aperto // @cmember Ritorna la chiave attiva sul file aperto
@ -575,9 +572,9 @@ public:
void put(const char* fieldname, TTextfile& txt) void put(const char* fieldname, TTextfile& txt)
{ curr().put(fieldname, txt); } { curr().put(fieldname, txt); }
#else #else
// @cmember Ritorna una strinag con il contenuto del campo <p fieldname> // @cmember Ritorna una stringa con il contenuto del campo <p fieldname>
const char* get_str(const char* fieldname) const const char* get_str(const char* fieldname) const
{ return curr().get_str(fieldname);} { return (const char *) curr().get_str(fieldname);}
#endif #endif
// @cmember Setta il contenuto del campo <p filedname> (non tipizzata) // @cmember Setta il contenuto del campo <p filedname> (non tipizzata)