|
|
1.1 ! root 1: # include <ingres.h> ! 2: # include <aux.h> ! 3: # include <opsys.h> ! 4: # include <access.h> ! 5: # include <sccs.h> ! 6: ! 7: SCCSID(@(#)opencat.c 8.2 1/15/85) ! 8: ! 9: /* ! 10: ** OPENCATALOG -- open system catalog ! 11: ** ! 12: ** This routine opens a system catalog into a predetermined ! 13: ** cache. If the catalog is already open, it is not reopened. ! 14: ** ! 15: ** The 'Desxx' struct defines which relations may be opened ! 16: ** in this manner and is defined in .../source/aux.h. ! 17: ** ! 18: ** The relation should not be closed after use (except in ! 19: ** special cases); however, it should be noclose'd after use ! 20: ** if the number of tuples in the catalog may have changed. ! 21: ** ! 22: ** The Desxx structure has an alias field which ! 23: ** is the address of the 'Admin' structure cache which holds ! 24: ** the relation descriptor. Thus, an openr need never actually ! 25: ** occur. ! 26: ** ! 27: ** The actual desxx structure definition is in the file ! 28: ** ! 29: ** catalog_desc.c ! 30: ** ! 31: ** which defines which relations can be cached and if any ! 32: ** alias descriptors exist for the relations. That file ! 33: ** can be redefined to include various caching. ! 34: ** ! 35: ** ! 36: ** Parameters: ! 37: ** name -- the name of the relation to open. It must ! 38: ** match one of the names in the Desxx ! 39: ** structure. ! 40: ** mode -- just like 'mode' to openr. If zero, it ! 41: ** is opened read-only; if two, it is opened ! 42: ** read/write. In fact, the catalog is always ! 43: ** opened read/write, but the flags are set ! 44: ** right for concurrency to think that you are ! 45: ** using it as you have declared. ! 46: ** ! 47: ** Returns: ! 48: ** none ! 49: ** ! 50: ** Side Effects: ! 51: ** A relation is (may be) opened. ! 52: ** ! 53: ** Trace Flags: ! 54: ** none ! 55: */ ! 56: ! 57: opencatalog(name, mode) ! 58: char *name; ! 59: int mode; ! 60: { ! 61: int i; ! 62: register DESC *d; ! 63: register char *n; ! 64: register struct desxx *p; ! 65: extern struct desxx Desxx[]; ! 66: extern long CmOfiles; ! 67: ! 68: n = name; ! 69: ! 70: /* find out which descriptor it is */ ! 71: for (p = Desxx; p->cach_relname; p++) ! 72: if (sequal(n, p->cach_relname)) ! 73: break; ! 74: if (!p->cach_relname) ! 75: syserr("opencatalog: (%s)", n); ! 76: ! 77: d = p->cach_desc; ! 78: ! 79: /* if it's already open, just return */ ! 80: if (d->relopn) ! 81: { ! 82: clearkeys(d); ! 83: } ! 84: else ! 85: { ! 86: /* not open, open it */ ! 87: if (p->cach_alias) ! 88: { ! 89: acc_init(); ! 90: bmove((char *) p->cach_alias, (char *) d, sizeof (*d)); ! 91: } ! 92: else ! 93: { ! 94: if ((i = openr(d, OR_WRITE, n)) != 0) ! 95: syserr("opencatalog: openr(%s) %d", n, i); ! 96: } ! 97: ! 98: /* mark it as an open file */ ! 99: CmOfiles |= 1 << d->relfp; ! 100: } ! 101: ! 102: /* determine the mode to mark it as for concurrency */ ! 103: switch (mode) ! 104: { ! 105: case OR_READ: /* read only */ ! 106: d->relopn = abs(d->relopn); ! 107: break; ! 108: ! 109: case OR_WRITE: /* read-write */ ! 110: d->relopn = -abs(d->relopn); ! 111: break; ! 112: ! 113: default: ! 114: syserr("opencatalog(%s): mode %d", n, mode); ! 115: } ! 116: ! 117: return; ! 118: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.