#include #define __TABUTIL_CPP #include #include #include #include int TTable::name2log(const char* n) { return *n == '%' ? LF_TABCOM : (*n == '#' ? LF_TABGEN : LF_TAB); } TTable::TTable(const char* tabname, bool linkrecinst) : TLocalisamfile(name2log(tabname), linkrecinst), _cod(curr(), "COD") { if ((*tabname == '%') || (*tabname == '#')) tabname++; _tabname = tabname; _tabname.upper(); curr().settab(_tabname); _des_mod_loaded = FALSE; } TTable::~TTable() {} int TTable::first(word lockop) { zero(); TBaseisamfile::read(_isgteq, lockop); if (good()) if (_tabname != (const char *)_cod) setstatus(_isemptyfile); if (bad()) zero(); return status(); } int TTable::last(word lockop) { zero(); put("CODTAB", "\xFF"); TBaseisamfile::read(_isgteq); if (!eof()) TBaseisamfile::prev(lockop); else setstatus(NOERR); if (bof()) setstatus(NOERR); if (good()) if (_tabname != (const char *)_cod) setstatus(_isemptyfile); if (bad()) zero(); return status(); } int TTable::next(word lockop) { const TRecnotype nrec = recno(); /* if (nrec != filehnd()->RecNo) { read(); if (bad()) { if (status() == _iskeynotfound) setstatus(NOERR); return status(); } } */ TBaseisamfile::next(lockop); if (_tabname != (const char *)_cod) { if (lockop == _lock) TBaseisamfile::reread(_unlock); TBaseisamfile::readat(nrec, lockop); setstatus(_iseof); } return status(); } int TTable::prev(word lockop) { const TRecnotype nrec = recno(); /* if (nrec != filehnd()->RecNo) { read(); if (bad()) { if (status() == _iskeynotfound) setstatus(NOERR); return status(); } } */ TBaseisamfile::prev(lockop); if (_tabname != (const char *)_cod) { if (lockop == _lock) TBaseisamfile::reread(_unlock); TBaseisamfile::readat(nrec, lockop); setstatus(_isbof); } return status(); } int TTable::skip(TRecnotype nrec, word lockop) { if (!nrec) return NOERR; TBaseisamfile::skip(nrec, lockop); if (_tabname != (const char *)_cod) { if (nrec > 0) { if (lockop == _lock) TBaseisamfile::reread(_unlock); last(lockop); setstatus(_iseof); } else { if (lockop == _lock) TBaseisamfile::reread(_unlock); first(lockop); setstatus(_isbof); } } return status(); } int TTable::read(word op, word lockop, TDate&) { CHECKD(op >= _iscurr && op <= _isgteq, "Invalid read operation : ", op); TBaseisamfile::read(op, lockop); if (_tabname != (const char *)_cod) { if (lockop == _lock) TBaseisamfile::reread(_unlock); last(lockop); setstatus(_iseof); } return status(); } int TTable::read(TRectype& rec, word op, word lockop, TDate&) { CHECKD(op >= _iscurr && op <= _isgteq, "Invalid read operation : ", op); TBaseisamfile::read(rec, op, lockop); if (_tabname != (const char *)_cod) { setstatus(_iseof); if (lockop == _lock) TBaseisamfile::reread(_unlock); last(lockop); } return status(); } int TTable::readat(TRecnotype nrec, word lockop) { TBaseisamfile::readat(nrec, lockop); CHECKS(_tabname == (const char * )_cod, "Invalid position : Table ", (const char *)_tabname); return status(); } int TTable::readat(TRectype& rec ,TRecnotype nrec, word lockop) { TBaseisamfile::readat(rec, nrec, lockop); CHECKS(_tabname == (const char *)_cod, "Invalid position : Table ", (const char *)_tabname); return status(); } void TTable::load_module_description() { // Setta il modulo al quale appartiene la tabella e la relativa descrizione. // Cerca prima in RECDESC il relativo file di descrizione: D.DES // Se il file esiste, se il paragrafo [TabDescr] esiste e se esiste la // variabile Module ne prende il valore. // Se non si verificano le suddette condizioni procede come segue: // cerca se esiste il file ??.MSK tramite la funzione list_files(), // ne estrae il module dai primi 2 caratteri e la descrizione dalla intestazione // della prima pagina. _des_mod_loaded = TRUE; TFilename n; n << "recdesc/d" << _tabname; n.ext("des"); n.lower(); if (fexist(n)) { TConfig des(n); _module = des.get("Module","TabDescr"); } n = "??tb"; n << _tabname; n.ext("msk"); n.lower(); TToken_string f; f.add(n); if (list_files(f) == 1) { n = f.get(0); if (!fexist(n)) n.overwrite("ba",0); if (fexist(n)) { if (_module.empty()) _module = n.left(2); TScanner m(n); bool ok = TRUE; while (ok) { const TString& l2 = m.line().left(2); if (l2.empty()) ok = FALSE; else if (l2 == "PA") break; } if (ok) { const int apicia = m.token().find('"')+1; const int apicic = m.token().find('"', apicia); _description = m.token().sub(apicia, apicic); } } else _module = "ba"; } else _module = "ba"; } const char* TTable::module() { if (!_des_mod_loaded) load_module_description(); return _module; } const char* TTable::description() { if (!_des_mod_loaded) load_module_description(); return _description; }