84ecc65375
git-svn-id: svn://10.65.10.50/trunk@59 c028cbd2-c16b-5b4b-a496-9718f37d4682
332 lines
6.4 KiB
C++
Executable File
332 lines
6.4 KiB
C++
Executable File
#include <checks.h>
|
|
|
|
#define __TABUTIL_CPP
|
|
#include <tabutil.h>
|
|
#include <extcdecl.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)
|
|
{
|
|
if ((*tabname == '%') || (*tabname == '#')) tabname++;
|
|
_tabname = tabname;
|
|
_tabname.upper();
|
|
settab(TRUE);
|
|
}
|
|
|
|
|
|
int TTable::first(word lockop)
|
|
|
|
{
|
|
TRecfield codtab(curr(), "CODTAB");
|
|
|
|
curr().zero();
|
|
codtab = _tabname;
|
|
TBaseisamfile::read(_isgteq, lockop);
|
|
const char *c = (const char *) codtab;
|
|
if (good())
|
|
if (strncmp(_tabname, c, 3) != 0) setstatus(_isemptyfile);
|
|
if (bad()) curr().zero();
|
|
else
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::last(word lockop)
|
|
|
|
{
|
|
TRecfield codtab(curr(), "CODTAB");
|
|
|
|
curr().zero();
|
|
codtab = format("%s%c", (const char*) _tabname, 0xFF);
|
|
TBaseisamfile::read(_isgteq);
|
|
if (!eof()) TBaseisamfile::prev(lockop);
|
|
else setstatus(NOERR);
|
|
const char *c = (const char *) codtab;
|
|
if (good())
|
|
if (strncmp(_tabname, c, 3) != 0) setstatus(_isemptyfile);
|
|
if (bad()) curr().zero();
|
|
else
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::next(word lockop)
|
|
|
|
{
|
|
TRecfield codtab(curr(), "CODTAB");
|
|
|
|
read();
|
|
if (bad()) return status();
|
|
|
|
TRecnotype nrec = recno();
|
|
|
|
TBaseisamfile::next(lockop);
|
|
const char *c = (const char *) codtab;
|
|
if (strncmp(_tabname, c, 3) != 0)
|
|
{
|
|
if (lockop == _lock) TBaseisamfile::reread(_unlock);
|
|
TBaseisamfile::readat(nrec, lockop);
|
|
setstatus(_iseof);
|
|
}
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::prev(word lockop)
|
|
|
|
{
|
|
TRecfield codtab(curr(), "CODTAB");
|
|
|
|
read();
|
|
if (bad()) return status();
|
|
|
|
TRecnotype nrec = recno();
|
|
|
|
TBaseisamfile::prev(lockop);
|
|
const char *c = (const char *) codtab;
|
|
if (strncmp(_tabname, c, 3) != 0)
|
|
{
|
|
if (lockop == _lock) TBaseisamfile::reread(_unlock);
|
|
TBaseisamfile::readat(nrec, lockop);
|
|
setstatus(_isbof);
|
|
}
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::reread(word lockop, TDate&)
|
|
|
|
{
|
|
TRecfield codtab(curr(), "CODTAB");
|
|
|
|
TFixed_string s((const char*) codtab, 80);
|
|
|
|
s.insert(_tabname, 0);
|
|
codtab = s;
|
|
TBaseisamfile::reread(lockop);
|
|
const char *c = (const char *) codtab;
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::reread(TRectype& rec, word lockop, TDate&)
|
|
|
|
{
|
|
TRecfield codtab(rec, "CODTAB");
|
|
TFixed_string s((const char*) codtab, 80);
|
|
|
|
s.insert(_tabname, 0);
|
|
codtab = s;
|
|
TBaseisamfile::reread(rec, lockop);
|
|
const char *c = (const char *) codtab;
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::skip(TRecnotype nrec, word lockop)
|
|
|
|
{
|
|
TRecfield codtab(curr(), "CODTAB");
|
|
|
|
if (!nrec) return NOERR;
|
|
TBaseisamfile::skip(nrec, lockop);
|
|
const char *c = (const char *) codtab;
|
|
if (strncmp(_tabname, c, 3) != 0)
|
|
{
|
|
if (nrec > 0)
|
|
{
|
|
if (lockop == _lock) TBaseisamfile::reread(_unlock);
|
|
last(lockop);
|
|
setstatus(_iseof);
|
|
}
|
|
else
|
|
{
|
|
if (lockop == _lock) TBaseisamfile::reread(_unlock);
|
|
first(lockop);
|
|
setstatus(_isbof);
|
|
}
|
|
}
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::read(word op, word lockop, TDate&)
|
|
|
|
{
|
|
TRecfield codtab(curr(), "CODTAB");
|
|
|
|
CHECKD(op >= _iscurr && op <= _isgteq, "Invalid read operation : ", op);
|
|
TFixed_string s((const char*) codtab, 80);
|
|
s.insert(_tabname, 0);
|
|
codtab = s;
|
|
TBaseisamfile::read(op, lockop);
|
|
const char *c = (const char *) codtab;
|
|
if (good() && strncmp(_tabname, c, 3) != 0)
|
|
{
|
|
if (lockop == _lock) TBaseisamfile::reread(_unlock);
|
|
last(lockop);
|
|
setstatus(_iseof);
|
|
}
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::read(TRectype& rec, word op, word lockop, TDate&)
|
|
|
|
{
|
|
TRecfield codtab(rec, "CODTAB");
|
|
|
|
CHECKD(op >= _iscurr && op <= _isgteq, "Invalid read operation : ", op);
|
|
TFixed_string s((const char*) codtab, 80);
|
|
|
|
s.insert(_tabname, 0);
|
|
codtab = s;
|
|
TBaseisamfile::read(rec, op, lockop);
|
|
const char *c = (const char *) codtab;
|
|
if (good() && strncmp(_tabname, c, 3) != 0)
|
|
{
|
|
setstatus(_iseof);
|
|
if (lockop == _lock) TBaseisamfile::reread(_unlock);
|
|
last(lockop);
|
|
}
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::readat(TRecnotype nrec, word lockop)
|
|
|
|
{
|
|
TRecfield codtab(curr(), "CODTAB");
|
|
TBaseisamfile::readat(nrec, lockop);
|
|
TFixed_string s((const char*) codtab);
|
|
|
|
CHECKS(_tabname == s.left(3), "Invalid position : Table ", (const char *)_tabname);
|
|
codtab = &s[3];
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::readat(TRectype& rec ,TRecnotype nrec, word lockop)
|
|
|
|
{
|
|
TRecfield codtab(rec, "CODTAB");
|
|
TBaseisamfile::readat(rec, nrec, lockop);
|
|
TFixed_string s((const char*) codtab);
|
|
|
|
CHECKS(_tabname == s.left(3), "Invalid position : Table ", (const char*)_tabname);
|
|
codtab = &s[3];
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::write(TDate&)
|
|
|
|
{
|
|
TRecfield codtab(curr(), "CODTAB");
|
|
TFixed_string s((const char*) codtab, 80);
|
|
|
|
s.insert(_tabname, 0);
|
|
codtab = s;
|
|
TBaseisamfile::write();
|
|
const char *c = (const char *) codtab;
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::write(const TRectype& rec, TDate&)
|
|
|
|
{
|
|
TRecfield codtab((TRectype&)rec, "CODTAB");
|
|
TFixed_string s((const char*) codtab, 80);
|
|
|
|
s.insert(_tabname, 0);
|
|
codtab = s;
|
|
TBaseisamfile::write(rec);
|
|
const char *c = (const char *) codtab;
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::rewrite(TDate&)
|
|
|
|
{
|
|
TRecfield codtab(curr(), "CODTAB");
|
|
TFixed_string s((const char*) codtab, 80);
|
|
|
|
s.insert(_tabname, 0);
|
|
codtab = s;
|
|
TBaseisamfile::rewrite();
|
|
const char *c = (const char *) codtab;
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::rewrite(const TRectype& rec, TDate&)
|
|
|
|
{
|
|
TRecfield codtab((TRectype&)rec, "CODTAB");
|
|
TFixed_string s((const char*) codtab, 80);
|
|
|
|
s.insert(_tabname, 0);
|
|
codtab = s;
|
|
TBaseisamfile::rewrite(rec);
|
|
const char *c = (const char *) codtab;
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::remove(TDate&)
|
|
|
|
{
|
|
TRecfield codtab(curr(), "CODTAB");
|
|
TFixed_string s((const char*) codtab, 80);
|
|
|
|
s.insert(_tabname, 0);
|
|
codtab = s;
|
|
TBaseisamfile::remove();
|
|
const char *c = (const char *) codtab;
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|
|
int TTable::remove(const TRectype& rec, TDate&)
|
|
|
|
{
|
|
TRecfield codtab((TRectype&)rec, "CODTAB");
|
|
TFixed_string s((const char*) codtab, 80);
|
|
|
|
s.insert(_tabname, 0);
|
|
codtab = s;
|
|
TBaseisamfile::remove(rec);
|
|
const char *c = (const char *) codtab;
|
|
codtab = c + 3;
|
|
return status();
|
|
}
|
|
|
|
|