Annotation of 43BSD/ingres/source/iutil/replace.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <access.h>
        !             3: # include      <catalog.h>
        !             4: # include      <batch.h>
        !             5: # include      <btree.h>
        !             6: # include      <sccs.h>
        !             7: 
        !             8: SCCSID(@(#)replace.c   8.2     2/8/85)
        !             9: 
        !            10: # define       SAMETUP         0
        !            11: # define       SAMEKEYS        1
        !            12: # define       DIFFTUP         2
        !            13: 
        !            14: /*
        !            15: **  REPLACE - replace an already existing tuple
        !            16: **
        !            17: **     Replace will replace the tuple specified by TID
        !            18: **     with the new tuple. An attempt is made to not
        !            19: **     move the tuple if at all possible.
        !            20: **
        !            21: **     Three separate conditions are dealt with. If the
        !            22: **     new tuple is the same as the old tuple, a return 
        !            23: **     of zero occures and the page is not changed.
        !            24: **
        !            25: **     If the keys(if any) are the same and the canonical
        !            26: **     tuple lengths are the same, then the new tuple will
        !            27: **     be placed in the same location.
        !            28: **
        !            29: **     If the lengths or the keys are different, then the
        !            30: **     tuple is deleted and the new tuple inserted
        !            31: **
        !            32: **     Checkdups specifies whether to check for duplicates.
        !            33: **     If the new tuple is a duplicate of one already there,
        !            34: **     then the tuple at TID is deleted
        !            35: **
        !            36: **     Returns:
        !            37: **             <0  fatal error
        !            38: **              1(DUPTUP)  new tuple was duplicate of returned tid
        !            39: **              2(DELTUP) tuple identified by tid has been deleted
        !            40: **              3(BADLID) bad lid
        !            41: **
        !            42: **             If replace returns 1 then tid is set to the
        !            43: **             duplicate tuple. This is necessary for updating
        !            44: **             secondary indices.
        !            45: **
        !            46: **     Trace Flags:
        !            47: **             24.4-7
        !            48: */
        !            49: 
        !            50: 
        !            51: replace(d, tid, tuple, checkdups)      
        !            52: register DESC  *d;
        !            53: register TID   *tid;
        !            54: char           *tuple;
        !            55: int            checkdups;
        !            56: {
        !            57:        register int    i;
        !            58:        int             j;
        !            59:        char            oldtuple[MAXTUP];
        !            60:        TID             primtid, tidloc, tidpos;
        !            61:        long            primpage, old_lid[MAXLID], new_lid[MAXLID], page, t;
        !            62:        int             need, same, numatts;
        !            63:        int             len, oldlength;
        !            64:        char            *new, *old, *oldt;
        !            65:        char            *getint_tuple();
        !            66:        char            btree[MAXNAME + 4];
        !            67:        long            oldtid;
        !            68:        int             lidwid, compare;
        !            69:        struct locator  temp;
        !            70: 
        !            71: #      ifdef xATR1
        !            72:        if (tTf(24, 4))
        !            73:        {
        !            74:                printf("replace: %.14s,", d->reldum.relid);
        !            75:                dumptid(tid);
        !            76:                printf("replace: ");
        !            77:                printup(d, tuple);
        !            78:        }
        !            79: #      endif
        !            80: 
        !            81:        /* make tuple canonical */
        !            82:        need = canonical(d, tuple);
        !            83: 
        !            84:        /* if heap or ordered, no dup checking */
        !            85:        if (abs(d->reldum.relspec) == M_HEAP || d->reldum.reldim > 0)
        !            86:                checkdups = FALSE;
        !            87: 
        !            88:        if (i = get_page(d, tid))
        !            89:                return (i);     /* fatal error */
        !            90: 
        !            91:        /* check if tid exists */
        !            92:        if (i = invalid(tid))
        !            93:                return (i);     /* already deleted or invalid */
        !            94: 
        !            95:        oldt = getint_tuple(d, tid, oldtuple);
        !            96:        /* reset page back to main relation page */
        !            97:        if (i = get_page(d, tid))
        !            98:                return(i);
        !            99:        oldlength = tup_len(tid);
        !           100:        lidwid = LIDSIZE * d->reldum.reldim;
        !           101: 
        !           102:        if (d->reldum.reldim > 0)
        !           103:        {
        !           104:                /* extract lid values from tuples */
        !           105:                btreename(d->reldum.relid, btree);
        !           106:                old = oldt + d->reldum.relwid  - lidwid;
        !           107:                bmove(old, old_lid, lidwid);
        !           108:                new = tuple + d->reldum.relwid - lidwid;
        !           109:                bmove(new, new_lid, lidwid);
        !           110:                compare = 0;
        !           111:                for (i = 0; i < d->reldum.reldim; ++i)
        !           112:                {
        !           113:                        if (new_lid[i] > old_lid[i])
        !           114:                        {
        !           115:                                compare = 1;
        !           116:                                break;
        !           117:                        }
        !           118:                        else if (new_lid[i] == old_lid[i])
        !           119:                                compare = -1;
        !           120:                        else
        !           121:                        {
        !           122:                                compare = 0;
        !           123:                                break;
        !           124:                        }
        !           125:                }
        !           126:                if (compare >= 0)
        !           127:                {
        !           128:                /* do insertion and deletion of new lid and old values in
        !           129:                ** order that insures that they will be placed in the proper
        !           130:                ** place
        !           131:                */
        !           132:                        if (compare == 1)
        !           133:                        {
        !           134:                                if (insert_mbtree(d, btree, new_lid, tid, &tidpos) < 0)
        !           135:                                        return(BADLID);
        !           136:                                if (fwrite(old_lid, 1, lidwid, Del_infp) != lidwid)
        !           137:                                        syserr("write error in replace");
        !           138:                                ++Del_cnt;
        !           139:                        }
        !           140:                        else if (compare == 0)
        !           141:                        {
        !           142:                                page = RT;
        !           143:                                for (j = 0; j < d->reldum.reldim; ++j)
        !           144:                                {
        !           145:                                        if (new_lid[j] > 0 && (t = get_tid(page, new_lid[j], &temp)) > 0)
        !           146:                                                page = t;
        !           147:                                        else if (t == -1)
        !           148:                                        {
        !           149:                                                for (i = j + 1; i < d->reldum.reldim; ++i)
        !           150:                                                {
        !           151:                                                        if (new_lid[i] != 1 && new_lid[i] != 0)
        !           152:                                                                return(BADLID);
        !           153:                                                }
        !           154:                                                break;
        !           155:                                        }
        !           156:                                        else if (new_lid[j] == 0)
        !           157:                                        {
        !           158:                                                for (i = j + 1; i < d->reldum.reldim; ++i)
        !           159:                                                {
        !           160:                                                        if (new_lid[i] != 0)
        !           161:                                                                return(BADLID);
        !           162:                                                }
        !           163:                                                break;
        !           164:                                        }
        !           165:                                        else
        !           166:                                                return(BADLID);
        !           167:                                }
        !           168:                                for (i = 0; i < d->reldum.reldim; ++i)
        !           169:                                        if (new_lid[i] < 0)
        !           170:                                                return(BADLID);
        !           171:                                delete_btree(old_lid, d->reldum.reldim);
        !           172:                                if (insert_mbtree(d, btree, new_lid, tid, &tidpos) < 0)
        !           173:                                        return(BADLID);
        !           174:                        }
        !           175:                }
        !           176:        }
        !           177: 
        !           178:        /* check whether tuples are the same, different lengths, different keys */
        !           179:        same = DIFFTUP; /* assume diff lengths or keys */
        !           180:        if (oldlength == need)
        !           181:        {
        !           182:                /* same size. check for same domains */
        !           183:                same = SAMETUP; /* assume identical */
        !           184:                new = tuple;
        !           185:                old = oldt;
        !           186:                /* ignore lid field */
        !           187:                numatts = d->reldum.relatts - d->reldum.reldim;
        !           188:                for (i = 1; i <= numatts; i++)
        !           189:                {
        !           190:                        len = d->relfrml[i] & I1MASK;
        !           191:                        if (icompare(new, old, d->relfrmt[i], len))
        !           192:                        {
        !           193:                                if (d->relxtra[i])
        !           194:                                {
        !           195:                                        same = DIFFTUP;
        !           196:                                        break;
        !           197:                                }
        !           198:                                same = SAMEKEYS;
        !           199:                        }
        !           200:                        old += len;
        !           201:                        new += len;
        !           202:                }
        !           203:        }
        !           204: 
        !           205: #      ifdef xATR2
        !           206:        if (tTf(24, 5))
        !           207:                printf("replace:same=%d\n", same);
        !           208: #      endif
        !           209: 
        !           210:        switch (same)
        !           211:        {
        !           212: 
        !           213:          case SAMETUP:
        !           214:                /* new tuple same as old tuple */
        !           215:                i = DUPTUP;     /* flag as duplicate */
        !           216:                /* though character strings may compare equal,
        !           217:                **  they can look different, so if they do look different
        !           218:                **  go ahead and do the replace using put_tuple.  */
        !           219:                if (!bequal(tuple, oldt, d->reldum.relwid - lidwid))
        !           220:                        goto puttuple;
        !           221:                break;
        !           222: 
        !           223:          case SAMEKEYS:
        !           224:                /* keys the same, lengths the same, tuples different */
        !           225:                if (checkdups)
        !           226:                {
        !           227:                        /* This is either an ISAM or HASH file. If mainpg
        !           228:                        ** is non-zero, then the primary page=mainpg -1.
        !           229:                        ** Otherwise, "find" must be called to determine
        !           230:                        ** the primary page
        !           231:                        */
        !           232:                        if (Acc_head->mainpg)
        !           233:                        {
        !           234:                                primpage = Acc_head->mainpg -1;
        !           235:                                stuff_page(&primtid, &primpage);
        !           236:                        }
        !           237:                        else
        !           238:                        {
        !           239:                                if (i = find(d, FULLKEY, &primtid, &primtid, tuple))
        !           240:                                        return (i);     /* fatal error */
        !           241:                                if (i = get_page(d, tid))       /* restore page for tuple */
        !           242:                                        return (i);
        !           243:                        }
        !           244:        
        !           245:                        if (i = scan_dups(d, &primtid, tuple))
        !           246:                        {
        !           247:                                if (i == DUPTUP)
        !           248:                                {
        !           249:                                        del_tuple(tid, oldlength);      /* tuple a duplicate */
        !           250:                                        d->reladds--;
        !           251:                                        /* copy tid of duplicate tuple */
        !           252:                                        bmove(&primtid, tid, sizeof(primtid));
        !           253:                                }
        !           254:                                break;
        !           255:                        }
        !           256:                }
        !           257:                goto puttuple;
        !           258: 
        !           259:          case DIFFTUP:
        !           260:                /* keys different or lengths different */
        !           261:                get_page(d, tid);
        !           262:                del_tuple(tid, oldlength);
        !           263:                bmove(tid, &oldtid, LIDSIZE);
        !           264: 
        !           265:                /* find where to put tuple */
        !           266:                if (i = findbest(d, tid, tuple, need, checkdups))
        !           267:                {
        !           268:                        d->reladds--;
        !           269:                        break;
        !           270:                }
        !           271: 
        !           272:                /* place new tuple in page */
        !           273:        puttuple:
        !           274:                put_tuple(tid, Acctuple, need);
        !           275:                i = NEWTUP;
        !           276: 
        !           277:                if (same == DIFFTUP && d->reldum.reldim > 0)
        !           278:                {
        !           279:                        /* main tid value has changed, update btree */
        !           280:                        if (compare < 0)
        !           281:                                search_btree(oldtid, &tidpos);
        !           282:                        /* tid different, must be reflected in BTree */
        !           283:                                replace_btree(*tid, &tidpos);
        !           284:                }
        !           285:        }
        !           286: 
        !           287: #      ifdef xATR1
        !           288:        if (tTf(24, 6))
        !           289:        {
        !           290:                printf("replace rets %d,", i);
        !           291:                dumptid(tid);
        !           292:        }
        !           293: #      endif
        !           294:        return (i);
        !           295: }

unix.superglobalmegacorp.com

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