|
|
1.1 ! root 1: # include <ingres.h> ! 2: # include <aux.h> ! 3: # include <catalog.h> ! 4: # include <tree.h> ! 5: # include <symbol.h> ! 6: # include <access.h> ! 7: # include <func.h> ! 8: # include <pv.h> ! 9: # include <sccs.h> ! 10: # include <errors.h> ! 11: ! 12: SCCSID(@(#)display.c 8.3 2/8/85) ! 13: ! 14: /* ! 15: ** DISPLAY -- display query corresponding to view, permission, ! 16: ** or intgerity declaration ! 17: */ ! 18: ! 19: ! 20: ! 21: ! 22: extern short tTdbu[]; ! 23: extern int display(); ! 24: extern int null_fn(); ! 25: ! 26: struct fn_def DsplayFn = ! 27: { ! 28: "DISPLAY", ! 29: display, ! 30: null_fn, ! 31: null_fn, ! 32: NULL, ! 33: 0, ! 34: tTdbu, ! 35: 100, ! 36: 'Z', ! 37: 0 ! 38: }; ! 39: /* ! 40: ** DISPLAY -- display query ! 41: ** ! 42: ** Parameters: ! 43: ** pc -- number of args in pv ! 44: ** pv -- pv[i] == 4 for VIEW, 5 for PERMIT, 6 for INTEGRITY ! 45: ** where i % 2 == 0 ! 46: ** pv[i] -- relation names for which pv[i-1] is mode ! 47: ** where i%2==1 ! 48: ** ! 49: ** Returns: ! 50: ** 0 -- total success ! 51: ** err -- error number of last error ! 52: ** ! 53: ** Side Effects: ! 54: ** prints out definition of appropriate characteristic of relation ! 55: ** ! 56: ** Trace Flags: ! 57: ** 33, -1 ! 58: */ ! 59: ! 60: ! 61: display(pc, pv) ! 62: int pc; ! 63: PARM pv[]; ! 64: { ! 65: register int ac; ! 66: register PARM *av; ! 67: extern DESC Treedes; ! 68: register int i; ! 69: int err; ! 70: char err_array[PV_MAXPC]; ! 71: auto int mode; ! 72: ! 73: # ifdef xZTR1 ! 74: if (tTf(50, -1)) ! 75: { ! 76: printf("display: "); ! 77: prvect(pc, pv); ! 78: } ! 79: # endif ! 80: ! 81: err = 0; ! 82: if (pc % 2 != 0) ! 83: syserr("display: bad param count %d", pc); ! 84: opencatalog("tree", OR_READ); ! 85: ! 86: for (ac = 0, av = pv; ac < pc; av++, ac++) ! 87: { ! 88: mode = atoi(av->pv_val.pv_str); ! 89: av++; ! 90: err_array[ac++] = 0; ! 91: err_array[ac] = disp(av->pv_val.pv_str, mode); ! 92: } ! 93: for (ac = 0, av = pv; ac < pc; av++, ac++) ! 94: { ! 95: if (err_array[ac]) ! 96: err = error(DISPERRBASE + err_array[ac], (av->pv_val).pv_str, 0); ! 97: } ! 98: return (err); ! 99: } ! 100: /* ! 101: ** DISP -- display integrity, permit, or define query on a relation ! 102: ** ! 103: ** Finds a relation owned by the user or the DBA and passes ! 104: ** the name and owner to the appropritae routine depending on ! 105: ** mode. ! 106: ** ! 107: ** Parameters: ! 108: ** relation -- relation on which query is to be printed ! 109: ** mode -- the print mode: ! 110: ** 4 -- view ! 111: ** 5 -- permit ! 112: ** 6 -- integrity ! 113: ** ! 114: ** Returns: ! 115: ** 0 -- success ! 116: ** 1 -- no such relation, or none seeable by the user. ! 117: ** 3 -- VIEW mode and relation not a view ! 118: ** 4 -- PERMIT and no permissions on relation ! 119: ** 5 -- INTEGRITY mode and no integrity constraints ! 120: ** ! 121: ** Trace Flags: ! 122: ** 33, 8 ! 123: */ ! 124: ! 125: disp(relation, mode) ! 126: char *relation; ! 127: int mode; ! 128: { ! 129: DESC d; ! 130: register int i; ! 131: extern char *Resrel; ! 132: ! 133: # ifdef xZTR1 ! 134: if (tTf(50, 8)) ! 135: printf("disp: relation %s\n", relation); ! 136: # endif ! 137: ! 138: Resrel = relation; ! 139: i = openr(&d, OR_RELTID, relation); ! 140: if (i > 0) ! 141: return (1); ! 142: else if (i < 0) ! 143: syserr("disp: openr(%s) ret %d", relation, i); ! 144: switch (mode) ! 145: { ! 146: case 4: /* View query */ ! 147: if (d.reldum.relstat & S_VIEW) ! 148: pr_def(relation, d.reldum.relowner); ! 149: else ! 150: return (3); ! 151: break; ! 152: ! 153: case 5: ! 154: if (pr_prot(relation, &d)) ! 155: return (4); ! 156: break; ! 157: ! 158: case 6: ! 159: if (d.reldum.relstat & S_INTEG) ! 160: pr_integrity(relation, d.reldum.relowner); ! 161: else ! 162: return (5); ! 163: break; ! 164: ! 165: default: ! 166: syserr("disp: mode == %d", mode); ! 167: } ! 168: return (0); ! 169: } ! 170: /* ! 171: ** PR_DEF -- Print "define view" query of a view ! 172: ** ! 173: ** Parameters: ! 174: ** relation -- relation in question ! 175: ** owner -- relowner ! 176: ** ! 177: ** Returns: ! 178: ** none ! 179: ** ! 180: ** Side Effects: ! 181: ** reads a tree, clears range table ! 182: ** ! 183: ** Trace Flags: ! 184: ** 33, 9 ! 185: */ ! 186: ! 187: pr_def(relation, owner) ! 188: char *relation; ! 189: char *owner; ! 190: { ! 191: register QTREE *t; ! 192: QTREE *gettree(); ! 193: ! 194: # ifdef xZTR1 ! 195: if (tTf(50, 9)) ! 196: printf("pr_def(relation=\"%s\", owner=%s)\n", relation, owner); ! 197: # endif ! 198: ! 199: printf("View %s defined:\n\n", relation); ! 200: clrrange(); ! 201: ! 202: /* Treeid == 0 because views have only one definition */ ! 203: t = gettree(relation, owner, mdVIEW, 0,FALSE); ! 204: pr_range(); ! 205: printf("define view "); ! 206: pr_tree(t); ! 207: } ! 208: /* ! 209: ** PR_INTEGRITY -- print out integrity constraints on a relation ! 210: ** ! 211: ** Finds all integrity tuples for this unique relation, and ! 212: ** calls pr_int() to print a query from them. ! 213: ** ! 214: ** Parameters: ! 215: ** relid -- rel name ! 216: ** relowner -- 2 byte owner id ! 217: ** ! 218: ** Returns: ! 219: ** none ! 220: ** ! 221: ** Side Effects: ! 222: ** file activity, query printing ! 223: ** ! 224: ** Trace Flags: ! 225: ** 33, 9 ! 226: */ ! 227: ! 228: pr_integrity(relid, relowner) ! 229: char *relid; ! 230: char *relowner; ! 231: { ! 232: extern DESC Intdes; ! 233: TID hitid, lotid; ! 234: struct integrity key, tuple; ! 235: register int i; ! 236: ! 237: ! 238: # ifdef xZTR1 ! 239: if (tTf(50, 9)) ! 240: printf("pr_integrity(relid =%s, relowner=%s)\n", ! 241: relid, relowner); ! 242: # endif ! 243: ! 244: printf("Integrity constraints on %s are:\n\n", relid); ! 245: opencatalog("integrities", OR_READ); ! 246: ! 247: /* get integrities tuples for relid, relowner */ ! 248: clearkeys(&Intdes); ! 249: setkey(&Intdes, &key, relid, INTRELID); ! 250: setkey(&Intdes, &key, relowner, INTRELOWNER); ! 251: if (i = find(&Intdes, EXACTKEY, &lotid, &hitid, &key)) ! 252: syserr("pr_integrity: find %d", i); ! 253: for ( ; ; ) ! 254: { ! 255: if (i = get(&Intdes, &lotid, &hitid, &tuple, TRUE)) ! 256: break; ! 257: if (kcompare(&Intdes, &tuple, &key) == 0) ! 258: pr_int(&tuple, relid); ! 259: } ! 260: if (i != 1) ! 261: syserr("pr_integrity: get %d", i); ! 262: } ! 263: /* ! 264: ** PR_INT -- print an integrity definition given a integrities tuple ! 265: ** ! 266: ** Parameters: ! 267: ** i -- integrity tuple ! 268: ** ! 269: ** Returns: ! 270: ** none ! 271: ** ! 272: ** Side Effects: ! 273: ** prints a query ! 274: ** reads a tree ! 275: */ ! 276: ! 277: pr_int(i, relid) ! 278: register struct integrity *i; ! 279: char *relid; ! 280: { ! 281: register QTREE *t; ! 282: QTREE *gettree(); ! 283: ! 284: clrrange(); ! 285: t = gettree(i->intrelid, i->intrelowner, mdINTEG, i->inttree); ! 286: printf("Integrity constraint %d -\n\n", i->inttree); ! 287: pr_range(); ! 288: ! 289: printf("define integrity on "); ! 290: pr_rv(Qt.qt_resvar = i->intresvar); ! 291: printf(" is "); ! 292: pr_qual(t->right); ! 293: printf("\n\n\n"); ! 294: ! 295: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.