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();
 | 
						|
}
 | 
						|
 | 
						|
 |