Annotation of 43BSD/ingres/source/dbu/help.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.