Annotation of 43BSD/ingres/source/dbu/udestroy.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <aux.h>
        !             3: # include      <catalog.h>
        !             4: # include      <btree.h>
        !             5: # include      <pv.h>
        !             6: # include      <sccs.h>
        !             7: 
        !             8: SCCSID(@(#)udestroy.c  8.2     1/15/85)
        !             9: 
        !            10: 
        !            11: /*
        !            12: **  USERDESTROY -- auxiliary cleanup for destroy of a user relation
        !            13: **
        !            14: **     userdestroy is called during the destroy of a non system
        !            15: **     relation. If the relation is indexed or is itself an index
        !            16: **     then the appropriate action is taken. If it is indexed,
        !            17: **     then all secondary indices on the relation are also destroyed.
        !            18: **     If it is a secondary index, then the entry in the indexes relation
        !            19: **     is removed and the "relindxd" bit on the primary relation is
        !            20: **     cleared if this was the last index on the relation.
        !            21: **
        !            22: **     If the relation was a view or had integrity constraints or
        !            23: **     protection constraints on it, then those definitions are
        !            24: **     removed from the appropriate system catalogues.
        !            25: **
        !            26: **     Parameters:
        !            27: **             reltup -- the relation relation tuple.
        !            28: **
        !            29: **     Returns:
        !            30: **             none
        !            31: **
        !            32: **     Side Effects:
        !            33: **             zero or more system catalogues will be updated.
        !            34: **
        !            35: **     Called By:
        !            36: **             destroy
        !            37: */
        !            38: 
        !            39: userdestroy(reltup)
        !            40: struct relation        *reltup;
        !            41: {
        !            42:        register int                    i;
        !            43:        register struct relation        *rel;
        !            44:        struct tup_id                   tid, limtid;
        !            45:        char                            newrelname[MAXNAME + 3];
        !            46:        extern DESC                     Reldes, Attdes, Inddes;
        !            47:        extern DESC                     Treedes, Intdes, Prodes;
        !            48:        struct relation                 relt, relk;
        !            49:        struct index                    indk, indt;
        !            50:        char                            btree[MAXNAME + 4];
        !            51:        char                            *trim_relname();
        !            52:        PARM                            pv[2];
        !            53: 
        !            54:        rel = reltup;
        !            55: 
        !            56:        /* handle special case of destroying a secondary index */
        !            57:        if (rel->relindxd == SECINDEX)
        !            58:        {
        !            59:                opencatalog("indexes", OR_WRITE);
        !            60:                setkey(&Inddes, &indk, rel->relid, IRELIDI);
        !            61:                setkey(&Inddes, &indk, rel->relowner, IOWNERP);
        !            62:                if ((i = getequal(&Inddes, &indk, &indt, &tid)) != 0)
        !            63:                        syserr("destroy: geteq(ind,%.12s) %d", rel->relid, i);
        !            64: 
        !            65:                /* remove entry in INDEX catalog */
        !            66:                bmove(indt.irelidp, newrelname, MAXNAME);
        !            67:                bmove(indt.iownerp, &newrelname[MAXNAME], 2);
        !            68:                if ((i = delete(&Inddes, &tid)) != 0)
        !            69:                        syserr("DESTROY: delete(ind/%.12s) %d", rel->relid, i);
        !            70:                clearkeys(&Inddes);
        !            71:                setkey(&Inddes, &indk, newrelname, IRELIDP);
        !            72:                setkey(&Inddes, &indk, &newrelname[MAXNAME], IOWNERP);
        !            73: 
        !            74:                /* reset relindxd field in relation catalog if no other indexes exist on this primary */
        !            75:                if (getequal(&Inddes, &indk, &indt, &tid) != 0)
        !            76:                {
        !            77:                        clearkeys(&Reldes);
        !            78:                        setkey(&Reldes, &relk, newrelname, RELID);
        !            79:                        setkey(&Reldes, &relk, &newrelname[MAXNAME], RELOWNER);
        !            80:                        if (i = getequal(&Reldes, &relk, &relt, &tid))
        !            81:                                syserr("destroy: getequal(rel, %s) %d", newrelname, i);
        !            82:                        relt.relindxd = 0;
        !            83:                        if ((i = replace(&Reldes, &tid, &relt, 0)) != 0)
        !            84:                                syserr("destroy: replace(rel) %d", i);
        !            85:                }
        !            86:        }
        !            87: 
        !            88:        if (rel->reldim > 0)
        !            89:        {
        !            90:                /* remove old B-Tree file */
        !            91:                btreename(rel->relid, btree);
        !            92:                if (unlink(btree) < 0)
        !            93:                        syserr("userdestroy: unlink %s", btree);
        !            94:                /* remove btreesec file */
        !            95:                capital(trim_relname(rel->relid), btree);
        !            96:                pv[0].pv_val.pv_str = btree;
        !            97:                pv[1].pv_type = PV_EOF;
        !            98:                if (destroy(1, pv))
        !            99:                        syserr("can't destroy btreesec");
        !           100:        }
        !           101: 
        !           102:        /* check special case of destroying primary relation */
        !           103:        if (rel->relindxd > 0)
        !           104:        {
        !           105:                opencatalog("indexes", OR_WRITE);
        !           106:                setkey(&Inddes, &indk, rel->relid, IRELIDP);
        !           107:                setkey(&Inddes, &indk, rel->relowner, IOWNERP);
        !           108:                if (i = find(&Inddes, EXACTKEY, &tid, &limtid, &indk))
        !           109:                        syserr("destroy: find(ind,%.12s) %d", rel->relid, i);
        !           110:                while ((i = get(&Inddes, &tid, &limtid, &indt, TRUE)) == 0)
        !           111:                {
        !           112:                        if (kcompare(&Inddes, &indk, &indt) != 0)
        !           113:                                continue;
        !           114:                        if ((i = delete(&Inddes, &tid)) != 0)
        !           115:                                syserr("DESTROY: delete(ind/%.12s) %d", rel->relid, i);
        !           116:                        clearkeys(&Reldes);
        !           117:                        purgetup(&Reldes, indt.irelidi, RELID, indt.iownerp, RELOWNER, 0);
        !           118:                        if (i = flush_rel(&Reldes, FALSE))      /* flush for recovery & concurrency reasons */
        !           119:                                syserr("destroy:flush irel %d", i);
        !           120:                        purgetup(&Attdes, indt.irelidi, ATTRELID, indt.iownerp, ATTOWNER, 0);
        !           121:                        ingresname(indt.irelidi, indt.iownerp, newrelname);
        !           122:                        if (unlink(newrelname))
        !           123:                                syserr("destroy: unlink(%s)", newrelname);
        !           124:                }
        !           125:                if (i < 0)
        !           126:                {
        !           127:                        syserr("destroy: get(ind) %d", i);
        !           128:                }
        !           129:        }
        !           130: 
        !           131:        /* if any integrity constraints exist, remove them */
        !           132:        if (rel->relstat & S_INTEG)
        !           133:        {
        !           134:                opencatalog("integrities", OR_WRITE);
        !           135:                purgetup(&Intdes, rel->relid, INTRELID, rel->relowner, INTRELOWNER);
        !           136:        }
        !           137: 
        !           138:        /* if any protection clauses exist, remove them */
        !           139:        if (rel->relstat & S_PROTUPS)
        !           140:        {
        !           141:                opencatalog("protect", OR_WRITE);
        !           142:                purgetup(&Prodes, rel->relid, PRORELID, rel->relowner, PRORELOWN);
        !           143:        }
        !           144: 
        !           145:        /* remove any trees associated with the relation */
        !           146:        if (rel->relstat & (S_PROTUPS | S_VIEW | S_INTEG))
        !           147:        {
        !           148:                opencatalog("tree", OR_WRITE);
        !           149:                purgetup(&Treedes, rel->relid, TREERELID, rel->relowner, TREEOWNER);
        !           150:        }
        !           151: }

unix.superglobalmegacorp.com

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