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

1.1     ! root        1: # include      <pv.h>
        !             2: # include      <ingres.h>
        !             3: # include      <aux.h>
        !             4: # include      <catalog.h>
        !             5: # include      <func.h>
        !             6: # include      <sccs.h>
        !             7: # include      <errors.h>
        !             8: 
        !             9: SCCSID(@(#)destroy.c   8.3     2/8/85)
        !            10: 
        !            11: extern short   tTdbu[];
        !            12: extern int     destroy();
        !            13: extern         int     null_fn();
        !            14: 
        !            15: struct fn_def DstroyFn =
        !            16: {
        !            17:        "DESTROY",
        !            18:        destroy,
        !            19:        null_fn,
        !            20:        null_fn,
        !            21:        NULL,
        !            22:        0,
        !            23:        tTdbu,
        !            24:        100,
        !            25:        'Z',
        !            26:        0
        !            27: };
        !            28: 
        !            29: 
        !            30: /*
        !            31: **  DESTROY RELATION
        !            32: **
        !            33: **     The relations in pv are destroyed.  This involves three steps:
        !            34: **     1 - remove tuple from relation relation
        !            35: **     2 - remove tuples from attribute relation
        !            36: **     3 - unlink physical file
        !            37: **
        !            38: **     If the relation is a secondary index, the entry is removed
        !            39: **     from the index relation, and the primary relation is set to
        !            40: **     be "not indexed" (unless there is another index on it).
        !            41: **
        !            42: **     If the relation has an index, all its indexes are also
        !            43: **     destroyed.
        !            44: **
        !            45: **     If any errors occured while destroying the relations,
        !            46: **     then the last error number is returned, otherwise
        !            47: **     0 is returned.
        !            48: **
        !            49: **     If any query modification was defined on the relation,
        !            50: **     the qrymod catalogues are updated.
        !            51: **
        !            52: **     Trace Flags:
        !            53: **             32
        !            54: */
        !            55: 
        !            56: destroy(pc, pv)
        !            57: int    pc;
        !            58: PARM   *pv;
        !            59: {
        !            60:        register int    i, ret;
        !            61:        register char   *name;
        !            62: 
        !            63:        opencatalog("relation", OR_WRITE);
        !            64:        opencatalog("attribute", OR_WRITE);
        !            65: 
        !            66:        for (ret = 0; pc-- > 0; )
        !            67:        {
        !            68:                name = ((pv++)->pv_val).pv_str;
        !            69:                if (i = des(name))
        !            70:                        ret = i;
        !            71:        }
        !            72:        return (ret);
        !            73: }
        !            74: 
        !            75: 
        !            76: des(name)
        !            77: char   *name;
        !            78: {
        !            79:        register int    i;
        !            80:        register char   *relname;
        !            81:        struct tup_id   tid;
        !            82:        char            newrelname[MAXNAME + 3];
        !            83:        extern DESC     Reldes, Attdes, Inddes, Treedes;
        !            84:        struct relation relt, relk;
        !            85: 
        !            86:        relname = name;
        !            87: #      ifdef xZTR1
        !            88:        tTfp(32, -1, "destroy: %s\n", relname);
        !            89: #      endif
        !            90: 
        !            91:        newrelname[MAXNAME + 2] = 0;
        !            92: 
        !            93:        /* get the tuple from relation relation */
        !            94:        setkey(&Reldes, &relk, relname, RELID);
        !            95:        setkey(&Reldes, &relk, Usercode, RELOWNER);
        !            96:        if ((i = getequal(&Reldes, &relk, &relt, &tid)) != 0)
        !            97:        {
        !            98:                if (i < 0)
        !            99:                        syserr("DESTROY: geteq(rel/%s) %d", relname, i);
        !           100:                return (nferror(RELNOEXIST, relname, 0));       /* nonexistant relation */
        !           101:        }
        !           102: 
        !           103:        /* don't allow a system relation to be destroyed */
        !           104:        if (relt.relstat & S_CATALOG)
        !           105:                return (nferror(NODESTSYSREL, relname, 0));     /* attempt to destroy system catalog */
        !           106: 
        !           107:        if ((i = delete(&Reldes, &tid)) != 0)
        !           108:                syserr("DESTROY: delete(rel) %d", i);
        !           109: 
        !           110:        /*
        !           111:        ** for concurrency reasons, flush the relation-relation page
        !           112:        ** where the tuple was just deleted. This will prevent anyone
        !           113:        ** from being able to "openr" the relation while it is being
        !           114:        ** destroyed. It also allows recovery to finish the destroy
        !           115:        ** it the system crashes during this destroy.
        !           116:        */
        !           117:        if (i = flush_rel(&Reldes, FALSE))
        !           118:                syserr("destroy:flush rel %d", i);
        !           119: 
        !           120:        purgetup(&Attdes, relt.relid, ATTRELID, relt.relowner, ATTOWNER, 0);
        !           121: 
        !           122:        /*
        !           123:        **      If this is a user relation, then additional processing
        !           124:        **      might be needed to clean up indicies, protection constraints
        !           125:        **      etc.
        !           126:        */
        !           127:        if ((relt.relstat & S_CATALOG) == 0)
        !           128:                userdestroy(&relt);
        !           129: 
        !           130:        if ((relt.relstat & S_VIEW) == 0)
        !           131:        {
        !           132:                ingresname(relname, Usercode, newrelname);
        !           133:                if (unlink(newrelname) < 0)
        !           134:                        syserr("destroy: unlink(%.14s)", newrelname);
        !           135:        }
        !           136:        return (0);
        !           137: 
        !           138: }

unix.superglobalmegacorp.com

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