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

1.1     ! root        1: #
        !             2: # include      <sccs.h>
        !             3: 
        !             4: SCCSID(@(#)bndxsearch.c        8.1     12/31/84)
        !             5: /*
        !             6: **  BNDXSEARCH -- search an BTREE directory
        !             7: **     
        !             8: **     Looks for an available page, if this would force out a page from
        !             9: **     the relation it adds its own.  Searches each level of the dirctory
        !            10: **     for the lowest (highest) page on which the key could occur if mode
        !            11: **     is < (>) 0.  At each level the number of keys on the page is checked
        !            12: **     if it is <= SEARCHFUDGE a linear sharch is done, otherwize a binary
        !            13: **     search is preformed.  If the full key matches exactly the seach
        !            14: **     can stop.  Note that the keys tell the minimum value on that page.
        !            15: **
        !            16: **     Parameters:
        !            17: **             d       - pointer to descriptor of open relation
        !            18: **             tid     - returns tid of page to start (end) looking
        !            19: **             key     - to look for
        !            20: **             mode    - < 0 lowkey, > 0 hikey
        !            21: **             keyok   - true if all keys are assumed to be set
        !            22: **             path    - if non-null, is set to the tids of the access path
        !            23: **
        !            24: **     Returns:
        !            25: **             -2      - pageflush failure
        !            26: **             -1      - get_page failure
        !            27: **             0       - success
        !            28: **
        !            29: **     Side Effects:
        !            30: **             causes I/O
        !            31: **
        !            32: **     Requires:
        !            33: **             getpage, icompare, paramd, pageflush, top_acc, resetacc, etc.
        !            34: **
        !            35: **     Called By:
        !            36: **             find
        !            37: **
        !            38: **     History:
        !            39: **             Stolen from ndxsearch 7/26/80 (jiw)
        !            40: */
        !            41: 
        !            42: # include      <ingres.h>
        !            43: # include      <aux.h>
        !            44: # include      <symbol.h>
        !            45: # include      <access.h>
        !            46: # include      <lock.h>
        !            47: 
        !            48: # define       SEARCHFUDGE     6       /* # of linenos to do a binary search */
        !            49: 
        !            50: bndxsearch(d, tidx, tuple, mode, keyok, path)
        !            51: struct descriptor      *d;             
        !            52: struct tup_id          *tidx;          
        !            53: char                   tuple[];        
        !            54: int                    mode;   
        !            55: int                    keyok;
        !            56: struct tup_id          *path;
        !            57: {
        !            58:        register struct tup_id          *tid;
        !            59:        register int                    i;
        !            60:        long                            pageid;
        !            61:        int                             j, keylen, dno, partialkey;
        !            62:        char                            *p;
        !            63:        int                             pagerr;
        !            64:        struct accessparam              relparm;
        !            65:        int                             top;
        !            66:        register                        bottom;
        !            67:        extern char                     *get_addr();
        !            68: 
        !            69:        tid = tidx;
        !            70:        pagerr = 0;
        !            71:        paramd(d, &relparm);    /* get domains in key order */
        !            72: 
        !            73:        /* assume fullkey is given */
        !            74:        partialkey = FALSE;
        !            75: 
        !            76:        /* remove any key domains not given by the user */
        !            77:        if (!keyok)
        !            78:        {
        !            79:                for (i = 0; dno = relparm.keydno[i]; i++)
        !            80:                {
        !            81:                        if (d->relgiven[dno])
        !            82:                                continue;
        !            83:                        relparm.keydno[i] = 0;
        !            84:                        partialkey = TRUE;
        !            85:                        printf("partial key true\n");
        !            86:                        break;
        !            87:                }
        !            88:        }
        !            89: 
        !            90:        /* if the first key isn't given, just return else search directory */
        !            91:        if (relparm.keydno[0] != 0)
        !            92:        {
        !            93:                /* The actual BTREE directory search must be performed */
        !            94:                pageid = 0;             /* BTREE root is page 0 */
        !            95:                stuff_page(tid, &pageid);
        !            96: 
        !            97:                Acclock = FALSE;
        !            98: 
        !            99:                do
        !           100:                {
        !           101:                        if (path)
        !           102:                        {
        !           103:                                bmove(tid, path++, sizeof(struct tup_id));
        !           104:                        }
        !           105: 
        !           106:                        if (pagerr = get_page(d, tid))
        !           107:                                break;  /* fatal error */
        !           108:                        Acc_head->bufstatus |= BUF_DIRECT;  /* don't get confused */
        !           109:                        bottom = -1;
        !           110:                        top = Acc_head->nxtlino - 1;
        !           111:                        if (top >= SEARCHFUDGE)  /* we are past breakeven */
        !           112:                        {
        !           113:                                printf("doing binary search\n");
        !           114:                                while (top != bottom)   /* binary search */
        !           115:                                {
        !           116:                                        tid->line_id = ((1 + top - bottom) >> 1) + bottom;      /* get to half way point */
        !           117:                                        p = get_addr(tid) + PGPTRSIZ;
        !           118:                                        for (j = 0; dno = relparm.keydno[j]; j++)
        !           119:                                        {
        !           120:                                                keylen = d->relfrml[dno] & I1MASK;
        !           121:                                                printf("data: ");
        !           122:                                                printatt(d->relfrmt[dno], keylen, p);
        !           123:                                                printf("| compared with: ");
        !           124:                                                printatt(d->relfrmt[dno], keylen, &tuple[d->reloff[dno]]);
        !           125:                                                printf("|\n");
        !           126:                                                if (i = icompare(&tuple[d->reloff[dno]], p, d->relfrmt[dno], keylen))
        !           127:                                                        break;
        !           128:                                                p += keylen;
        !           129:                                        }
        !           130:                                        /* if key is below directory, then we are in the bottom half */
        !           131:                                        printf("i = %d, mode %d, partialkey %d, top %d, bottom %d\n", i, mode, partialkey, top, bottom);
        !           132:                                        if (i < 0 || (i == 0 && partialkey && mode < 0))
        !           133:                                                top = tid->line_id - 1;
        !           134: 
        !           135:                                        else if (i == 0 && !partialkey)
        !           136:                                        {
        !           137:                                                bottom = tid->line_id;
        !           138:                                                break;
        !           139:                                        }
        !           140:                                        else
        !           141:                                                bottom = tid->line_id;
        !           142:                                }
        !           143:                        }
        !           144:                        else    /* do a linear search */
        !           145:                        {
        !           146:                                printf("doing linear search\n");
        !           147:                                for (tid->line_id = 0; (tid->line_id & I1MASK) < Acc_head->nxtlino; tid->line_id++)
        !           148:                                {
        !           149:                                        printf("inside loop: tid\n");
        !           150:                                        dumptid(tid);
        !           151:                                        p = get_addr(tid) + PGPTRSIZ;
        !           152:                                        for (i = 0; dno = relparm.keydno[i]; i++)
        !           153:                                        {
        !           154:                                                keylen = d->relfrml[dno] & I1MASK;
        !           155:                                                printf("data: ");
        !           156:                                                printatt(d->relfrmt[dno], keylen, p);
        !           157:                                                printf("| compared with: ");
        !           158:                                                printatt(d->relfrmt[dno], keylen, &tuple[d->reloff[dno]]);
        !           159:                                                printf("|\n");
        !           160:                                                if (j = icompare(&tuple[d->reloff[dno]], p, d->relfrmt[dno], keylen))
        !           161:                                                        break;
        !           162:                                                printf("after break in tuple comp\n");
        !           163:                                                p += keylen;
        !           164:                                        }
        !           165:                                        /* if key is below directory, then we have passed the position */
        !           166: 
        !           167:                                        printf("j = %d, mode %d, partialkey %d\n", j, mode, partialkey);
        !           168:                                        if (j < 0)
        !           169:                                                break;
        !           170: 
        !           171:                                        /* if lowkey search on partial key matches, then done */
        !           172:                                        if (j == 0 && partialkey && mode < 0)
        !           173:                                                break;
        !           174:                                        if (j == 0 && mode < 0)
        !           175:                                        {
        !           176:                                                break;
        !           177:                                        }
        !           178:                                }
        !           179:                        }
        !           180:                        if (bottom < 0)
        !           181:                                p = Acc_head->firstup;
        !           182:                        else
        !           183:                        {
        !           184:                                tid->line_id = bottom;
        !           185:                                p = get_addr(tid);
        !           186:                        }
        !           187:                        printf("result: ");
        !           188:                        dumptid(tid);
        !           189:                        bmove(p, tid, PGPTRSIZ);
        !           190:                        printf("and next tid: ");
        !           191:                        dumptid(tid);
        !           192:                } while (Acc_head->mainpg);  /* if at level zero then done */
        !           193:                Acclock = TRUE;
        !           194:        
        !           195:        }
        !           196:        tid->line_id = -1;
        !           197: 
        !           198:        if (path)
        !           199:        {
        !           200:                bmove(tid, path++, sizeof(struct tup_id));
        !           201:                path->line_id = -2;             /* impossible value */
        !           202:        }
        !           203: 
        !           204:        printf("final: ");
        !           205:        dumptid(tid);
        !           206:        return (pagerr);
        !           207: }

unix.superglobalmegacorp.com

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