|
|
1.1 ! root 1: # include <ingres.h> ! 2: # include <aux.h> ! 3: # include <symbol.h> ! 4: # include <access.h> ! 5: # include <lock.h> ! 6: # include <btree.h> ! 7: # include <sccs.h> ! 8: ! 9: SCCSID(@(#)find.c 8.1 12/31/84) ! 10: ! 11: ! 12: /* ! 13: ** Find - determine limits for scan of a relation ! 14: ** ! 15: ** Find determines the values of an initial TID ! 16: ** and an ending TID for scanning a relation. ! 17: ** The possible calls to find are: ! 18: ** ! 19: ** find(desc, NOKEY, lotid, hightid) ! 20: ** sets tids to scan entire relation ! 21: ** ! 22: ** find(desc, EXACTKEY, lotid, hightid, key) ! 23: ** sets tids according to structure ! 24: ** of the relation. Key should have ! 25: ** been build using setkey. ! 26: ** ! 27: ** find(desc, LRANGEKEY, lotid, hightid, keylow) ! 28: ** Finds lotid less then or equal to keylow ! 29: ** for isam relations. Otherwise scans whole relation. ! 30: ** This call should be followed by a call with HRANGEKEY. ! 31: ** ! 32: ** find(desc, HRANGEKEY, lotid, hightid, keyhigh) ! 33: ** Finds hightid greater than or equal to ! 34: ** keyhigh for isam relations. Otherwise sets ! 35: ** hightid to maximum scan. ! 36: ** ! 37: ** find(desc, FULLKEY, lotid, hightid, key) ! 38: ** Same as find with EXACTKEY and all keys ! 39: ** provided. This mode is used only by findbest ! 40: ** and replace. ! 41: ** ! 42: ** returns: ! 43: ** <0 fatal error ! 44: ** 0 success ! 45: ** ! 46: ** Trace Flags: ! 47: ** 22.0-8 ! 48: */ ! 49: ! 50: ! 51: find(d, mode, lotid, hightid, key) ! 52: register DESC *d; ! 53: int mode; ! 54: TID *lotid; ! 55: TID *hightid; ! 56: char *key; ! 57: { ! 58: register int ret; ! 59: bool keyok; ! 60: long pageid, lid[MAXLID], page; ! 61: long rhash(), get_tid(); ! 62: struct locator tid_id; ! 63: char *tp; ! 64: int i; ! 65: extern int Btree_fd; ! 66: ! 67: # ifdef xATR1 ! 68: if (tTf(22, 0)) ! 69: { ! 70: printf("find: m%d,s%d,%.14s\n", mode, d->reldum.relspec, d->reldum.relid); ! 71: if (mode != NOKEY) ! 72: printup(d, key); ! 73: } ! 74: # endif ! 75: ! 76: ret = 0; /* assume successful return */ ! 77: keyok = FALSE; ! 78: ! 79: switch (mode) ! 80: { ! 81: ! 82: case EXACTKEY: ! 83: keyok = fullkey(d); ! 84: break; ! 85: ! 86: case FULLKEY: ! 87: keyok = TRUE; ! 88: ! 89: case NOKEY: ! 90: case LRANGEKEY: ! 91: case HRANGEKEY: ! 92: case BTREEKEY: ! 93: break; ! 94: ! 95: default: ! 96: syserr("FIND: bad mode %d", mode); ! 97: } ! 98: ! 99: /* set lotid for beginning of scan */ ! 100: if (mode != HRANGEKEY) ! 101: { ! 102: pageid = 0; ! 103: stuff_page(lotid, &pageid); ! 104: lotid->line_id = -1; ! 105: } ! 106: ! 107: /* set hitid for end of scan */ ! 108: if (mode != LRANGEKEY) ! 109: { ! 110: pageid = -1; ! 111: stuff_page(hightid, &pageid); ! 112: hightid->line_id = -1; ! 113: } ! 114: ! 115: if (mode == BTREEKEY) ! 116: /* set tid to value as found using B-Tree */ ! 117: { ! 118: tp = key + d->reldum.relwid - LIDSIZE * d->reldum.reldim; ! 119: bmove(tp, lid, LIDSIZE * d->reldum.reldim); ! 120: Btree_fd = d->btree_fd; ! 121: page = RT; ! 122: for (i = 0; i < d->reldum.reldim; ++i) ! 123: { ! 124: pageid = get_tid(page, lid[i], &tid_id); ! 125: if (pageid < 0) ! 126: break; ! 127: page = pageid; ! 128: } ! 129: if (pageid >= 0) ! 130: bmove(&pageid, lotid, LIDSIZE); ! 131: ! 132: } ! 133: else if (mode != NOKEY) ! 134: { ! 135: switch (abs(d->reldum.relspec)) ! 136: { ! 137: ! 138: case M_HEAP: ! 139: break; ! 140: ! 141: case M_ISAM: ! 142: if (mode != HRANGEKEY) ! 143: { ! 144: /* compute lo limit */ ! 145: if (ret = ndxsearch(d, lotid, key, -1, keyok)) ! 146: break; /* fatal error */ ! 147: } ! 148: ! 149: /* if the full key was provided and mode is exact, then done */ ! 150: if (keyok) ! 151: { ! 152: bmove((char *) lotid, (char *) hightid, sizeof *lotid); ! 153: break; ! 154: } ! 155: ! 156: if (mode != LRANGEKEY) ! 157: ret = ndxsearch(d, hightid, key, 1, keyok); ! 158: break; ! 159: ! 160: case M_HASH: ! 161: if (!keyok) ! 162: break; /* can't do anything */ ! 163: pageid = rhash(d, key); ! 164: stuff_page(lotid, &pageid); ! 165: stuff_page(hightid, &pageid); ! 166: break; ! 167: ! 168: default: ! 169: ret = acc_err(AMFIND_ERR); ! 170: } ! 171: } ! 172: ! 173: # ifdef xATR2 ! 174: if (tTf(22, 1)) ! 175: { ! 176: printf("find: ret %d\tlow", ret); ! 177: dumptid(lotid); ! 178: printf("hi"); ! 179: dumptid(hightid); ! 180: } ! 181: # endif ! 182: return (ret); ! 183: } ! 184: /* ! 185: ** This routine will check that enough of the tuple has been specified ! 186: ** to enable a key access. ! 187: */ ! 188: ! 189: fullkey(des) ! 190: DESC *des; ! 191: { ! 192: register DESC *d; ! 193: register int i; ! 194: ! 195: d = des; ! 196: for (i = 1; i <= d->reldum.relatts; i++) ! 197: if (d->relxtra[i] && !d->relgiven[i]) ! 198: return (FALSE); ! 199: return (TRUE); ! 200: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.