OSDN Git Service

Now we are able to CREATE PROCEDURAL LANGUAGE (Thanks, Jan).
[pg-rex/syncrep.git] / src / include / utils / rel.h
1 /*-------------------------------------------------------------------------
2  *
3  * rel.h--
4  *        POSTGRES relation descriptor definitions.
5  *
6  *
7  * Copyright (c) 1994, Regents of the University of California
8  *
9  * $Id: rel.h,v 1.13 1997/10/28 15:11:43 vadim Exp $
10  *
11  *-------------------------------------------------------------------------
12  */
13 #ifndef REL_H
14 #define REL_H
15
16 #include <catalog/pg_am.h>
17 #include <catalog/pg_class.h>
18 #include <access/strat.h>
19 #include <access/tupdesc.h>
20 #include <rewrite/prs2lock.h>
21 #include <storage/fd.h>
22
23 typedef struct Trigger
24 {
25         char       *tgname;
26         Oid                     tgfoid;
27         func_ptr        tgfunc;
28         func_ptr        tgplfunc;
29         int16           tgtype;
30         int16           tgnargs;
31         int16           tgattr[8];
32         char      **tgargs;
33 } Trigger;
34
35 typedef struct TriggerDesc
36 {
37         uint16          n_before_statement[4];
38         uint16          n_before_row[4];
39         uint16          n_after_row[4];
40         uint16          n_after_statement[4];
41         Trigger   **tg_before_statement[4];
42         Trigger   **tg_before_row[4];
43         Trigger   **tg_after_row[4];
44         Trigger   **tg_after_statement[4];
45         Trigger    *triggers;
46 } TriggerDesc;
47
48 typedef struct RelationData
49 {
50         File            rd_fd;                  /* open file descriptor */
51         int                     rd_nblocks;             /* number of blocks in rel */
52         uint16          rd_refcnt;              /* reference count */
53         bool            rd_islocal;             /* uses the local buffer mgr */
54         bool            rd_isnailed;    /* rel is nailed in cache */
55         bool            rd_istemp;              /* rel is a temp rel */
56         bool            rd_tmpunlinked; /* temp rel already unlinked */
57         Form_pg_am      rd_am;                  /* AM tuple */
58         Form_pg_class rd_rel;           /* RELATION tuple */
59         Oid                     rd_id;                  /* relations's object id */
60         Pointer         lockInfo;               /* ptr. to misc. info. */
61         TupleDesc       rd_att;                 /* tuple desciptor */
62         RuleLock   *rd_rules;           /* rewrite rules */
63         IndexStrategy rd_istrat;
64         RegProcedure *rd_support;
65         TriggerDesc *trigdesc;
66 } RelationData;
67
68 typedef RelationData *Relation;
69
70 /* ----------------
71  *              RelationPtr is used in the executor to support index scans
72  *              where we have to keep track of several index relations in an
73  *              array.  -cim 9/10/89
74  * ----------------
75  */
76 typedef Relation *RelationPtr;
77
78 #define InvalidRelation ((Relation)NULL)
79
80 typedef char ArchiveMode;
81
82 /*
83  * RelationIsValid --
84  *              True iff relation descriptor is valid.
85  */
86 #define RelationIsValid(relation) PointerIsValid(relation)
87
88 /*
89  * RelationGetSystemPort --
90  *              Returns system port of a relation.
91  *
92  * Note:
93  *              Assumes relation descriptor is valid.
94  */
95 #define RelationGetSystemPort(relation) ((relation)->rd_fd)
96
97 /*
98  * RelationGetLockInfo --
99  *              Returns the lock information structure in the reldesc
100  *
101  */
102 #define RelationGetLockInfo(relation) ((relation)->lockInfo)
103
104 /*
105  * RelationHasReferenceCountZero --
106  *              True iff relation reference count is zero.
107  *
108  * Note:
109  *              Assumes relation descriptor is valid.
110  */
111 #define RelationHasReferenceCountZero(relation) \
112                 ((bool)((relation)->rd_refcnt == 0))
113
114 /*
115  * RelationSetReferenceCount --
116  *              Sets relation reference count.
117  */
118 #define RelationSetReferenceCount(relation,count) ((relation)->rd_refcnt = count)
119
120 /*
121  * RelationIncrementReferenceCount --
122  *              Increments relation reference count.
123  */
124 #define RelationIncrementReferenceCount(relation) ((relation)->rd_refcnt += 1);
125
126 /*
127  * RelationDecrementReferenceCount --
128  *              Decrements relation reference count.
129  */
130 #define RelationDecrementReferenceCount(relation) ((relation)->rd_refcnt -= 1)
131
132 /*
133  * RelationGetAccessMethodTupleForm --
134  *              Returns access method attribute values for a relation.
135  *
136  * Note:
137  *              Assumes relation descriptor is valid.
138  */
139 #define RelationGetAccessMethodTupleForm(relation) ((relation)->rd_am)
140
141 /*
142  * RelationGetRelationTupleForm --
143  *              Returns relation attribute values for a relation.
144  *
145  * Note:
146  *              Assumes relation descriptor is valid.
147  */
148 #define RelationGetRelationTupleForm(relation) ((relation)->rd_rel)
149
150
151 /*
152  * RelationGetRelationId --
153  *
154  *      returns the object id of the relation
155  *
156  */
157 #define RelationGetRelationId(relation) ((relation)->rd_id)
158
159 /*
160  * RelationGetFile --
161  *
162  *        Returns the open File decscriptor
163  */
164 #define RelationGetFile(relation) ((relation)->rd_fd)
165
166
167 /*
168  * RelationGetRelationName --
169  *
170  *        Returns a Relation Name
171  */
172 #define RelationGetRelationName(relation) (&(relation)->rd_rel->relname)
173
174 /*
175  * RelationGetRelationName --
176  *
177  *        Returns a the number of attributes.
178  */
179 #define RelationGetNumberOfAttributes(relation) ((relation)->rd_rel->relnatts)
180
181 /*
182  * RelationGetTupleDescriptor --
183  *              Returns tuple descriptor for a relation.
184  *
185  * Note:
186  *              Assumes relation descriptor is valid.
187  */
188 #define RelationGetTupleDescriptor(relation) ((relation)->rd_att)
189
190 extern IndexStrategy RelationGetIndexStrategy(Relation relation);
191
192 extern void
193 RelationSetIndexSupport(Relation relation, IndexStrategy strategy,
194                                                 RegProcedure *support);
195
196 #endif                                                  /* REL_H */