2.11BSD/ingres/source/access/get.c
# include "../ingres.h"
# include "../aux.h"
# include "../access.h"
/*
** Get - get a single tuple
**
** Get either gets the next sequencial tuple after
** "tid" or else gets the tuple specified by tid.
**
** If getnxt == TRUE, then tid is incremented to the next
** tuple after tid. If there are no more, then get returns
** 1. Otherwise get returns 0 and "tid" is set to the tid of
** the returned tuple.
**
** Under getnxt mode, the previous page is reset before
** the next page is read. This is done to prevent the previous
** page from hanging around in the am's buffers when we "know"
** that it will not be referenced again.
**
** If getnxt == FALSE then the tuple specified by tid is
** returned. If the tuple was deleted previously,
** get retuns 2 else get returns 0.
**
** If getnxt is true, limtid holds the the page number
** of the first page past the end point. Limtid and the
** initial value of tid are set by calls to FIND.
**
** returns:
** <0 fatal error
** 0 success
** 1 end of scan (getnxt=TRUE only)
** 2 tuple deleted (getnxt=FALSE only)
*/
get(d, tid, limtid, tuple, getnxt)
struct descriptor *d;
struct tup_id *tid, *limtid;
int getnxt;
char *tuple;
{
register int i;
register struct tup_id *tidx;
long pageid, lpageid;
# ifdef xATR1
if (tTf(93, 0))
{
printf("get: %.14s,", d->relid);
dumptid(tid);
printf("get: lim");
dumptid(limtid);
}
# endif
tidx = tid;
if (get_page(d, tidx))
{
return (-1);
}
if (getnxt)
{
pluck_page(limtid, &lpageid);
do
{
while (((++(tidx->line_id)) & I1MASK) >= Acc_head->nxtlino)
{
tidx->line_id = -1;
pageid = Acc_head->ovflopg;
stuff_page(tidx, &pageid);
if (pageid == 0)
{
pageid = Acc_head->mainpg;
stuff_page(tidx, &pageid);
if (pageid == 0 || pageid == lpageid + 1)
return (1);
}
if (i = resetacc(Acc_head))
return (i);
if (i = get_page(d, tidx))
return (i);
}
} while (!Acc_head->linetab[-(tidx->line_id & I1MASK)]);
}
else
{
if (i = invalid(tidx))
return (i);
}
get_tuple(d, tidx, tuple);
# ifdef xATR2
if (tTf(93, 1))
{
printf("get: ");
printup(d, tuple);
}
# endif
return (0);
}