#ifndef ITEMPTR_H
#define ITEMPTR_H
#include "storage/block.h"
#include "storage/off.h"
typedef struct ItemPointerData
{
BlockIdData ip_blkid;
OffsetNumber ip_posid;
}
#if defined(pg_attribute_packed) && defined(pg_attribute_aligned)
pg_attribute_packed()
pg_attribute_aligned(2)
#endif
ItemPointerData;
typedef ItemPointerData *ItemPointer;
#define SpecTokenOffsetNumber 0xfffe
#define MovedPartitionsOffsetNumber 0xfffd
#define MovedPartitionsBlockNumber InvalidBlockNumber
static inline bool
ItemPointerIsValid(const ItemPointerData *pointer)
{
return PointerIsValid(pointer) && pointer->ip_posid != 0;
}
static inline BlockNumber
ItemPointerGetBlockNumberNoCheck(const ItemPointerData *pointer)
{
return BlockIdGetBlockNumber(&pointer->ip_blkid);
}
static inline BlockNumber
ItemPointerGetBlockNumber(const ItemPointerData *pointer)
{
Assert(ItemPointerIsValid(pointer));
return ItemPointerGetBlockNumberNoCheck(pointer);
}
static inline OffsetNumber
ItemPointerGetOffsetNumberNoCheck(const ItemPointerData *pointer)
{
return pointer->ip_posid;
}
static inline OffsetNumber
ItemPointerGetOffsetNumber(const ItemPointerData *pointer)
{
Assert(ItemPointerIsValid(pointer));
return ItemPointerGetOffsetNumberNoCheck(pointer);
}
static inline void
ItemPointerSet(ItemPointerData *pointer, BlockNumber blockNumber, OffsetNumber offNum)
{
Assert(PointerIsValid(pointer));
BlockIdSet(&pointer->ip_blkid, blockNumber);
pointer->ip_posid = offNum;
}
static inline void
ItemPointerSetBlockNumber(ItemPointerData *pointer, BlockNumber blockNumber)
{
Assert(PointerIsValid(pointer));
BlockIdSet(&pointer->ip_blkid, blockNumber);
}
static inline void
ItemPointerSetOffsetNumber(ItemPointerData *pointer, OffsetNumber offsetNumber)
{
Assert(PointerIsValid(pointer));
pointer->ip_posid = offsetNumber;
}
static inline void
ItemPointerCopy(const ItemPointerData *fromPointer, ItemPointerData *toPointer)
{
Assert(PointerIsValid(toPointer));
Assert(PointerIsValid(fromPointer));
*toPointer = *fromPointer;
}
static inline void
ItemPointerSetInvalid(ItemPointerData *pointer)
{
Assert(PointerIsValid(pointer));
BlockIdSet(&pointer->ip_blkid, InvalidBlockNumber);
pointer->ip_posid = InvalidOffsetNumber;
}
static inline bool
ItemPointerIndicatesMovedPartitions(const ItemPointerData *pointer)
{
return
ItemPointerGetOffsetNumber(pointer) == MovedPartitionsOffsetNumber &&
ItemPointerGetBlockNumberNoCheck(pointer) == MovedPartitionsBlockNumber;
}
static inline void
ItemPointerSetMovedPartitions(ItemPointerData *pointer)
{
ItemPointerSet(pointer, MovedPartitionsBlockNumber, MovedPartitionsOffsetNumber);
}
extern bool ItemPointerEquals(ItemPointer pointer1, ItemPointer pointer2);
extern int32 ItemPointerCompare(ItemPointer arg1, ItemPointer arg2);
extern void ItemPointerInc(ItemPointer pointer);
extern void ItemPointerDec(ItemPointer pointer);
static inline ItemPointer
DatumGetItemPointer(Datum X)
{
return (ItemPointer) DatumGetPointer(X);
}
static inline Datum
ItemPointerGetDatum(const ItemPointerData *X)
{
return PointerGetDatum(X);
}
#define PG_GETARG_ITEMPOINTER(n) DatumGetItemPointer(PG_GETARG_DATUM(n))
#define PG_RETURN_ITEMPOINTER(x) return ItemPointerGetDatum(x)
#endif