#include #define __TABUTIL_CPP #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) { 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(); }