1
0
mirror of https://github.com/postgres/postgres.git synced 2025-09-03 15:22:11 +03:00

Restructure indexscan API (index_beginscan, index_getnext) per

yesterday's proposal to pghackers.  Also remove unnecessary parameters
to heap_beginscan, heap_rescan.  I modified pg_proc.h to reflect the
new numbers of parameters for the AM interface routines, but did not
force an initdb because nothing actually looks at those fields.
This commit is contained in:
Tom Lane
2002-05-20 23:51:44 +00:00
parent c961474c96
commit 44fbe20d62
59 changed files with 834 additions and 1283 deletions

View File

@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.90 2001/10/25 05:49:42 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.91 2002/05/20 23:51:43 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -198,12 +198,7 @@ inv_getsize(LargeObjectDesc *obj_desc)
uint32 lastbyte = 0;
ScanKeyData skey[1];
IndexScanDesc sd;
RetrieveIndexResult indexRes;
HeapTupleData tuple;
Buffer buffer;
Form_pg_largeobject data;
bytea *datafield;
bool pfreeit;
HeapTuple tuple;
Assert(PointerIsValid(obj_desc));
@@ -213,10 +208,8 @@ inv_getsize(LargeObjectDesc *obj_desc)
(RegProcedure) F_OIDEQ,
ObjectIdGetDatum(obj_desc->id));
sd = index_beginscan(obj_desc->index_r, true, 1, skey);
tuple.t_datamcxt = CurrentMemoryContext;
tuple.t_data = NULL;
sd = index_beginscan(obj_desc->heap_r, obj_desc->index_r,
SnapshotNow, 1, skey);
/*
* Because the pg_largeobject index is on both loid and pageno, but we
@@ -224,15 +217,14 @@ inv_getsize(LargeObjectDesc *obj_desc)
* large object in reverse pageno order. So, it's sufficient to
* examine the first valid tuple (== last valid page).
*/
while ((indexRes = index_getnext(sd, BackwardScanDirection)))
while ((tuple = index_getnext(sd, BackwardScanDirection)) != NULL)
{
tuple.t_self = indexRes->heap_iptr;
heap_fetch(obj_desc->heap_r, SnapshotNow, &tuple, &buffer, sd);
pfree(indexRes);
if (tuple.t_data == NULL)
continue;
Form_pg_largeobject data;
bytea *datafield;
bool pfreeit;
found = true;
data = (Form_pg_largeobject) GETSTRUCT(&tuple);
data = (Form_pg_largeobject) GETSTRUCT(tuple);
datafield = &(data->data);
pfreeit = false;
if (VARATT_IS_EXTENDED(datafield))
@@ -244,7 +236,6 @@ inv_getsize(LargeObjectDesc *obj_desc)
lastbyte = data->pageno * LOBLKSIZE + getbytealen(datafield);
if (pfreeit)
pfree(datafield);
ReleaseBuffer(buffer);
break;
}
@@ -306,12 +297,7 @@ inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes)
uint32 pageoff;
ScanKeyData skey[2];
IndexScanDesc sd;
RetrieveIndexResult indexRes;
HeapTupleData tuple;
Buffer buffer;
Form_pg_largeobject data;
bytea *datafield;
bool pfreeit;
HeapTuple tuple;
Assert(PointerIsValid(obj_desc));
Assert(buf != NULL);
@@ -331,21 +317,16 @@ inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes)
(RegProcedure) F_INT4GE,
Int32GetDatum(pageno));
sd = index_beginscan(obj_desc->index_r, false, 2, skey);
sd = index_beginscan(obj_desc->heap_r, obj_desc->index_r,
SnapshotNow, 2, skey);
tuple.t_datamcxt = CurrentMemoryContext;
tuple.t_data = NULL;
while ((indexRes = index_getnext(sd, ForwardScanDirection)))
while ((tuple = index_getnext(sd, ForwardScanDirection)) != NULL)
{
tuple.t_self = indexRes->heap_iptr;
heap_fetch(obj_desc->heap_r, SnapshotNow, &tuple, &buffer, sd);
pfree(indexRes);
Form_pg_largeobject data;
bytea *datafield;
bool pfreeit;
if (tuple.t_data == NULL)
continue;
data = (Form_pg_largeobject) GETSTRUCT(&tuple);
data = (Form_pg_largeobject) GETSTRUCT(tuple);
/*
* We assume the indexscan will deliver pages in order. However,
@@ -389,7 +370,6 @@ inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes)
pfree(datafield);
}
ReleaseBuffer(buffer);
if (nread >= nbytes)
break;
}
@@ -409,9 +389,7 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
int32 pageno = (int32) (obj_desc->offset / LOBLKSIZE);
ScanKeyData skey[2];
IndexScanDesc sd;
RetrieveIndexResult indexRes;
HeapTupleData oldtuple;
Buffer buffer;
HeapTuple oldtuple;
Form_pg_largeobject olddata;
bool neednextpage;
bytea *datafield;
@@ -453,12 +431,11 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
(RegProcedure) F_INT4GE,
Int32GetDatum(pageno));
sd = index_beginscan(obj_desc->index_r, false, 2, skey);
sd = index_beginscan(obj_desc->heap_r, obj_desc->index_r,
SnapshotNow, 2, skey);
oldtuple.t_datamcxt = CurrentMemoryContext;
oldtuple.t_data = NULL;
oldtuple = NULL;
olddata = NULL;
buffer = InvalidBuffer;
neednextpage = true;
while (nwritten < nbytes)
@@ -470,17 +447,10 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
*/
if (neednextpage)
{
while ((indexRes = index_getnext(sd, ForwardScanDirection)))
if ((oldtuple = index_getnext(sd, ForwardScanDirection)) != NULL)
{
oldtuple.t_self = indexRes->heap_iptr;
heap_fetch(obj_desc->heap_r, SnapshotNow, &oldtuple, &buffer, sd);
pfree(indexRes);
if (oldtuple.t_data != NULL)
{
olddata = (Form_pg_largeobject) GETSTRUCT(&oldtuple);
Assert(olddata->pageno >= pageno);
break;
}
olddata = (Form_pg_largeobject) GETSTRUCT(oldtuple);
Assert(olddata->pageno >= pageno);
}
neednextpage = false;
}
@@ -538,7 +508,7 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
memset(replace, ' ', sizeof(replace));
values[Anum_pg_largeobject_data - 1] = PointerGetDatum(&workbuf);
replace[Anum_pg_largeobject_data - 1] = 'r';
newtup = heap_modifytuple(&oldtuple, obj_desc->heap_r,
newtup = heap_modifytuple(oldtuple, obj_desc->heap_r,
values, nulls, replace);
simple_heap_update(obj_desc->heap_r, &newtup->t_self, newtup);
if (write_indices)
@@ -549,9 +519,7 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
/*
* We're done with this old page.
*/
ReleaseBuffer(buffer);
oldtuple.t_datamcxt = CurrentMemoryContext;
oldtuple.t_data = NULL;
oldtuple = NULL;
olddata = NULL;
neednextpage = true;
}
@@ -596,9 +564,6 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
pageno++;
}
if (olddata != NULL)
ReleaseBuffer(buffer);
index_endscan(sd);
if (write_indices)