rel.h 4.6 KB
Newer Older
1 2 3
/*-------------------------------------------------------------------------
 *
 * rel.h--
4
 *	  POSTGRES relation descriptor definitions.
5 6 7 8
 *
 *
 * Copyright (c) 1994, Regents of the University of California
 *
B
Bruce Momjian 已提交
9
 * $Id: rel.h,v 1.14 1997/11/21 19:12:32 momjian Exp $
10 11 12
 *
 *-------------------------------------------------------------------------
 */
13
#ifndef REL_H
14 15
#define REL_H

16 17
#include <catalog/pg_am.h>
#include <catalog/pg_class.h>
18 19
#include <access/strat.h>
#include <access/tupdesc.h>
20
#include <rewrite/prs2lock.h>
21
#include <storage/fd.h>
22

23 24
typedef struct Trigger
{
25 26 27
	char	   *tgname;
	Oid			tgfoid;
	func_ptr	tgfunc;
28
	func_ptr	tgplfunc;
29 30 31 32
	int16		tgtype;
	int16		tgnargs;
	int16		tgattr[8];
	char	  **tgargs;
33
} Trigger;
34 35 36

typedef struct TriggerDesc
{
37 38 39 40 41 42 43 44 45
	uint16		n_before_statement[4];
	uint16		n_before_row[4];
	uint16		n_after_row[4];
	uint16		n_after_statement[4];
	Trigger   **tg_before_statement[4];
	Trigger   **tg_before_row[4];
	Trigger   **tg_after_row[4];
	Trigger   **tg_after_statement[4];
	Trigger    *triggers;
46
} TriggerDesc;
47 48 49

typedef struct RelationData
{
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
	File		rd_fd;			/* open file descriptor */
	int			rd_nblocks;		/* number of blocks in rel */
	uint16		rd_refcnt;		/* reference count */
	bool		rd_islocal;		/* uses the local buffer mgr */
	bool		rd_isnailed;	/* rel is nailed in cache */
	bool		rd_istemp;		/* rel is a temp rel */
	bool		rd_tmpunlinked; /* temp rel already unlinked */
	Form_pg_am	rd_am;			/* AM tuple */
	Form_pg_class rd_rel;		/* RELATION tuple */
	Oid			rd_id;			/* relations's object id */
	Pointer		lockInfo;		/* ptr. to misc. info. */
	TupleDesc	rd_att;			/* tuple desciptor */
	RuleLock   *rd_rules;		/* rewrite rules */
	IndexStrategy rd_istrat;
	RegProcedure *rd_support;
	TriggerDesc *trigdesc;
66
} RelationData;
67 68

typedef RelationData *Relation;
69 70

/* ----------------
71 72 73
 *		RelationPtr is used in the executor to support index scans
 *		where we have to keep track of several index relations in an
 *		array.	-cim 9/10/89
74 75
 * ----------------
 */
76
typedef Relation *RelationPtr;
77

78
#define InvalidRelation ((Relation)NULL)
79 80 81

/*
 * RelationIsValid --
82
 *		True iff relation descriptor is valid.
83
 */
84
#define RelationIsValid(relation) PointerIsValid(relation)
85 86 87

/*
 * RelationGetSystemPort --
88
 *		Returns system port of a relation.
89 90
 *
 * Note:
91
 *		Assumes relation descriptor is valid.
92 93 94 95 96
 */
#define RelationGetSystemPort(relation) ((relation)->rd_fd)

/*
 * RelationGetLockInfo --
97
 *		Returns the lock information structure in the reldesc
98 99 100 101 102 103
 *
 */
#define RelationGetLockInfo(relation) ((relation)->lockInfo)

/*
 * RelationHasReferenceCountZero --
104
 *		True iff relation reference count is zero.
105 106
 *
 * Note:
107
 *		Assumes relation descriptor is valid.
108 109
 */
#define RelationHasReferenceCountZero(relation) \
110
		((bool)((relation)->rd_refcnt == 0))
111 112 113

/*
 * RelationSetReferenceCount --
114
 *		Sets relation reference count.
115 116 117 118 119
 */
#define RelationSetReferenceCount(relation,count) ((relation)->rd_refcnt = count)

/*
 * RelationIncrementReferenceCount --
120
 *		Increments relation reference count.
121 122 123 124 125
 */
#define RelationIncrementReferenceCount(relation) ((relation)->rd_refcnt += 1);

/*
 * RelationDecrementReferenceCount --
126
 *		Decrements relation reference count.
127 128 129 130 131
 */
#define RelationDecrementReferenceCount(relation) ((relation)->rd_refcnt -= 1)

/*
 * RelationGetAccessMethodTupleForm --
132
 *		Returns access method attribute values for a relation.
133 134
 *
 * Note:
135
 *		Assumes relation descriptor is valid.
136 137 138 139 140
 */
#define RelationGetAccessMethodTupleForm(relation) ((relation)->rd_am)

/*
 * RelationGetRelationTupleForm --
141
 *		Returns relation attribute values for a relation.
142 143
 *
 * Note:
144
 *		Assumes relation descriptor is valid.
145 146 147 148
 */
#define RelationGetRelationTupleForm(relation) ((relation)->rd_rel)


149
/*
150 151
 * RelationGetRelationId --
 *
152
 *	returns the object id of the relation
153 154 155 156 157 158 159
 *
 */
#define RelationGetRelationId(relation) ((relation)->rd_id)

/*
 * RelationGetFile --
 *
160
 *	  Returns the open File decscriptor
161 162 163 164 165 166 167
 */
#define RelationGetFile(relation) ((relation)->rd_fd)


/*
 * RelationGetRelationName --
 *
168
 *	  Returns a Relation Name
169 170 171 172 173 174
 */
#define RelationGetRelationName(relation) (&(relation)->rd_rel->relname)

/*
 * RelationGetRelationName --
 *
175
 *	  Returns a the number of attributes.
176 177 178 179 180
 */
#define RelationGetNumberOfAttributes(relation) ((relation)->rd_rel->relnatts)

/*
 * RelationGetTupleDescriptor --
181
 *		Returns tuple descriptor for a relation.
182 183
 *
 * Note:
184
 *		Assumes relation descriptor is valid.
185 186 187 188 189
 */
#define RelationGetTupleDescriptor(relation) ((relation)->rd_att)

extern IndexStrategy RelationGetIndexStrategy(Relation relation);

190 191
extern void
RelationSetIndexSupport(Relation relation, IndexStrategy strategy,
192
						RegProcedure *support);
193 194

#endif							/* REL_H */