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