/*-------------------------------------------------------------------------
 *
 * heapam.h
 *	  POSTGRES heap access method definitions.
 *
 *
 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * $PostgreSQL: pgsql/src/include/access/heapam.h,v 1.117 2006/11/05 22:42:10 tgl Exp $
 *
 *-------------------------------------------------------------------------
 */
#ifndef HEAPAM_H
#define HEAPAM_H

#include "access/htup.h"
#include "access/relscan.h"
#include "access/sdir.h"
#include "access/skey.h"
#include "access/tupmacs.h"
#include "access/xlogutils.h"
#include "nodes/primnodes.h"
#include "storage/block.h"
#include "storage/lmgr.h"
#include "utils/rel.h"
#include "utils/relcache.h"
#include "utils/tqual.h"

/* in common/heaptuple.c */
extern Datum nocachegetattr(HeapTuple tup, int attnum, TupleDesc att);
extern Datum heap_getsysattr(HeapTuple tup, int attnum, bool *isnull);


/* ----------------
 *		fastgetattr
 *
 *		Fetch a user attribute's value as a Datum (might be either a
 *		value, or a pointer into the data area of the tuple).
 *
 *		This must not be used when a system attribute might be requested.
 *		Furthermore, the passed attnum MUST be valid.  Use heap_getattr()
 *		instead, if in doubt.
 *
 *		This gets called many times, so we macro the cacheable and NULL
 *		lookups, and call nocachegetattr() for the rest.
 *
 *      CDB:  Implemented as inline function instead of macro.
 * ----------------
 */
static inline Datum
fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
{
    Datum               result;
    Form_pg_attribute   att = tupleDesc->attrs[attnum-1];

    Assert(attnum > 0);

    if (isnull)
        *isnull = false;

    if (HeapTupleNoNulls(tup))
    {
        if (att->attcacheoff >= 0)
			result = fetchatt(att,
				              (char *)tup->t_data + tup->t_data->t_hoff +
					            att->attcacheoff);
        else
            result = nocachegetattr(tup, attnum, tupleDesc);
    }
    else if (att_isnull(attnum-1, tup->t_data->t_bits))
    {
        result = Int32GetDatum(0);
        if (isnull)
            *isnull = true;
    }
    else
        result = nocachegetattr(tup, attnum, tupleDesc);

    return result;
}                               /* fastgetattr */


/* ----------------
 *		heap_getattr
 *
 *		Extract an attribute of a heap tuple and return it as a Datum.
 *		This works for either system or user attributes.  The given attnum
 *		is properly range-checked.
 *
 *		If the field in question has a NULL value, we return a zero Datum
 *		and set *isnull == true.  Otherwise, we set *isnull == false.
 *
 *		<tup> is the pointer to the heap tuple.  <attnum> is the attribute
 *		number of the column (field) caller wants.	<tupleDesc> is a
 *		pointer to the structure describing the row and all its fields.
 *
 *      CDB:  Implemented as inline function instead of macro.
 * ----------------
 */
static inline Datum
heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
{
    Datum       result;

    Assert(tup != NULL);

    if (attnum > (int)HeapTupleHeaderGetNatts(tup->t_data))
    {
        result = DatumGetInt32(0);
        if (isnull)
            *isnull = true;
    }
    else if (attnum > 0)
        result = fastgetattr(tup, attnum, tupleDesc, isnull);
    else
        result = heap_getsysattr(tup, attnum, isnull);

    return result;
}                               /* heap_getattr */

// UNDONE: Temporarily.
extern void RelationFetchGpRelationNodeForXLog_Index(Relation relation);

/*
 * Fetch the persistent TID and serial number for a relation from the gp_relation_node
 * if needed to put in the XLOG record header.
 */
inline static void RelationFetchGpRelationNodeForXLog(
	Relation		relation)
{
	if (!InRecovery && !relation->rd_relationnodeinfo.isPresent &&
		!GpPersistent_SkipXLogInfo(relation->rd_id))
	{
	
		if (relation->rd_rel->relkind == RELKIND_INDEX )
		{
			// UNDONE: Temporarily.
			RelationFetchGpRelationNodeForXLog_Index(relation);
			return;
				 
		}

		/*
		if (relation->rd_rel->relstorage != RELSTORAGE_AOROWS
			&& relation->rd_rel->relstorage != RELSTORAGE_PARQUET)
			RelationFetchSegFile0GpRelationNode(relation, MASTER_CONTENT_ID);
		else
		{
			int i;
			for (i = 0; i < relation->rd_segfile0_count; ++i)
				RelationFetchSegFile0GpRelationNode(relation, i - 1);

		}
		*/
		RelationFetchGpRelationNode(relation);
	}
}


/* ----------------
 *		function prototypes for heap access method
 *
 * heap_create, heap_create_with_catalog, and heap_drop_with_catalog
 * are declared in catalog/heap.h
 * ----------------
 */

/* heapam.c */

typedef enum
{
	LockTupleShared,
	LockTupleExclusive
} LockTupleMode;

typedef enum
{
	LockTupleWait,		/* wait for lock until it's acquired */
	LockTupleNoWait,	/* if can't get lock right away, report error */
	LockTupleIfNotLocked/* if can't get lock right away, give up. no error */
} LockTupleWaitType;

inline static void xl_heaptid_set(
	struct xl_heaptid	*heaptid,
	Relation rel,
	ItemPointer tid)
{
	heaptid->node = rel->rd_node;
	heaptid->persistentTid = rel->rd_relationnodeinfo.persistentTid;
	heaptid->persistentSerialNum = rel->rd_relationnodeinfo.persistentSerialNum;
	heaptid->tid = *tid;
}

inline static void xl_heapnode_set(
	struct xl_heapnode	*heapnode,

	Relation rel)
{
	heapnode->node = rel->rd_node;
	heapnode->persistentTid = rel->rd_relationnodeinfo.persistentTid;
	heapnode->persistentSerialNum = rel->rd_relationnodeinfo.persistentSerialNum;
}

extern Relation relation_open(Oid relationId, LOCKMODE lockmode);
extern Relation try_relation_open(Oid relationId, LOCKMODE lockmode, 
								  bool noWait);
extern Relation relation_open_nowait(Oid relationId, LOCKMODE lockmode);
extern Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode);
extern Relation try_relation_openrv(const RangeVar *relation, LOCKMODE lockmode,
									bool noWait);

extern void relation_close(Relation relation, LOCKMODE lockmode);

extern Relation heap_open(Oid relationId, LOCKMODE lockmode);
extern Relation heap_openrv(const RangeVar *relation, LOCKMODE lockmode);
extern Relation try_heap_open(Oid relationId, LOCKMODE lockmode, bool noWait);
extern Relation try_heap_openrv(const RangeVar *relation, LOCKMODE lockmode,
								bool noWait);

#define heap_close(r,l)  relation_close(r,l)

/* CDB */
extern Relation CdbOpenRelation(Oid relid, LOCKMODE reqmode, bool noWait, 
								bool *lockUpgraded);
extern Relation CdbTryOpenRelation(Oid relid, LOCKMODE reqmode, bool noWait, 
								   bool *lockUpgraded);
extern Relation CdbOpenRelationRv(const RangeVar *relation, LOCKMODE reqmode, 
								  bool noWait, bool *lockUpgraded);


extern HeapScanDesc heap_beginscan(Relation relation, Snapshot snapshot,
			   int nkeys, ScanKey key);
extern void heap_rescan(HeapScanDesc scan, ScanKey key);
extern void heap_endscan(HeapScanDesc scan);
extern HeapTuple heap_getnext(HeapScanDesc scan, ScanDirection direction);
extern void heap_getnextx(HeapScanDesc scan, ScanDirection direction,
			  HeapTupleData tdata[], int *tdatacnt,
			  int *seen_EOS);

extern bool heap_fetch(Relation relation, Snapshot snapshot,
		   HeapTuple tuple, Buffer *userbuf, bool keep_buf,
		   Relation stats_relation);
extern bool heap_release_fetch(Relation relation, Snapshot snapshot,
				   HeapTuple tuple, Buffer *userbuf, bool keep_buf,
		   		   Relation stats_relation);

extern void heap_get_latest_tid(Relation relation, Snapshot snapshot,
					ItemPointer tid);
extern void setLastTid(const ItemPointer tid);

extern Oid heap_insert(Relation relation, HeapTuple tup, CommandId cid,
			bool use_wal, bool use_fsm, TransactionId xid);
extern HTSU_Result heap_delete(Relation relation, ItemPointer tid,
			ItemPointer ctid, TransactionId *update_xmax,
			CommandId cid, Snapshot crosscheck, bool wait);
extern HTSU_Result heap_update(Relation relation, ItemPointer otid,
			HeapTuple newtup,
			ItemPointer ctid, TransactionId *update_xmax,
			CommandId cid, Snapshot crosscheck, bool wait);
extern HTSU_Result heap_lock_tuple(Relation relation, HeapTuple tuple,
				Buffer *buffer, ItemPointer ctid,
				TransactionId *update_xmax, CommandId cid,
				LockTupleMode mode, LockTupleWaitType waittype);
extern void heap_inplace_update(Relation relation, HeapTuple tuple);
extern void frozen_heap_inplace_update(Relation relation, HeapTuple tuple);
extern void frozen_heap_inplace_delete(Relation relation, HeapTuple tuple);
extern bool heap_freeze_tuple(HeapTupleHeader tuple, TransactionId cutoff_xid,
							  Buffer buf);

extern Oid	simple_heap_insert(Relation relation, HeapTuple tup);
extern Oid frozen_heap_insert(Relation relation, HeapTuple tup);
extern Oid frozen_heap_insert_directed(Relation relation, HeapTuple tup, BlockNumber blockNum);
extern void simple_heap_delete(Relation relation, ItemPointer tid);
extern void simple_heap_update(Relation relation, ItemPointer otid,
				   HeapTuple tup);

extern void heap_markpos(HeapScanDesc scan);
extern void heap_markposx(HeapScanDesc scan, HeapTuple tuple);
extern void heap_restrpos(HeapScanDesc scan);

extern void heap_redo(XLogRecPtr beginLoc, XLogRecPtr lsn, XLogRecord *rptr);
extern void heap_desc(StringInfo buf, XLogRecPtr beginLoc, XLogRecord *record);
extern bool heap_getrelfilenode(
	XLogRecord 		*record,
	RelFileNode		*relFileNode);
extern void heap2_redo(XLogRecPtr beginLoc, XLogRecPtr lsn, XLogRecord *rptr);
extern void heap2_desc(StringInfo buf, XLogRecPtr beginLoc, XLogRecord *record);

extern void log_heap_newpage(Relation rel, 
							 Page page,
							 BlockNumber bno);
extern XLogRecPtr log_heap_move(Relation reln, Buffer oldbuf,
			  ItemPointerData from,
			  Buffer newbuf, HeapTuple newtup);
extern XLogRecPtr log_heap_clean(Relation reln, Buffer buffer,
			   OffsetNumber *unused, int uncnt);
extern XLogRecPtr log_heap_freeze(Relation reln, Buffer buffer,
								  TransactionId cutoff_xid,
								  OffsetNumber *offsets, int offcnt);

/* in common/heaptuple.c */
extern Size heap_compute_data_size(TupleDesc tupleDesc,
					   Datum *values, bool *isnull);
extern Size heap_fill_tuple(TupleDesc tupleDesc,
				Datum *values, bool *isnull,
				char *data, uint16 *infomask, bits8 *bit);
extern bool heap_attisnull(HeapTuple tup, int attnum);
extern bool heap_attisnull_normalattr(HeapTuple tup, int attnum);

extern HeapTuple heaptuple_copy_to(HeapTuple tup, HeapTuple result, uint32 *len);

static inline HeapTuple heap_copytuple(HeapTuple tuple)
{
	return heaptuple_copy_to(tuple, NULL, NULL);
}

extern void heap_copytuple_with_tuple(HeapTuple src, HeapTuple dest);

extern HeapTuple heaptuple_form_to(TupleDesc tupdesc, Datum* values, bool *isnull, HeapTuple tup, uint32 *len);
static inline HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
{
	return heaptuple_form_to(tupleDescriptor, values, isnull, NULL, NULL);
}
extern HeapTuple heap_formtuple(TupleDesc tupleDescriptor, Datum *values, char *nulls) __attribute__ ((deprecated));

extern HeapTuple heap_modify_tuple(HeapTuple tuple,
				  TupleDesc tupleDesc,
				  Datum *replValues,
				  bool *replIsnull,
				  bool *doReplace);
extern HeapTuple heap_modifytuple(HeapTuple tuple,
				 TupleDesc tupleDesc,
				 Datum *replValues,
				 char *replNulls,
				 char *replActions) __attribute__ ((deprecated));
extern void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,
				  Datum *values, bool *isnull);
extern void heap_deformtuple(HeapTuple tuple, TupleDesc tupleDesc,
				 Datum *values, char *nulls) __attribute__ ((deprecated));
extern void heap_freetuple(HeapTuple htup);
extern HeapTuple heap_addheader(int natts, bool withoid,
			   Size structlen, void *structure);

#endif   /* HEAPAM_H */
