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

1.1     ! root        1: # include      <pv.h>
        !             2: # include      <func.h>
        !             3: # include      <symbol.h>
        !             4: # include      <ingres.h>
        !             5: # include      <aux.h>
        !             6: # include      <catalog.h>
        !             7: # include      <access.h>
        !             8: # include      <lock.h>
        !             9: # include      <sccs.h>
        !            10: # include      <errors.h>
        !            11: 
        !            12: SCCSID(@(#)index.c     8.5     2/8/85)
        !            13: 
        !            14: extern short   tTdbu[];
        !            15: extern int     indexx();
        !            16: extern int     null_fn();
        !            17: 
        !            18: struct fn_def  IndexFn =
        !            19: {
        !            20:        "INDEX",
        !            21:        indexx,
        !            22:        null_fn,
        !            23:        null_fn,
        !            24:        NULL,
        !            25:        0,
        !            26:        tTdbu,
        !            27:        100,
        !            28:        'Z',
        !            29:        0
        !            30: };
        !            31: 
        !            32: 
        !            33: /*
        !            34: **     This is the DBU routine INDEX
        !            35: **
        !            36: **  pc = # of parameters
        !            37: **  pv[0] points to primary relation name
        !            38: **  pv[1] points to index relation name
        !            39: **  pv[2] points to domain1
        !            40: **  pv[3] points to domain2
        !            41: **  .
        !            42: **  .
        !            43: **  .
        !            44: **  pv[pc] = NULL
        !            45: **
        !            46: */
        !            47: 
        !            48: struct dom
        !            49: {
        !            50:        int     id;
        !            51:        int     off;
        !            52:        int     frml;
        !            53:        char    frm[5];
        !            54: };
        !            55: 
        !            56: indexx(pc, pv)
        !            57: int    pc;
        !            58: PARM   pv[];
        !            59: {
        !            60:        register int            i;
        !            61:        int                     j;
        !            62:        register struct dom     *dom;
        !            63:        register PARM           *p;
        !            64:        char                    *primary, *indx;
        !            65:        int                     ndoms, newpc;
        !            66:        struct tup_id           tid, hitid;
        !            67:        struct tup_id           xtid;
        !            68:        PARM                    newpv[MAXKEYS * 2 + 4];
        !            69:        char                    primtup[MAXTUP], systup[MAXTUP];
        !            70:        DESC                    desc, pridesc;
        !            71:        extern DESC             Reldes;
        !            72:        extern DESC             Attdes;
        !            73:        extern DESC             Inddes;
        !            74:        struct relation         relkey, reltup;
        !            75:        struct attribute        attkey, atttup;
        !            76:        struct index            indtup;
        !            77:        struct dom              domain[MAXKEYS];
        !            78: 
        !            79:        primary = pv[0].pv_val.pv_str;
        !            80:        indx = pv[1].pv_val.pv_str;
        !            81: #      ifdef xZTR1
        !            82:        if (tTf(33, -1))
        !            83:                printf("index: (pri %s ind %s)\n", primary, indx);
        !            84: #      endif
        !            85:        i = openr(&pridesc, OR_READ, primary);
        !            86:        if (i == AMOPNVIEW_ERR)
        !            87:                return (error(NOINDVIEW, primary, 0));
        !            88:        if (i > 0)
        !            89:                return (error(NOPRIMREL, primary, 0));
        !            90:        if (i < 0)
        !            91:                syserr("INDEX : openr (%.14s) %d", primary, i);
        !            92: 
        !            93:        if (!bequal(pridesc.reldum.relowner, Usercode, UCODE_SZ))
        !            94:        {
        !            95:                i = NOTOWNED;
        !            96:        }
        !            97:        else if (pridesc.reldum.relstat & S_CATALOG)
        !            98:        {
        !            99:                i = NOINDXSYSREL;
        !           100:        }
        !           101:        else if (pridesc.reldum.relindxd == SECINDEX)
        !           102:        {
        !           103:                i = ALREADYINDX;
        !           104:        }
        !           105: 
        !           106:        if (i)
        !           107:        {
        !           108:                closer(&pridesc);
        !           109:                return (error(i, primary, 0));
        !           110:        }
        !           111:        /*
        !           112:        **  GATHER INFO. ON DOMAINS
        !           113:        */
        !           114:        opencatalog("attribute", OR_WRITE);
        !           115:        setkey(&Attdes, &attkey, primary, ATTRELID);
        !           116:        setkey(&Attdes, &attkey, pridesc.reldum.relowner, ATTOWNER);
        !           117:        pc -= 2;
        !           118:        p = &pv[2];
        !           119:        dom = domain;
        !           120:        for (i = 0; i < pc; i++)
        !           121:        {
        !           122:                if (i >= MAXKEYS)
        !           123:                {
        !           124:                        closer(&pridesc);
        !           125:                        return (error(TOOMUCHDOMS, (p->pv_val).pv_str, primary, 0));    /* too many keys */
        !           126:                }
        !           127:                setkey(&Attdes, &attkey, (p->pv_val).pv_str, ATTNAME);
        !           128:                j = getequal(&Attdes, &attkey, &atttup, &tid);
        !           129:                if (j < 0)
        !           130:                        syserr("INDEX: geteq att %d", j);
        !           131:                if (j)
        !           132:                {
        !           133:                        closer(&pridesc);
        !           134:                        return (error(NODOM, (p->pv_val).pv_str, 0));   /* key not in relation */
        !           135:                }
        !           136:                if (pridesc.reldum.reldim > 0 && atttup.attid == pridesc.reldum.relatts)
        !           137:                /* attempting to use lid field as part of index */
        !           138:                {
        !           139:                        closer(&pridesc);
        !           140:                        return(error(NOINDXLID, primary, (p->pv_val).pv_str, 0));
        !           141:                }
        !           142:                dom->id = atttup.attid;
        !           143:                dom->off = atttup.attoff;
        !           144:                dom->frml = atttup.attfrml & I1MASK;
        !           145:                dom->frm[0] = atttup.attfrmt;
        !           146:                p++;
        !           147:                dom++;
        !           148:        }
        !           149:        ndoms = i;
        !           150:        noclose(&Attdes);
        !           151: 
        !           152:        /*
        !           153:        ** The "order" of the steps have been altered to improve
        !           154:        ** recovery possibilities
        !           155:        */
        !           156:        /*
        !           157:        **  STEP 1 & 2: CREATE INDEX RELATION.
        !           158:        */
        !           159:        newpv[0].pv_val.pv_str = "0202";
        !           160:        newpv[1].pv_val.pv_str = indx;
        !           161:        newpc = 2;
        !           162:        p = &pv[2];
        !           163:        dom = domain;
        !           164:        for (i = 0; i < pc; i++)
        !           165:        {
        !           166:                newpv[newpc++].pv_val.pv_str = (p->pv_val).pv_str;
        !           167:                itoa(dom->frml, &dom->frm[1]);
        !           168:                newpv[newpc++].pv_val.pv_str = dom->frm;
        !           169:                dom++;
        !           170:                p++;
        !           171:        }
        !           172:        newpv[newpc++].pv_val.pv_str = "tidp";
        !           173:        newpv[newpc++].pv_val.pv_str = "i4";
        !           174:        newpv[newpc].pv_type = PV_EOF;
        !           175: 
        !           176:        if (create(newpc, newpv))
        !           177:        {
        !           178:                closer(&pridesc);
        !           179:                return (-1);
        !           180:        }
        !           181: 
        !           182:        /* This is done for concurrency reasons */
        !           183:        if (noclose(&Reldes))
        !           184:                syserr("index: noclose");
        !           185: 
        !           186:        /*
        !           187:        **  STEP 5: FILL UP THE SECONDARY INDEX FILE ITSELF
        !           188:        */
        !           189:        if (Lockrel)
        !           190:                /* set a shared relation lock */
        !           191:                setrll(A_SLP, *(long *) &pridesc.reltid, M_SHARE);      /* pardon the kludge  */
        !           192:        if (i = openr(&desc, OR_WRITE, indx))
        !           193:                syserr("INDEX: openr %.14s %d", indx, i);
        !           194:        find(&pridesc, NOKEY, &tid, &hitid);
        !           195:        while ((i = get(&pridesc, &tid, &hitid, primtup, TRUE)) == 0)
        !           196:        {
        !           197:                dom = domain;
        !           198:                for (i = j = 0; j < ndoms; j++)
        !           199:                {
        !           200:                        bmove(&primtup[dom->off], &systup[i], dom->frml);
        !           201:                        i += dom->frml;
        !           202:                        dom++;
        !           203:                }
        !           204:                bmove(&tid, &systup[i], sizeof tid);            /* move in pointer */
        !           205:                if ((j = insert(&desc, &xtid, systup, TRUE)) < 0)
        !           206:                        syserr("INDEX: insert %.14s %d", indx, j);
        !           207:        }
        !           208:        if (i < 0)
        !           209:                syserr("INDEX: get %.14s %d", primary, i);
        !           210:        closer(&pridesc);
        !           211:        closer(&desc);
        !           212: 
        !           213: 
        !           214:        /*
        !           215:        **  STEP 3: ENTRIES TO INDEX-REL
        !           216:        */
        !           217:        pmove(primary, indtup.irelidp, MAXNAME, ' ');           /* mv in primary name  */
        !           218:        bmove(pridesc.reldum.relowner, indtup.iownerp, 2);      /* primary owner */
        !           219:        pmove(indx, indtup.irelidi, MAXNAME, ' ');              /* index name */
        !           220:        indtup.irelspeci = M_HEAP;
        !           221:        for (i = 0; i < MAXKEYS; i++)
        !           222:                indtup.idom[i] = (i < ndoms) ? domain[i].id : 0;
        !           223:        opencatalog("indexes", OR_WRITE);
        !           224:        if ((i = insert(&Inddes, &tid, &indtup, TRUE)) < 0)
        !           225:                syserr("INDEX: insert ix %d", i);
        !           226: 
        !           227:        /*
        !           228:        **  STEP 4: TURN BIT ON IN PRIMARY RELATION TO SHOW IT IS BEING INDEXED
        !           229:        */
        !           230:        opencatalog("relation", OR_WRITE);
        !           231:        setkey(&Reldes, &relkey, primary, RELID);
        !           232:        setkey(&Reldes, &relkey, pridesc.reldum.relowner, RELOWNER);
        !           233:        if (i = getequal(&Reldes, &relkey, &reltup, &tid))
        !           234:                syserr("INDEX: geteq rel %d", i);
        !           235:        reltup.relindxd = SECBASE;
        !           236:        if ((i = replace(&Reldes, &tid, &reltup, TRUE)) < 0)
        !           237:                syserr("INDEX: replace rel %d", i);
        !           238: 
        !           239:        if (Lockrel)
        !           240:                unlrl(*(long *) &pridesc.reltid);       /* release relation lock */
        !           241: 
        !           242:        return (0);
        !           243: }

unix.superglobalmegacorp.com

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