|
|
1.1 root 1: # include <ingres.h>
2: # include <btree.h>
3: # include <sccs.h>
4:
5: SCCSID(@(#)btreerange.c 8.1 12/31/84)
6:
7: /*
8: ** Btreerange finds the smallest and largest tids corresponding to
9: ** the lids found between two given lids.
10: */
11:
12: btreerange(d, low_lid, high_lid, lotid, hitid)
13:
14: DESC *d;
15: long low_lid[], high_lid[];
16: register TID *lotid, *hitid;
17: {
18: register int i;
19: long l, h, tid, temp;
20: struct locator block;
21: long page, t, last, hbtid, last_lid();
22: int done, first;
23: long start, next;
24:
25: /* find tid corresponding to high lid */
26: page = RT;
27: for (i = 0; i < d->reldum.reldim; ++i)
28: {
29: if ((t = get_tid(page, high_lid[i], &block)) < 0)
30: syserr("get_tid error in btreerange, lid = %ld\n", high_lid[i]);
31: page = t;
32: }
33: hbtid = page;
34: /* find starting point of scan */
35: page = RT;
36: for (i = 0; i < d->reldum.reldim - 1; ++i)
37: {
38: last = last_lid(page) - 1;
39: if (low_lid[i] > last)
40: low_lid[i] = last;
41: if ((t = get_tid(page, low_lid[i], &block)) < 0)
42: syserr("get_tid error in btreerange, lid = %ld\n", low_lid[i]);
43: page = t;
44: }
45: first = 1;
46: last = last_lid(page) - 1;
47: if (low_lid[d->reldum.reldim - 1] > last)
48: low_lid[d->reldum.reldim - 1] = last;
49: start = low_lid[d->reldum.reldim - 1];
50: do
51: {
52: get_node(page, &block.page);
53: next = block.page.nexttree;
54: if ((tid = get_tid(page, start, &block)) < 0)
55: syserr("get_tid error in btreerange, lid = %ld\n", low_lid[d->reldum.reldim - 1]);
56: /* set high and low to intial value */
57: if (first)
58: {
59: first = 0;
60: pluck_page(&tid, &l);
61: pluck_page(&tid, &h);
62: }
63: page = block.pageno;
64: done = 0;
65: while (done == 0)
66: {
67: for (i = 0; i < block.page.nelmts && done == 0; ++i)
68: {
69: tid = block.page.node.leafnode.tid_pos[block.page.node.leafnode.tid_loc[i]];
70: pluck_page(&tid, &temp);
71: if (temp > h)
72: h = temp;
73: else if (temp < l)
74: l = temp;
75: if (tid == hbtid)
76: done = 1;
77: }
78: page = block.page.node.leafnode.nextleaf;
79: if (page == NULL)
80: done = 1;
81: else
82: get_node(page, &block.page);
83: }
84: start = 1;
85: } while (page = next && !done);
86: stuff_page(lotid, &l);
87: stuff_page(hitid, &h);
88: lotid->line_id = hitid->line_id = -1;
89: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.