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: }

Defined functions

opencatalog defined in line 7; used 1 times
Last modified: 1986-04-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 934
Valid CSS Valid XHTML 1.0 Strict