campo-sirio/include/tabutil.cpp
guy 2b38285053 mask.cpp Migliorata scelta sheet cui mandare Alt+
strings.cpp  Migliorata generazione nomi di file temporanei
tabutil.cpp  Aggiuornato uso della list_files
utility.cpp  Migliorata la list_files aggiungendo un parametro
utility.h    Cambiato prototipo della list_files


git-svn-id: svn://10.65.10.50/trunk@5342 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-10-09 13:31:51 +00:00

259 lines
5.2 KiB
C++
Executable File

#include <checks.h>
#define __TABUTIL_CPP
#include <tabutil.h>
#include <extcdecl.h>
#include <scanner.h>
#include <utility.h>
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<TAB_NAME>.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 ??<TAB_NAME>.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();
TString_array f;
if (list_files(n, f) == 1)
{
n = f.row(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;
}