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

unix.superglobalmegacorp.com

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