{
OffsetNumber mid = low + ((high - low) / 2);
- pitem = (PostingItem *) GinDataPageGetItem(page, mid);
+ pitem = GinDataPageGetPostingItem(page, mid);
if (mid == maxoff)
{
}
else
{
- pitem = (PostingItem *) GinDataPageGetItem(page, mid);
+ pitem = GinDataPageGetPostingItem(page, mid);
result = ginCompareItemPointers(btree->items + btree->curitem, &(pitem->key));
}
Assert(high >= FirstOffsetNumber && high <= maxoff);
stack->off = high;
- pitem = (PostingItem *) GinDataPageGetItem(page, high);
+ pitem = GinDataPageGetPostingItem(page, high);
return PostingItemGetBlockNumber(pitem);
}
{
OffsetNumber mid = low + ((high - low) / 2);
- result = ginCompareItemPointers(btree->items + btree->curitem, (ItemPointer) GinDataPageGetItem(page, mid));
+ result = ginCompareItemPointers(btree->items + btree->curitem,
+ GinDataPageGetItemPointer(page, mid));
if (result == 0)
{
/* if page isn't changed, we return storedOff */
if (storedOff >= FirstOffsetNumber && storedOff <= maxoff)
{
- pitem = (PostingItem *) GinDataPageGetItem(page, storedOff);
+ pitem = GinDataPageGetPostingItem(page, storedOff);
if (PostingItemGetBlockNumber(pitem) == blkno)
return storedOff;
*/
for (i = storedOff + 1; i <= maxoff; i++)
{
- pitem = (PostingItem *) GinDataPageGetItem(page, i);
+ pitem = GinDataPageGetPostingItem(page, i);
if (PostingItemGetBlockNumber(pitem) == blkno)
return i;
}
/* last chance */
for (i = FirstOffsetNumber; i <= maxoff; i++)
{
- pitem = (PostingItem *) GinDataPageGetItem(page, i);
+ pitem = GinDataPageGetPostingItem(page, i);
if (PostingItemGetBlockNumber(pitem) == blkno)
return i;
}
Assert(GinPageIsData(page));
Assert(GinPageGetOpaque(page)->maxoff >= FirstOffsetNumber);
- pitem = (PostingItem *) GinDataPageGetItem(page, FirstOffsetNumber);
+ pitem = GinDataPageGetPostingItem(page, FirstOffsetNumber);
return PostingItemGetBlockNumber(pitem);
}
/*
- * add ItemPointer or PostingItem to page. data should point to
- * correct value! depending on leaf or non-leaf page
+ * add ItemPointer to a leaf page.
*/
void
-GinDataPageAddItem(Page page, void *data, OffsetNumber offset)
+GinDataPageAddItemPointer(Page page, ItemPointer data, OffsetNumber offset)
{
OffsetNumber maxoff = GinPageGetOpaque(page)->maxoff;
char *ptr;
+ Assert(GinPageIsLeaf(page));
+
+ if (offset == InvalidOffsetNumber)
+ {
+ ptr = (char *) GinDataPageGetItemPointer(page, maxoff + 1);
+ }
+ else
+ {
+ ptr = (char *) GinDataPageGetItemPointer(page, offset);
+ if (maxoff + 1 - offset != 0)
+ memmove(ptr + sizeof(ItemPointerData),
+ ptr,
+ (maxoff - offset + 1) * sizeof(ItemPointerData));
+ }
+ memcpy(ptr, data, sizeof(ItemPointerData));
+
+ GinPageGetOpaque(page)->maxoff++;
+}
+
+/*
+ * add PostingItem to a non-leaf page.
+ */
+void
+GinDataPageAddPostingItem(Page page, PostingItem *data, OffsetNumber offset)
+{
+ OffsetNumber maxoff = GinPageGetOpaque(page)->maxoff;
+ char *ptr;
+
+ Assert(!GinPageIsLeaf(page));
+
if (offset == InvalidOffsetNumber)
{
- ptr = GinDataPageGetItem(page, maxoff + 1);
+ ptr = (char *) GinDataPageGetPostingItem(page, maxoff + 1);
}
else
{
- ptr = GinDataPageGetItem(page, offset);
+ ptr = (char *) GinDataPageGetPostingItem(page, offset);
if (maxoff + 1 - offset != 0)
- memmove(ptr + GinSizeOfDataPageItem(page),
+ memmove(ptr + sizeof(PostingItem),
ptr,
- (maxoff - offset + 1) * GinSizeOfDataPageItem(page));
+ (maxoff - offset + 1) * sizeof(PostingItem));
}
- memcpy(ptr, data, GinSizeOfDataPageItem(page));
+ memcpy(ptr, data, sizeof(PostingItem));
GinPageGetOpaque(page)->maxoff++;
}
Assert(offset >= FirstOffsetNumber && offset <= maxoff);
if (offset != maxoff)
- memmove(GinDataPageGetItem(page, offset), GinDataPageGetItem(page, offset + 1),
+ memmove(GinDataPageGetPostingItem(page, offset),
+ GinDataPageGetPostingItem(page, offset + 1),
sizeof(PostingItem) * (maxoff - offset));
GinPageGetOpaque(page)->maxoff--;
if (!GinPageIsLeaf(page) && btree->rightblkno != InvalidBlockNumber)
{
- PostingItem *pitem = (PostingItem *) GinDataPageGetItem(page, off);
+ PostingItem *pitem = GinDataPageGetPostingItem(page, off);
PostingItemSetBlockNumber(pitem, btree->rightblkno);
ret = btree->rightblkno;
while (btree->curitem < btree->nitem)
{
- GinDataPageAddItem(page, btree->items + btree->curitem, off);
+ GinDataPageAddItemPointer(page, btree->items + btree->curitem, off);
off++;
btree->curitem++;
}
}
else
{
- GinDataPageAddItem(page, btree->items + btree->curitem, off);
+ GinDataPageAddItemPointer(page, btree->items + btree->curitem, off);
btree->curitem++;
}
}
else
- GinDataPageAddItem(page, &(btree->pitem), off);
+ GinDataPageAddPostingItem(page, &(btree->pitem), off);
}
/*
OffsetNumber separator;
ItemPointer bound;
Page lpage = PageGetTempPageCopy(BufferGetPage(lbuf));
+ bool isleaf = GinPageIsLeaf(lpage);
ItemPointerData oldbound = *GinDataPageGetRightBound(lpage);
int sizeofitem = GinSizeOfDataPageItem(lpage);
OffsetNumber maxoff = GinPageGetOpaque(lpage)->maxoff;
InvalidOffsetNumber : PostingItemGetBlockNumber(&(btree->pitem));
data.updateBlkno = dataPrepareData(btree, lpage, off);
- memcpy(vector, GinDataPageGetItem(lpage, FirstOffsetNumber),
- maxoff * sizeofitem);
+ if (isleaf)
+ {
+ memcpy(vector,
+ GinDataPageGetItemPointer(lpage, FirstOffsetNumber),
+ maxoff * sizeof(ItemPointerData));
+ }
+ else
+ {
+ memcpy(vector,
+ GinDataPageGetPostingItem(lpage, FirstOffsetNumber),
+ maxoff * sizeof(PostingItem));
+ }
- if (GinPageIsLeaf(lpage) && GinPageRightMost(lpage) && off > GinPageGetOpaque(lpage)->maxoff)
+ if (isleaf && GinPageRightMost(lpage) && off > GinPageGetOpaque(lpage)->maxoff)
{
nCopied = 0;
while (btree->curitem < btree->nitem &&
ptr = vector + (off - 1) * sizeofitem;
if (maxoff + 1 - off != 0)
memmove(ptr + sizeofitem, ptr, (maxoff - off + 1) * sizeofitem);
- if (GinPageIsLeaf(lpage))
+ if (isleaf)
{
memcpy(ptr, btree->items + btree->curitem, sizeofitem);
btree->curitem++;
GinInitPage(rpage, GinPageGetOpaque(lpage)->flags, pageSize);
GinInitPage(lpage, GinPageGetOpaque(rpage)->flags, pageSize);
- memcpy(GinDataPageGetItem(lpage, FirstOffsetNumber), vector, separator * sizeofitem);
+ if (isleaf)
+ memcpy(GinDataPageGetItemPointer(lpage, FirstOffsetNumber),
+ vector, separator * sizeof(ItemPointerData));
+ else
+ memcpy(GinDataPageGetPostingItem(lpage, FirstOffsetNumber),
+ vector, separator * sizeof(PostingItem));
+
GinPageGetOpaque(lpage)->maxoff = separator;
- memcpy(GinDataPageGetItem(rpage, FirstOffsetNumber),
- vector + separator * sizeofitem, (maxoff - separator) * sizeofitem);
+ if (isleaf)
+ memcpy(GinDataPageGetItemPointer(rpage, FirstOffsetNumber),
+ vector + separator * sizeof(ItemPointerData),
+ (maxoff - separator) * sizeof(ItemPointerData));
+ else
+ memcpy(GinDataPageGetPostingItem(rpage, FirstOffsetNumber),
+ vector + separator * sizeof(PostingItem),
+ (maxoff - separator) * sizeof(PostingItem));
+
GinPageGetOpaque(rpage)->maxoff = maxoff - separator;
PostingItemSetBlockNumber(&(btree->pitem), BufferGetBlockNumber(lbuf));
if (GinPageIsLeaf(lpage))
- btree->pitem.key = *(ItemPointerData *) GinDataPageGetItem(lpage,
+ btree->pitem.key = *GinDataPageGetItemPointer(lpage,
GinPageGetOpaque(lpage)->maxoff);
else
- btree->pitem.key = ((PostingItem *) GinDataPageGetItem(lpage,
- GinPageGetOpaque(lpage)->maxoff))->key;
+ btree->pitem.key = GinDataPageGetPostingItem(lpage,
+ GinPageGetOpaque(lpage)->maxoff)->key;
btree->rightblkno = BufferGetBlockNumber(rbuf);
/* set up right bound for left page */
li.key = *GinDataPageGetRightBound(lpage);
PostingItemSetBlockNumber(&li, BufferGetBlockNumber(lbuf));
- GinDataPageAddItem(page, &li, InvalidOffsetNumber);
+ GinDataPageAddPostingItem(page, &li, InvalidOffsetNumber);
ri.key = *GinDataPageGetRightBound(rpage);
PostingItemSetBlockNumber(&ri, BufferGetBlockNumber(rbuf));
- GinDataPageAddItem(page, &ri, InvalidOffsetNumber);
+ GinDataPageAddPostingItem(page, &ri, InvalidOffsetNumber);
}
void
Assert(data->updateBlkno == InvalidBlockNumber);
for (i = 0; i < data->nitem; i++)
- GinDataPageAddItem(page, items + i, data->offset + i);
+ GinDataPageAddItemPointer(page, &items[i], data->offset + i);
}
else
{
if (data->updateBlkno != InvalidBlockNumber)
{
/* update link to right page after split */
- pitem = (PostingItem *) GinDataPageGetItem(page, data->offset);
+ pitem = GinDataPageGetPostingItem(page, data->offset);
PostingItemSetBlockNumber(pitem, data->updateBlkno);
}
pitem = (PostingItem *) (XLogRecGetData(record) + sizeof(ginxlogInsert));
- GinDataPageAddItem(page, pitem, data->offset);
+ GinDataPageAddPostingItem(page, pitem, data->offset);
}
}
else
for (i = 0; i < data->separator; i++)
{
- GinDataPageAddItem(lpage, ptr, InvalidOffsetNumber);
+ if (data->isLeaf)
+ GinDataPageAddItemPointer(lpage, (ItemPointer) ptr, InvalidOffsetNumber);
+ else
+ GinDataPageAddPostingItem(lpage, (PostingItem *) ptr, InvalidOffsetNumber);
ptr += sizeofitem;
}
for (i = data->separator; i < data->nitem; i++)
{
- GinDataPageAddItem(rpage, ptr, InvalidOffsetNumber);
+ if (data->isLeaf)
+ GinDataPageAddItemPointer(rpage, (ItemPointer) ptr, InvalidOffsetNumber);
+ else
+ GinDataPageAddPostingItem(rpage, (PostingItem *) ptr, InvalidOffsetNumber);
ptr += sizeofitem;
}
/* set up right key */
bound = GinDataPageGetRightBound(lpage);
if (data->isLeaf)
- *bound = *(ItemPointerData *) GinDataPageGetItem(lpage, GinPageGetOpaque(lpage)->maxoff);
+ *bound = *GinDataPageGetItemPointer(lpage, GinPageGetOpaque(lpage)->maxoff);
else
- *bound = ((PostingItem *) GinDataPageGetItem(lpage, GinPageGetOpaque(lpage)->maxoff))->key;
+ *bound = GinDataPageGetPostingItem(lpage, GinPageGetOpaque(lpage)->maxoff)->key;
bound = GinDataPageGetRightBound(rpage);
*bound = data->rightbound;
PostingItemSetBlockNumber(&(btree.pitem), split->leftBlkno);
if (GinPageIsLeaf(page))
- btree.pitem.key = *(ItemPointerData *) GinDataPageGetItem(page,
- GinPageGetOpaque(page)->maxoff);
+ btree.pitem.key = *GinDataPageGetItemPointer(page,
+ GinPageGetOpaque(page)->maxoff);
else
- btree.pitem.key = ((PostingItem *) GinDataPageGetItem(page,
- GinPageGetOpaque(page)->maxoff))->key;
+ btree.pitem.key = GinDataPageGetPostingItem(page,
+ GinPageGetOpaque(page)->maxoff)->key;
}
btree.rightblkno = split->rightBlkno;