|
|
BSD 4.3
# include <ingres.h>
# include <btree.h>
# include <sccs.h>
SCCSID(@(#)btreerange.c 8.1 12/31/84)
/*
** Btreerange finds the smallest and largest tids corresponding to
** the lids found between two given lids.
*/
btreerange(d, low_lid, high_lid, lotid, hitid)
DESC *d;
long low_lid[], high_lid[];
register TID *lotid, *hitid;
{
register int i;
long l, h, tid, temp;
struct locator block;
long page, t, last, hbtid, last_lid();
int done, first;
long start, next;
/* find tid corresponding to high lid */
page = RT;
for (i = 0; i < d->reldum.reldim; ++i)
{
if ((t = get_tid(page, high_lid[i], &block)) < 0)
syserr("get_tid error in btreerange, lid = %ld\n", high_lid[i]);
page = t;
}
hbtid = page;
/* find starting point of scan */
page = RT;
for (i = 0; i < d->reldum.reldim - 1; ++i)
{
last = last_lid(page) - 1;
if (low_lid[i] > last)
low_lid[i] = last;
if ((t = get_tid(page, low_lid[i], &block)) < 0)
syserr("get_tid error in btreerange, lid = %ld\n", low_lid[i]);
page = t;
}
first = 1;
last = last_lid(page) - 1;
if (low_lid[d->reldum.reldim - 1] > last)
low_lid[d->reldum.reldim - 1] = last;
start = low_lid[d->reldum.reldim - 1];
do
{
get_node(page, &block.page);
next = block.page.nexttree;
if ((tid = get_tid(page, start, &block)) < 0)
syserr("get_tid error in btreerange, lid = %ld\n", low_lid[d->reldum.reldim - 1]);
/* set high and low to intial value */
if (first)
{
first = 0;
pluck_page(&tid, &l);
pluck_page(&tid, &h);
}
page = block.pageno;
done = 0;
while (done == 0)
{
for (i = 0; i < block.page.nelmts && done == 0; ++i)
{
tid = block.page.node.leafnode.tid_pos[block.page.node.leafnode.tid_loc[i]];
pluck_page(&tid, &temp);
if (temp > h)
h = temp;
else if (temp < l)
l = temp;
if (tid == hbtid)
done = 1;
}
page = block.page.node.leafnode.nextleaf;
if (page == NULL)
done = 1;
else
get_node(page, &block.page);
}
start = 1;
} while (page = next && !done);
stuff_page(lotid, &l);
stuff_page(hitid, &h);
lotid->line_id = hitid->line_id = -1;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.