|
|
1.1 ! root 1: # include <pv.h> ! 2: # include <ingres.h> ! 3: # include <aux.h> ! 4: # include <catalog.h> ! 5: # include <access.h> ! 6: # include <func.h> ! 7: # include <signal.h> ! 8: # include <sccs.h> ! 9: # include <errors.h> ! 10: ! 11: SCCSID(@(#)help.c 8.5 2/8/85) ! 12: ! 13: extern short tTdbu[100]; ! 14: extern int help(); ! 15: extern int null_fn(); ! 16: ! 17: struct fn_def HelpFn = ! 18: { ! 19: "HELP", ! 20: help, ! 21: null_fn, /* initialization function */ ! 22: null_fn, ! 23: NULL, ! 24: 0, ! 25: tTdbu, ! 26: 100, ! 27: 'Z', ! 28: 0 ! 29: }; ! 30: ! 31: ! 32: /* ! 33: ** HELP - Provide Information to User ! 34: ** ! 35: ** Arguments: ! 36: ** pv[i] - code ! 37: ** RELINFO - print relation information ! 38: ** MANSEC - print manual section ! 39: ** DELIMLIST - print delim information ! 40: ** RELIST - print relation list ! 41: ** ALLRELINFO - print relation info for all accessible ! 42: ** relations ! 43: ** ! 44: ** pv[i+1] - name of entity for modes 0 or 1 ! 45: ** ! 46: ** Trace Flags: ! 47: ** 44 ! 48: */ ! 49: ! 50: help(parmc, parmv) ! 51: int parmc; ! 52: PARM parmv[]; ! 53: { ! 54: DESC des; ! 55: int mode; ! 56: register PARM *pv; ! 57: register int ret; ! 58: int i; ! 59: ! 60: # ifdef xZTR1 ! 61: if (tTf(44, -1)) ! 62: { ! 63: printf(">>help\n"); ! 64: if (tTf(44, 0)) ! 65: prvect(parmc, parmv); ! 66: } ! 67: # endif ! 68: ! 69: ret = 0; ! 70: pv = parmv; ! 71: getuser(-1); /* init getuser for modes RELINFO & MANSEC */ ! 72: while (pv->pv_type != PV_EOF) ! 73: { ! 74: mode = (pv++)->pv_val.pv_int; ! 75: if (mode < RELIST && pv->pv_type == PV_EOF) ! 76: syserr("help: mode %d no val", mode); ! 77: ! 78: # ifdef xZTR1 ! 79: if (tTf(44, -1)) ! 80: { ! 81: printf("help %d", mode); ! 82: if (mode != RELIST) ! 83: printf(" %s", pv->pv_val.pv_str); ! 84: putchar('\n'); ! 85: } ! 86: # endif ! 87: switch (mode) ! 88: { ! 89: ! 90: case RELINFO: /* help relation */ ! 91: if (!openr(&des, OR_RELTID, pv->pv_val.pv_str)) ! 92: { ! 93: rel_fmt(&des); ! 94: pv->pv_val.pv_str = NULL; ! 95: } ! 96: pv++; ! 97: break; ! 98: ! 99: case MANSEC: /* help manual section */ ! 100: if (man(pv->pv_val.pv_str)) ! 101: pv->pv_val.pv_str = NULL; ! 102: pv++; ! 103: break; ! 104: ! 105: case DELLIST: /* help delim */ ! 106: if (!openr(&des, OR_READ, "rdelim")) ! 107: { ! 108: if ((i = helpdelim(pv->pv_val.pv_str,&des)) == -1) ! 109: return(error(RDELIMERR, pv->pv_val.pv_str, 0)); ! 110: closer(&des); ! 111: pv->pv_val.pv_str = NULL; ! 112: } ! 113: pv++; ! 114: break; ! 115: ! 116: case RELIST: ! 117: case ALLRELINFO: ! 118: relpr(mode); ! 119: break; ! 120: ! 121: case ALLDELLIST: ! 122: if (!openr(&des, OR_READ, "rdelim")) ! 123: { ! 124: if ((i = alldelims(&des)) == -1) ! 125: return(error(RDELIMERR, pv->pv_val.pv_str, 0)); ! 126: closer(&des); ! 127: pv->pv_val.pv_str = NULL; ! 128: } ! 129: pv++; ! 130: break; ! 131: ! 132: default: ! 133: syserr("HELP: mode %d", mode); ! 134: } ! 135: } ! 136: getuser(0); /* close getuser in case mode RELINFO or MANSEC */ ! 137: ! 138: /* now rescan for error messages */ ! 139: pv = parmv; ! 140: while (pv->pv_type != PV_EOF) ! 141: { ! 142: mode = (pv++)->pv_val.pv_int; ! 143: ! 144: if (mode < RELIST) ! 145: { ! 146: if (pv->pv_val.pv_str != NULL) ! 147: ret = nferror(NORELEXIST + mode, pv->pv_val.pv_str, 0); ! 148: pv++; ! 149: } ! 150: } ! 151: return (ret); ! 152: } ! 153: ! 154: ! 155: /* ! 156: ** Nroff Manual Section ! 157: ** ! 158: ** The manual section given by 'name' is nroff'ed. Returns one ! 159: ** on success, zero if the manual section is not found. ! 160: ** ! 161: ** Uses trace flag 11 ! 162: */ ! 163: ! 164: int ! 165: man(name) ! 166: char *name; ! 167: { ! 168: char manual[100]; ! 169: register int i; ! 170: int stat; ! 171: char name_nr[18]; ! 172: register char *naa; ! 173: extern char *ztack(); ! 174: ! 175: if (length(name) > 14) ! 176: return (0); ! 177: ! 178: /* a null manual name gives table of contents */ ! 179: if (name[0] == 0) ! 180: smove("../toc.nr", name_nr); ! 181: else ! 182: concat(name, ".nr", name_nr); ! 183: ! 184: concat(ztack(Pathname, "/doc/quel/"), name_nr, manual); ! 185: if ((i = open(manual, O_RDONLY)) < 0) ! 186: { ! 187: /* try a unix command instead */ ! 188: concat(ztack(Pathname, "/doc/unix/"), name_nr, manual); ! 189: if ((i = open(manual, O_RDONLY)) < 0) ! 190: return (0); ! 191: } ! 192: if (close(i)) ! 193: syserr("cannot close %s", manual); ! 194: ruboff(0); /* wait for child's death if rubout occures */ ! 195: i = fork(); ! 196: if (i == 0) ! 197: { ! 198: signal(SIGINT, SIG_DFL); /* die on rubout */ ! 199: setuid(getuid()); ! 200: # ifndef xB_UNIX ! 201: setgid(getgid()); ! 202: # endif ! 203: naa = ztack(Pathname, "/doc/iaa"); ! 204: execl("/bin/nroff", "nroff", naa, manual, 0); ! 205: execl("/usr/bin/nroff", "nroff", naa, manual, 0); ! 206: syserr("help: exec: nroff"); ! 207: } ! 208: /* wait for nroff if fork succeeded */ ! 209: if (i > 0) ! 210: fullwait(i, "help: nroff"); ! 211: rubon(); ! 212: return (1); ! 213: } ! 214: ! 215: ! 216: /* ! 217: ** PRINT DATABASE INFORMATION ! 218: ** ! 219: ** Prints a list of all the relations in the database, together ! 220: ** with their owner. ! 221: ** ! 222: ** Uses trace flag 12 ! 223: */ ! 224: ! 225: relpr(mode) ! 226: int mode; ! 227: { ! 228: extern DESC Reldes; ! 229: register DESC *d; ! 230: register int i; ! 231: register char *cp; ! 232: struct tup_id limtid, tid; ! 233: char buf[MAXLINE + 1]; ! 234: char lastuser[2]; ! 235: struct relation rel; ! 236: ! 237: opencatalog("relation", OR_READ); ! 238: d = &Reldes; ! 239: if (i = find(d, NOKEY, &tid, &limtid)) ! 240: syserr("help: relpr: find %d", i); ! 241: ! 242: lastuser[0] = '\0'; ! 243: ! 244: if (mode == RELIST) ! 245: printf("\n relation name relation owner\n\n"); ! 246: ! 247: while ((i = get(d, &tid, &limtid, &rel, 1)) == 0) ! 248: { ! 249: if (mode == RELIST) ! 250: { ! 251: if (!bequal(lastuser, rel.relowner, 2)) ! 252: { ! 253: if (getuser(rel.relowner, buf)) ! 254: { ! 255: /* cant find user code */ ! 256: bmove(" ", buf, 2); ! 257: cp = &buf[2]; ! 258: bmove(rel.relowner, cp, 2); ! 259: cp = &cp[2]; ! 260: *cp = '\0'; ! 261: } ! 262: else ! 263: { ! 264: for (cp = buf; *cp != ':'; cp++) ! 265: ; ! 266: *cp = '\0'; ! 267: } ! 268: bmove(rel.relowner, lastuser, 2); ! 269: } ! 270: printf(" %.12s %s\n", rel.relid, buf); ! 271: } ! 272: else ! 273: { ! 274: if ((rel.relstat & S_CATALOG) || bequal("_SYS", rel.relid, 4)) ! 275: continue; ! 276: if (bequal(Usercode, rel.relowner, UCODE_SZ) || bequal(Admin.adhdr.adowner, rel.relowner, 2)) ! 277: rel_fmt(&rel); ! 278: } ! 279: } ! 280: ! 281: if (i < 0) ! 282: syserr("help: relpr: get %d", i); ! 283: if (mode == RELIST) ! 284: printf("\n"); ! 285: return (0); ! 286: } ! 287: ! 288: ! 289: ! 290: /* ! 291: ** Print Relation Information ! 292: ** ! 293: ** Prints detailed information regarding the relation. ! 294: ** ! 295: ** Uses trace flag 13 ! 296: */ ! 297: ! 298: rel_fmt(r) ! 299: register struct relation *r; ! 300: { ! 301: struct tup_id limtid, tid; ! 302: char buf[MAXLINE + 1]; ! 303: struct attribute att; ! 304: struct index indkey, ind; ! 305: register int i; ! 306: int j; ! 307: extern DESC Attdes, Inddes; ! 308: char *trim_relname(); ! 309: ! 310: printf("\nRelation:\t\t%s\n", trim_relname(r->relid)); ! 311: i = getuser(r->relowner, buf); ! 312: if (i) ! 313: { ! 314: smove("(xx)", buf); ! 315: bmove(r->relowner, &buf[1], 2); ! 316: } ! 317: else ! 318: { ! 319: for (i = 0; buf[i] != ':'; i++) ! 320: continue; ! 321: buf[i] = 0; ! 322: } ! 323: printf("Owner:\t\t\t%s\n", buf); ! 324: printf("Tuple width:\t\t%d\n", r->relwid); ! 325: if (r->relsave != 0) ! 326: { ! 327: printf("Saved until:\t\t%s", ctime(&r->relsave)); ! 328: } ! 329: if ((r->relstat & S_VIEW) == 0) ! 330: { ! 331: printf("Number of tuples:\t%ld\n", r->reltups); ! 332: printf("Storage structure:\t"); ! 333: i = r->relspec; ! 334: if (i < 0) ! 335: { ! 336: printf("compressed "); ! 337: i = -i; ! 338: } ! 339: switch (i) ! 340: { ! 341: ! 342: case M_HEAP: ! 343: printf("paged heap\n"); ! 344: break; ! 345: ! 346: case M_ISAM: ! 347: printf("ISAM file\n"); ! 348: break; ! 349: ! 350: case M_HASH: ! 351: printf("random hash\n"); ! 352: break; ! 353: ! 354: default: ! 355: printf("unknown structure %d\n", i); ! 356: break; ! 357: ! 358: } ! 359: } ! 360: ! 361: printf("Relation type:\t\t"); ! 362: if (r->relstat & S_CATALOG) ! 363: printf("system catalog\n"); ! 364: else if (r->relstat & S_VIEW) ! 365: printf("view\n"); ! 366: else ! 367: if (r->reldim > 0) ! 368: printf("ordered relation\n"); ! 369: else if (r->relindxd < 0) ! 370: { ! 371: printf("secondary index on "); ! 372: opencatalog("indexes", OR_READ); ! 373: setkey(&Inddes, &indkey, r->relowner, IOWNERP); ! 374: setkey(&Inddes, &indkey, r->relid, IRELIDI); ! 375: if (!getequal(&Inddes, &indkey, &ind, &tid)) ! 376: printf("%s\n", trim_relname(ind.irelidp)); ! 377: else ! 378: printf("unknown relation\n"); ! 379: } ! 380: else ! 381: { ! 382: if (r->relstat & S_DISTRIBUTED) ! 383: printf("distributed "); ! 384: printf("user relation\n"); ! 385: } ! 386: if (r->relindxd > 0) ! 387: { ! 388: printf("Secondary Indices:\t"); ! 389: opencatalog("indexes", OR_READ); ! 390: setkey(&Inddes, &indkey, r->relid, IRELIDP); ! 391: setkey(&Inddes, &indkey, r->relowner, IOWNERP); ! 392: if (i = find(&Inddes, EXACTKEY, &tid, &limtid, &indkey)) ! 393: syserr("help: find %d indexes", i); ! 394: j = FALSE; ! 395: while ((i = get(&Inddes, &tid, &limtid, &ind, 1)) == 0) ! 396: { ! 397: if (!bequal(&indkey, &ind, MAXNAME + 2)) ! 398: continue; ! 399: if (j) ! 400: printf(", "); ! 401: j =TRUE; ! 402: printf("%s", trim_relname(ind.irelidi)); ! 403: } ! 404: if (i < 0) ! 405: syserr("help:get indexes %d", i); ! 406: if (!j) ! 407: printf("unknown"); ! 408: } ! 409: printf("\n"); ! 410: ! 411: opencatalog("attribute", OR_READ); ! 412: printf("\n attribute name type length keyno.\n\n"); ! 413: seq_init(&Attdes, r); ! 414: while (seq_attributes(&Attdes, r, &att)) ! 415: { ! 416: printf(" %.12s %c%8d", ! 417: att.attname, att.attfrmt, att.attfrml & I1MASK); ! 418: if (att.attxtra) ! 419: printf("%7d", att.attxtra); ! 420: printf("\n"); ! 421: } ! 422: ! 423: printf("\n"); ! 424: return (0); ! 425: } ! 426: ! 427: /* ! 428: ** HELPDELIM - print all delims presently defined. ! 429: ** ! 430: ** Parameters: ! 431: ** group - the group of delims to print ! 432: ** ! 433: ** Returns: ! 434: ** 0 - if successful ! 435: ** -1 - if relation not found ! 436: */ ! 437: helpdelim(group,des) ! 438: char *group; ! 439: DESC *des; ! 440: { ! 441: DELIM_TUP tuple; ! 442: TID lotid,hitid; ! 443: int notfound = 1; ! 444: char delim[12]; ! 445: int start = 0; ! 446: int begin = 1; ! 447: char dstring[1024]; ! 448: char *dptr; ! 449: int found=0; ! 450: ! 451: if (find(des,LRANGEKEY, &lotid, &hitid, group) < 0) ! 452: return(-1); ! 453: find(des,HRANGEKEY, &lotid, &hitid, group); ! 454: printf("\n \t>>>> %s <<<<\n", group); ! 455: ! 456: while (!get(des, &lotid, &hitid, &tuple, 1)) ! 457: { ! 458: ! 459: if (strcmp(tuple.group, group)) ! 460: continue; ! 461: ! 462: if (strcmp(tuple.delim, delim)) ! 463: start = 1; ! 464: ! 465: if (start) ! 466: { ! 467: found = 1; ! 468: if (begin) ! 469: begin = 0; ! 470: else ! 471: print_delim(dstring); ! 472: ! 473: /*start a new string*/ ! 474: strcpy(delim, tuple.delim); ! 475: start = 0; ! 476: *dstring = NULL; ! 477: strcat(dstring, tuple.delim); ! 478: strcat(dstring, ": "); ! 479: convert_bitmap(dstring, &tuple); ! 480: } ! 481: else ! 482: { ! 483: /*add to old string*/ ! 484: convert_bitmap(dstring, &tuple); ! 485: } ! 486: } ! 487: if (!found) ! 488: printf("group %s does not exist\n", group); ! 489: else ! 490: print_delim(dstring); ! 491: return(0); ! 492: } ! 493: ! 494: /* ! 495: ** CONVERT_BITMAP - convert a bitmap back to a BNF expression ! 496: ** ! 497: ** Parameters: ! 498: ** dstring - string to stuff the BNF expression info ! 499: ** tuple - tuple containing the bitmap ! 500: ** ! 501: */ ! 502: convert_bitmap(dstring, tuple) ! 503: char *dstring; ! 504: DELIM_TUP *tuple; ! 505: { ! 506: int i,j; ! 507: char *pntr; ! 508: ! 509: pntr = dstring + strlen(dstring); ! 510: *pntr++ = (tuple->type == ONE ? LBRACKET : LBRACE); ! 511: i = 0; ! 512: while (i < 128 ) ! 513: { ! 514: if (test(tuple->bitmap, i)) ! 515: { ! 516: *pntr++ = i; ! 517: j = ++i; ! 518: while ((j < 128) && test(tuple->bitmap, j)) ! 519: j++; ! 520: if ( (j - i) >= 5) ! 521: { ! 522: j--; ! 523: *pntr++ = '-'; ! 524: *pntr++ = j; ! 525: i = j + 1; ! 526: } ! 527: } ! 528: else ! 529: i++; ! 530: } ! 531: *pntr++ = (tuple->type == ONE ? RBRACKET : RBRACE); ! 532: *pntr = NULL; ! 533: } ! 534: ! 535: /* ! 536: ** PRINT_DELIM - print one delim of the rdelim relation ! 537: ** ! 538: ** Parameters: ! 539: ** ! 540: */ ! 541: print_delim(delim) ! 542: char *delim; ! 543: { ! 544: printf("%s\n", delim); ! 545: } ! 546: ! 547: /* ! 548: ** ALLDELIMS - print all the delims currently defined ! 549: ** ! 550: */ ! 551: alldelims(des) ! 552: DESC *des; ! 553: { ! 554: DELIM_TUP tuple; ! 555: int start=1; ! 556: char group[12]; ! 557: TID lotid; ! 558: TID hitid; ! 559: ! 560: printf("Delimitor groups:\n"); ! 561: if (find(des,LRANGEKEY, &lotid, &hitid, group) < 0) ! 562: return(-1); ! 563: find(des,HRANGEKEY, &lotid, &hitid, group); ! 564: ! 565: while (!get(des, &lotid, &hitid, &tuple, 1)) ! 566: { ! 567: ! 568: if (strcmp(tuple.group, group)) ! 569: start = 1; ! 570: ! 571: if (start) ! 572: { ! 573: strcpy(group, tuple.group); ! 574: printf("\t\t %s\n", group); ! 575: /*helpdelim(group, des); */ ! 576: start = 0; ! 577: } ! 578: } ! 579: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.