Annotation of 42BSD/ingres/source/dbu/rmqm.c, revision 1.1

1.1     ! root        1: # include      <pv.h>
        !             2: # include      <ingres.h>
        !             3: # include      <access.h>
        !             4: # include      <aux.h>
        !             5: # include      <catalog.h>
        !             6: # include      <symbol.h>
        !             7: # include      <func.h>
        !             8: # include      <sccs.h>
        !             9: 
        !            10: SCCSID(@(#)rmqm.c      7.2     5/31/83)
        !            11: 
        !            12: /*
        !            13: **  RMQM -- DBU to delete protection and integrity constraints
        !            14: **
        !            15: **     Trace Flags:
        !            16: **             43
        !            17: */
        !            18: 
        !            19: 
        !            20: extern short   tTdbu[];
        !            21: extern int     dest_const();
        !            22: extern int     null_fn();
        !            23: 
        !            24: struct fn_def RmqmFn =
        !            25: {
        !            26:        "RMQM",
        !            27:        dest_const,
        !            28:        null_fn,
        !            29:        null_fn,
        !            30:        NULL,
        !            31:        0,
        !            32:        tTdbu,
        !            33:        100,
        !            34:        'Z',
        !            35:        0
        !            36: };
        !            37: /*
        !            38: **  DEST_CONST -- destroy constraints
        !            39: **
        !            40: **     Parameters:
        !            41: **             pc -- number of parameters in pv
        !            42: **             pv -- pv [0] == 5 destroy permission
        !            43: **                              == 6 destroy integrity constraint
        !            44: **                     pv [1]    relation from which to destroy constrain
        !            45: **                     pv [2] == if (pc != 2) relation from which to delete
        !            46: **                                     constraints
        !            47: **                     pv[3] ... pv[pc - 1] == id of constraint
        !            48: **
        !            49: **     Returns:
        !            50: **             0
        !            51: **
        !            52: **     Side Effects:
        !            53: **             destroys constraints. Involves activity on catalogs 'relation',
        !            54: **             protect, integrities, and tree.
        !            55: **
        !            56: **     Trace Flags:
        !            57: **             43, 0
        !            58: */
        !            59: 
        !            60: dest_const(pc, pv)
        !            61: int    pc;
        !            62: PARM   pv[];
        !            63: {
        !            64:        DESC                    d;
        !            65:        register int            i;
        !            66:        int                     mode;
        !            67:        extern struct admin     Admin;
        !            68: 
        !            69: #      ifdef xZTR1
        !            70:        if (tTf(43, 0))
        !            71:        {
        !            72:                printf("dest_const: ");
        !            73:                prvect(pc, pv);
        !            74:        }
        !            75: #      endif
        !            76: 
        !            77:        if (!(Admin.adhdr.adflags & A_QRYMOD))
        !            78:                return (0);
        !            79:        i = openr(&d, -1, pv[1].pv_val.pv_str);
        !            80:        if (i < 0)
        !            81:                syserr("dest_const: openr(%s) %d", pv[1].pv_val.pv_str, i);
        !            82: 
        !            83:        if (i == 1 || !bequal(Usercode, d.reldum.relowner, 2))
        !            84:        {
        !            85:                error(5202, pv[1].pv_val.pv_str, 0);
        !            86:                return (0);
        !            87:        }
        !            88: 
        !            89:        mode = atoi(pv[0].pv_val.pv_str);
        !            90:        if (mode == 5)
        !            91:                dest_prot(&d, &pv[2]);
        !            92:        else if (mode == 6)
        !            93:                dest_integ(&d, &pv[2]);
        !            94:        else
        !            95:                syserr("dest_const: bad mode %d", mode);
        !            96:        return (0);
        !            97: }
        !            98: /*
        !            99: **  DEST_INTEG -- directs destruction of integrity constraints
        !           100: **
        !           101: **     Parameters:
        !           102: **             desc -- descriptor for relation
        !           103: **             intv -- PV_EOF terminated list of id strings, if first element
        !           104: **                     is PV_EOF means "all"
        !           105: **
        !           106: **     Returns:
        !           107: **             none
        !           108: **
        !           109: **     Side Effects:
        !           110: **             deletes integrity constraint. Activity on 'relation', integrities,
        !           111: **             and tree.
        !           112: */
        !           113: 
        !           114: dest_integ(d, intv)
        !           115: register DESC  *d;
        !           116: PARM           intv[];
        !           117: {
        !           118:        extern DESC             Intdes;
        !           119:        struct integrity        tuple, key;
        !           120:        struct tree             tkey;
        !           121:        register                i, j;
        !           122:        int                     tree_const();
        !           123:        int                     int_inttree();
        !           124: 
        !           125: #      ifdef xZTR1
        !           126:        if (tTf(43, 1))
        !           127:                printf("dest_integ((%s, %s)...)\n", d->reldum.relid, d->reldum.relowner);
        !           128: #      endif
        !           129: 
        !           130:        i_cat("integrities", &Intdes, &key, d->reldum.relid, INTRELID,
        !           131:        d->reldum.relowner, INTRELOWNER, mdINTEG, &tkey);
        !           132: 
        !           133:        if (intv[0].pv_type == PV_EOF)
        !           134:        {
        !           135:                /* destroy integrity 'relation' ALL */
        !           136:                if (!(d->reldum.relstat & S_INTEG))
        !           137:                        return (0);
        !           138:                del_all(d, &Intdes, &key, &tuple, &tkey, S_INTEG,
        !           139:                tree_const, int_inttree);
        !           140:                return (0);
        !           141:        }
        !           142:        /* destroy integrity 'relation' int {, int} */
        !           143:        for (i = 0; intv[i].pv_type != PV_EOF; i++)
        !           144:                del_int(&Intdes, &key, &tuple, &tkey, intv[i].pv_val.pv_str, INTTREE, 
        !           145:                tree_const, int_inttree);
        !           146: 
        !           147:        /* rescan to output error messages */
        !           148:        for (j = 0; j < i; j++)
        !           149:                if (*(intv[j].pv_val.pv_str))
        !           150:                        error(5203, intv[j].pv_val.pv_str, 0);
        !           151: 
        !           152:        /* finally, check that there are still integrity constraints
        !           153:        ** on the relation, if not must reset the S_INTEG bit in the relation
        !           154:        ** relation tuple for that relation.
        !           155:        */
        !           156:        chk_const(d, &Intdes, &key, &tuple, d->reldum.relid, INTRELID, d->reldum.relowner,
        !           157:        INTRELOWNER, S_INTEG);
        !           158: }
        !           159: /*
        !           160: **  DEST_PROT -- directs destruction of protection constraints
        !           161: **
        !           162: **     Parameters:
        !           163: **             desc -- descriptor for relation
        !           164: **             intv -- PV_EOF terminated list of id strings, if first element
        !           165: **                     is PV_EOF means "all"
        !           166: **
        !           167: **     Returns:
        !           168: **             none
        !           169: **
        !           170: **     Side Effects:
        !           171: **             deletes protection constraint. Activity on 'relation', 
        !           172: **             protect, and tree.
        !           173: **
        !           174: **     Trace Flags:
        !           175: **             43, 2
        !           176: */
        !           177: 
        !           178: 
        !           179: dest_prot(d, intv)
        !           180: register DESC  *d;
        !           181: PARM           intv[];
        !           182: {
        !           183:        extern DESC     Prodes;
        !           184:        struct protect  tuple, key;
        !           185:        struct tree     tkey;
        !           186:        register        i, j;
        !           187:        int             propermid;
        !           188:        int             prot_protree();
        !           189:        int             tree_prot();
        !           190: 
        !           191: #      ifdef xZTR1
        !           192:        if (tTf(43, 2))
        !           193:                printf("dest_prot((%s, %s)...)\n", d->reldum.relid, d->reldum.relowner);
        !           194: #      endif
        !           195: 
        !           196:        i_cat("protect", &Prodes, &key, d->reldum.relid, PRORELID, d->reldum.relowner,
        !           197:        PRORELOWN, mdPROT, &tkey);
        !           198: 
        !           199:        if (intv[0].pv_type == PV_EOF)
        !           200:        {
        !           201:                /* destroy permit 'relation' ALL */
        !           202:                if (!(d->reldum.relstat & S_PROTRET) || !(d->reldum.relstat & S_PROTALL))
        !           203:                        r_relstat(d, S_PROTRET | S_PROTALL, 1);
        !           204:                if (!(d->reldum.relstat & S_PROTUPS))
        !           205:                        return (0);
        !           206:                del_all(d, &Prodes, &key, &tuple, &tkey, S_PROTUPS,
        !           207:                tree_prot, prot_protree);
        !           208:                return (0);
        !           209:        }
        !           210:        /* destroy permit 'relation' int {, int} */
        !           211:        for (i = 0; intv[i].pv_type != PV_EOF; i++)
        !           212:        {
        !           213:                propermid = atoi(intv[i].pv_val.pv_str);
        !           214:                if (propermid == 0)
        !           215:                {
        !           216:                        if (!(d->reldum.relstat & S_PROTALL))
        !           217:                        {
        !           218:                                r_relstat(d, S_PROTALL, 1);
        !           219:                                intv[i].pv_val.pv_str = 0;
        !           220:                        }
        !           221:                        continue;
        !           222:                }
        !           223:                else if (propermid == 1)
        !           224:                {
        !           225:                        if (!(d->reldum.relstat & S_PROTRET))
        !           226:                        {
        !           227:                                r_relstat(d, S_PROTRET, 1);
        !           228:                                intv[i].pv_val.pv_str = 0;
        !           229:                        }
        !           230:                        continue;
        !           231:                }
        !           232:                del_int(&Prodes, &key, &tuple, &tkey, intv[i].pv_val.pv_str, PROPERMID, 
        !           233:                tree_prot, prot_protree);
        !           234:        }
        !           235:        /* rescan to output error messages */
        !           236:        for (j = 0; j < i; j++)
        !           237:                if (intv[j].pv_val.pv_str)
        !           238:                        error(5204, intv[j].pv_val.pv_str, 0);
        !           239: 
        !           240:        /* finally, check that there are still permissions
        !           241:        ** on the relation, if not must reset the S_PROTUPS bit in the relation
        !           242:        ** relation tuple for that relation's relstat.
        !           243:        */
        !           244:        chk_const(d, &Prodes, &key, &tuple, d->reldum.relid, PRORELID,
        !           245:        d->reldum.relowner, PRORELOWN, S_PROTUPS);
        !           246: }
        !           247: /*
        !           248: **  I_CAT -- prepare catalogs for deletin of constraint
        !           249: **
        !           250: **     Initializes treerelid, treeowner, and treetype fields
        !           251: **     of tree key. Also relation id and owner fields of
        !           252: **     appropriate catalog c_desc, with key 'key'.
        !           253: **
        !           254: **     Parameters:
        !           255: **             c_name -- name of catalog for opencatalog
        !           256: **             c_desc -- descriptor of catalog
        !           257: **             key -- key for catalog
        !           258: **             relid -- relation.relid for relation to be de-constrained
        !           259: **             id_attno -- attno of relid in constraint catalog c_desc
        !           260: **             relowner -- relation.relowner for rel to be de-constrained
        !           261: **             own_attno -- attno of owner in constrain catalog
        !           262: **             type -- treetype for tree tuple (depends on catalog)
        !           263: **             tkey -- key for tree catalog
        !           264: **
        !           265: **     Returns:
        !           266: **             none
        !           267: **
        !           268: **     Side Effects:
        !           269: **             opencatalogs the constraint catalog c_desc, and the "tree" rel
        !           270: **             for READ/WRITE. Sets keys.
        !           271: **
        !           272: **     Trace Flags:
        !           273: **             43, 3
        !           274: */
        !           275: 
        !           276: i_cat(c_name, c_desc, key, relid, id_attno, relowner, own_attno, type, tkey)
        !           277: char           *c_name;
        !           278: DESC           *c_desc;
        !           279: char           *key;
        !           280: char           *relid;
        !           281: int            id_attno;
        !           282: char           *relowner;
        !           283: int            own_attno;
        !           284: int            type;
        !           285: struct tree    *tkey;
        !           286: {
        !           287:        extern DESC     Treedes;
        !           288: 
        !           289: #      ifdef xZTR1
        !           290:        if (tTf(43, 3))
        !           291:                printf("i_cat(c_name \"%s\", relid %s id_attno %d relowner %s own_attno %d type %d)\n",
        !           292:                c_name, relid, id_attno, relowner, own_attno, type);
        !           293: #      endif
        !           294: 
        !           295:        opencatalog("tree", 2);
        !           296:        setkey(&Treedes, tkey, relid, TREERELID);
        !           297:        setkey(&Treedes, tkey, relowner, TREEOWNER);
        !           298:        setkey(&Treedes, tkey, &type, TREETYPE);
        !           299:        opencatalog(c_name, 2);
        !           300:        clearkeys(c_desc);
        !           301:        setkey(c_desc, key, relid, id_attno);
        !           302:        setkey(c_desc, key, relowner, own_attno);
        !           303: }
        !           304: /*
        !           305: **  DEL_ALL -- delete all constraints for a given relation
        !           306: **
        !           307: **     Deletes all constraints of a given type given by a constraint
        !           308: **     catalog 'c_desc'. Note that Protection constraints 0 & 1, given
        !           309: **     by relation.relstat field are not deleted here.
        !           310: **
        !           311: **     Parameters:
        !           312: **             r_desc -- descriptor for relation to de-constrain (for
        !           313: **                     r_relstat)
        !           314: **             c_desc -- constraint catalog descriptor
        !           315: **             key -- c_desc's key
        !           316: **             tuple -- c_desc's tuple (needed because sizeof tuple is not
        !           317: **                     known here, so must be allocated beforehand)
        !           318: **             tkey -- tree key with TREERELID and TREERELOWNER setkeyed
        !           319: **             bit -- bits in relstat to reset after deleting all constraints
        !           320: **             tree_pred -- called with constraint tuple to determine
        !           321: **                     wether a tree tuple is present or not (as can happen
        !           322: **                     for protect catalog)
        !           323: **             tree_field -- should return the treeid from tuple
        !           324: **
        !           325: **     Returns:
        !           326: **             none
        !           327: **
        !           328: **     Side Effects:
        !           329: **             tree and constraint catalog activity
        !           330: **
        !           331: **     Requires:
        !           332: **             del_tree()
        !           333: **             r_relstat()
        !           334: **
        !           335: **     Called By:
        !           336: **             dest_????
        !           337: **
        !           338: **     Trace Flags:
        !           339: **             43, 4
        !           340: **
        !           341: **     Syserrs:
        !           342: **             bad find, get, delete, flush_rel
        !           343: **
        !           344: **     History:
        !           345: **             1/10/79 -- (marc) written
        !           346: */
        !           347: 
        !           348: del_all(r_desc, c_desc, key, tuple, tkey, bit, tree_pred, tree_field)
        !           349: DESC           *r_desc;
        !           350: DESC           *c_desc;
        !           351: char           *key;
        !           352: char           *tuple;
        !           353: struct tree    *tkey;
        !           354: int            bit;
        !           355: int            (*tree_pred)();
        !           356: int            (*tree_field)();
        !           357: {
        !           358:        TID             lotid, hitid;
        !           359:        register int    i;
        !           360: 
        !           361: #      ifdef xZTR1
        !           362:        if (tTf(43, 4))
        !           363:                printf("del_all(bit=0%o)\n", bit);
        !           364: #      endif
        !           365: 
        !           366:        if (i = find(c_desc, EXACTKEY, &lotid, &hitid, key))
        !           367:                syserr("del_all: find %d", i);
        !           368:        while (!(i = get(c_desc, &lotid, &hitid, tuple, TRUE)))
        !           369:        {
        !           370:                if (!kcompare(c_desc, tuple, key))
        !           371:                {
        !           372:                        /* for each constraint of for a relation */
        !           373:                        if (i = delete(c_desc, &lotid))
        !           374:                                syserr("del_all: delete %d", i);
        !           375:                        /* for crash recovery */
        !           376:                        if (i = flush_rel(c_desc, FALSE))
        !           377:                                syserr("del_all: flush_rel %d", i);
        !           378:                        /* if there is a tree tuple, destroy it */
        !           379:                        if ((*tree_pred)(tuple))
        !           380:                                del_tree(tkey, (*tree_field)(tuple));
        !           381:                }
        !           382:        }
        !           383:        if (i != 1)
        !           384:                syserr("del_all: get %d", i);
        !           385:        /* turn off bit in relstat field */
        !           386:        r_relstat(r_desc, bit, 0);
        !           387: }
        !           388: /*
        !           389: **  DEL_INT -- delete from a constraint catalog a constraint
        !           390: **
        !           391: **     Parameters:
        !           392: **             c_desc -- catalog descriptor
        !           393: **             key -- catalog key
        !           394: **             tuple -- catalog tuple (needed because tuple size unknown here)
        !           395: **             tkey -- tree key with TREERELID and TREERELOWNER setkeyed
        !           396: **             constid -- integer constraint id in string form
        !           397: **             constattno -- attno of comstraint number in c_desc
        !           398: **             tree_pred -- predicate on existence of tree tuple 
        !           399: **             tree_field -- returns treeid from constrain tuple
        !           400: **
        !           401: **     Returns:
        !           402: **             none
        !           403: **
        !           404: **     Side Effects:
        !           405: **             constraint and tree catalog activity.
        !           406: **             *constid set to 0 if constraint id exists.
        !           407: **
        !           408: **     Requires:
        !           409: **             del_tree()
        !           410: **
        !           411: **     Called By:
        !           412: **             dest_????
        !           413: **
        !           414: **     Trace Flags:
        !           415: **             43, 5
        !           416: **
        !           417: **     Syserrs:
        !           418: **             bad atoi (parser error), getequal, delete, flush_rel
        !           419: **
        !           420: **     History:
        !           421: **             1/10/79 -- (marc) written
        !           422: */
        !           423: 
        !           424: del_int(c_desc, key, tuple, tkey, constid, constattno, tree_pred, tree_field)
        !           425: DESC           *c_desc;
        !           426: char           *key;
        !           427: char           *tuple;
        !           428: struct tree    *tkey;
        !           429: char           *constid;
        !           430: int            constattno;
        !           431: int            (*tree_pred)();
        !           432: int            (*tree_field)();
        !           433: {
        !           434:        TID             tid;
        !           435:        register int    i;
        !           436:        int             constnum;
        !           437: 
        !           438: #      ifdef xZTR1
        !           439:        if (tTf(43, 5))
        !           440:                printf("del_int(constid=%s, constattno=%d)\n", 
        !           441:                constid, constattno);
        !           442: #      endif
        !           443: 
        !           444:        constnum = atoi(constid);
        !           445:        setkey(c_desc, key, &constnum, constattno);
        !           446:        if (!(i = getequal(c_desc, key, tuple, &tid)))
        !           447:        {
        !           448:                if (i = delete(c_desc, &tid))
        !           449:                        syserr("del_int(%d) %d", constid, i);
        !           450:                if ((*tree_pred)(tuple))
        !           451:                        del_tree(tkey, (*tree_field)(tuple));
        !           452:                *constid = '\0';
        !           453:                return;
        !           454:        }
        !           455:        else if (i != 1)
        !           456:                syserr("dest_int: getequal %d", i);
        !           457:        /* bad constnum */
        !           458: }
        !           459: /*
        !           460: **  DEST_TREE -- destroy a tree tuple with for a given treeid
        !           461: **
        !           462: **     Deletes all tuples from tree with 'treeid' and previously set
        !           463: **     keys.
        !           464: **
        !           465: **     Parameters:
        !           466: **             key -- tre key
        !           467: **             treeid -- integer treeid
        !           468: **
        !           469: **     Returns:
        !           470: **             none
        !           471: **
        !           472: **     Side Effects:
        !           473: **             tree activity
        !           474: **
        !           475: **     Trace Flags:
        !           476: **             43, 6
        !           477: */
        !           478: 
        !           479: del_tree(key, treeid)
        !           480: struct tree    *key;
        !           481: int            treeid;
        !           482: {
        !           483:        struct tree     tuple;
        !           484:        TID             lotid, hitid;
        !           485:        register int    i;
        !           486:        register int    flag;
        !           487:        extern DESC     Treedes;
        !           488: 
        !           489: #      ifdef xZTR1
        !           490:        if (tTf(43, 6))
        !           491:                printf("del_tree(treeid=%d)\n", treeid);
        !           492: #      endif
        !           493: 
        !           494:        setkey(&Treedes, key, &treeid, TREEID);
        !           495:        if (i = find(&Treedes, EXACTKEY, &lotid, &hitid, key))
        !           496:                syserr("del_tree: bad find %d treeid %d", i, treeid);
        !           497:        flag = 0;
        !           498:        while (!(i = get(&Treedes, &lotid, &hitid, &tuple, TRUE)))
        !           499:        {
        !           500:                if (!kcompare(&Treedes, &tuple, key))
        !           501:                {
        !           502:                        if (i = delete(&Treedes, &lotid))
        !           503:                                syserr("del_tree: delete treeid %d %d", treeid, i);
        !           504:                        if (!flag)
        !           505:                                flag++;
        !           506:                }
        !           507:        }
        !           508:        if (i != 1)
        !           509:                syserr("del_tree: bad get %d", i);
        !           510:        if (!flag)
        !           511:                syserr("del_tree: no tuples qualified treeid %d", treeid);
        !           512:        if (i = flush_rel(&Treedes, FALSE))
        !           513:                syserr("del_tree: flush_rel(&Treedes) %d", i);
        !           514: }
        !           515: /*
        !           516: **  CHK_CONST -- check constraint catlg for tuples for a rel, and reset relatin.relstat
        !           517: **
        !           518: **     Parameters:
        !           519: **             r_desc -- reon desc for de-constrained relation
        !           520: **             c_desc -- catalog desc
        !           521: **             key -- catalog key (here unknown size)
        !           522: **             tuple -- " tuple space " " " " "
        !           523: **             relid -- relation name
        !           524: **             id_attno -- attno of relid
        !           525: **             relowner -- relation owner
        !           526: **             own_attno -- relowner attno
        !           527: **             bit -- bits to reset in relstat if there are no constraints left
        !           528: **
        !           529: **     Returns:
        !           530: **             none
        !           531: **
        !           532: **     Side Effects:
        !           533: **             reads catalog, maybe changes relstat field of relation
        !           534: **             relations's r_desc tuple
        !           535: **
        !           536: **     Trace Flags:
        !           537: **             43, 7
        !           538: */
        !           539: 
        !           540: chk_const(r_desc, c_desc, key, tuple, relid, id_attno, relowner, own_attno, bit)
        !           541: DESC   *r_desc;
        !           542: DESC   *c_desc;
        !           543: char   *key;
        !           544: char   *tuple;
        !           545: char   *relid;
        !           546: int    id_attno;
        !           547: char   *relowner;
        !           548: int    own_attno;
        !           549: int    bit;
        !           550: {
        !           551:        TID             tid;
        !           552:        register int    i;
        !           553: 
        !           554: 
        !           555: #      ifdef xZTR1
        !           556:        if (tTf(43, 7))
        !           557:                printf("chk_const: relid %s id_attno %d relowner %s own_attno %d bit 0%o)\n",
        !           558:                relid, id_attno, relowner, own_attno, bit);
        !           559: #      endif
        !           560: 
        !           561:        clearkeys(c_desc);
        !           562:        setkey(c_desc, key, relid, id_attno);
        !           563:        setkey(c_desc, key, relowner, own_attno);
        !           564:        if ((i = getequal(c_desc, key, tuple, &tid)) == 1)
        !           565:                r_relstat(r_desc, bit, 0);
        !           566:        else if (i < 0)
        !           567:                syserr("chk_const: getequal %d", i);
        !           568: }
        !           569: /*
        !           570: **  R_RELSTAT -- set or reset bits in the relation.relstat field
        !           571: **
        !           572: **     Does the above for relation described by desc.
        !           573: **
        !           574: **     Parameters:
        !           575: **             d -- relation to have relation.relstat field changed
        !           576: **             bit -- bits to set or reset
        !           577: **             action -- 0 reset, 1 set
        !           578: **
        !           579: **     Returns:
        !           580: **             none
        !           581: **
        !           582: **     Side Effects:
        !           583: **             relation is opened for READ/WRITE, relstat changed
        !           584: **
        !           585: **     Trace Flags:
        !           586: **             43, 8
        !           587: */
        !           588: 
        !           589: 
        !           590: r_relstat(d, bit, action)
        !           591: register DESC  *d;
        !           592: int            bit;
        !           593: int            action;
        !           594: {
        !           595:        struct relation tuple, key;
        !           596:        TID             tid;
        !           597:        register int    i;
        !           598:        extern DESC     Reldes;
        !           599: 
        !           600: #      ifdef xZTR1
        !           601:        if (tTf(43, 8))
        !           602:                printf("r_relstat(bit=0%o, action %d)\n",
        !           603:                bit, action);
        !           604: #      endif
        !           605: 
        !           606:        opencatalog("relation", 2);
        !           607:        clearkeys(&Reldes);
        !           608:        setkey(&Reldes, &key, d->reldum.relid, RELID);
        !           609:        setkey(&Reldes, &key, d->reldum.relowner, RELOWNER);
        !           610:        if (i = getequal(&Reldes, &key, &tuple, &tid))
        !           611:                syserr("r_relstat: getequal %s, %s, %d", d->reldum.relid,
        !           612:                d->reldum.relowner, i);
        !           613:        if (action)
        !           614:        {
        !           615:                if (tuple.relstat == (i = tuple.relstat | bit))
        !           616:                        return;
        !           617:                tuple.relstat = i;
        !           618:        }
        !           619:        else
        !           620:        {
        !           621:                if (tuple.relstat == (i = tuple.relstat & ~bit))
        !           622:                        return;
        !           623:                tuple.relstat = i;
        !           624:        }
        !           625:        if ((i = replace(&Reldes, &tid, &tuple, 0)) < 0 || i == 2)
        !           626:                syserr("r_relstat: replace %d", i);
        !           627:        if (i = flush_rel(&Reldes, FALSE))
        !           628:                syserr("r_relstat: flush_rel(&Reldes) %d", i);
        !           629: }
        !           630: /*
        !           631: **  TREE_CONST -- True predicate
        !           632: **
        !           633: **     Called indirectly by routines wishing to know if
        !           634: **     a integrity constraint has an associated tree tuple.
        !           635: **     As this is always the case, returns TRUE always.
        !           636: **
        !           637: **     Parameters:
        !           638: **             i -- integrity tuple
        !           639: **
        !           640: **     Returns:
        !           641: **             TRUE
        !           642: **
        !           643: **     Side Effects:
        !           644: **             none
        !           645: **
        !           646: **     Trace Flags:
        !           647: **             43, 9
        !           648: */
        !           649: 
        !           650: tree_const(i)
        !           651: struct integrity       *i;
        !           652: {
        !           653: #      ifdef xZTR1
        !           654:        if (tTf(43, 9))
        !           655:                printf("tree_const()\n");
        !           656: #      endif
        !           657: 
        !           658:        return (TRUE);
        !           659: }
        !           660: /*
        !           661: **  TREE_PROT -- Protection tuple tree predicate
        !           662: **
        !           663: **     Called indirectly by routines wishing to know if
        !           664: **     a protection constraint has an associated tree tuple.
        !           665: **
        !           666: **     Parameters:
        !           667: **             p -- protect tuple
        !           668: **
        !           669: **     Returns:
        !           670: **             TRUE -- if p->protree != -1
        !           671: **             FLASE -- otherwise
        !           672: **
        !           673: **     Side Effects:
        !           674: **             none
        !           675: **
        !           676: **     Trace Flags:
        !           677: **             43, 9
        !           678: */
        !           679: 
        !           680: tree_prot(p)
        !           681: struct protect *p;
        !           682: {
        !           683: #      ifdef xZTR1
        !           684:        if (tTf(43, 9))
        !           685:                printf("tree_prot(p->protree=%d)\n", p->protree);
        !           686: #      endif
        !           687: 
        !           688:        if (p->protree == -1)
        !           689:                return (FALSE);
        !           690:        else
        !           691:                return (TRUE);
        !           692: }
        !           693: /*
        !           694: **  PROT_PROTREE -- get protree field of a protection tuple
        !           695: **
        !           696: **     Parameters:
        !           697: **             p -- protect tuple
        !           698: **
        !           699: **     Returns:
        !           700: **             p->protree
        !           701: **
        !           702: **     Side Effects:
        !           703: **             none
        !           704: **
        !           705: **     Trace Flags:
        !           706: **             43, 9
        !           707: */
        !           708: 
        !           709: prot_protree(p)
        !           710: struct protect *p;
        !           711: {
        !           712: #      ifdef xZTR1
        !           713:        if (tTf(43, 9))
        !           714:                printf("prot_protree(protree=%d)\n", p->protree);
        !           715: #      endif
        !           716: 
        !           717:        return (p->protree);
        !           718: }
        !           719: /*
        !           720: **  INT_INTTREE -- get inttree field of a integrity tuple
        !           721: **
        !           722: **     Parameters:
        !           723: **             i -- integrity tuple
        !           724: **
        !           725: **     Returns:
        !           726: **             i->inttree
        !           727: **
        !           728: **     Side Effects:
        !           729: **             none
        !           730: **
        !           731: **     Trace Flags:
        !           732: **             43, 9
        !           733: */
        !           734: 
        !           735: int_inttree(i)
        !           736: struct integrity       *i;
        !           737: {
        !           738: #      ifdef xZTR1
        !           739:        if (tTf(43, 9))
        !           740:                printf("int_inttree(inttree=%d)\n", i->inttree);
        !           741: #      endif
        !           742: 
        !           743:        return (i->inttree);
        !           744: }

unix.superglobalmegacorp.com

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