1 /* -------------------------------------------------------------------------
2  *
3  * pg_subscription_rel.h
4  *	  definition of the system catalog containing the state for each
5  *	  replicated table in each subscription (pg_subscription_rel)
6  *
7  * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  * src/include/catalog/pg_subscription_rel.h
11  *
12  * NOTES
13  *	  The Catalog.pm module reads this file and derives schema
14  *	  information.
15  *
16  * -------------------------------------------------------------------------
17  */
18 #ifndef PG_SUBSCRIPTION_REL_H
19 #define PG_SUBSCRIPTION_REL_H
20 
21 #include "access/xlogdefs.h"
22 #include "catalog/genbki.h"
23 #include "catalog/pg_subscription_rel_d.h"
24 #include "nodes/pg_list.h"
25 
26 /* ----------------
27  *		pg_subscription_rel definition. cpp turns this into
28  *		typedef struct FormData_pg_subscription_rel
29  * ----------------
30  */
31 CATALOG(pg_subscription_rel,6102,SubscriptionRelRelationId)
32 {
33 	Oid			srsubid BKI_LOOKUP(pg_subscription);	/* Oid of subscription */
34 	Oid			srrelid BKI_LOOKUP(pg_class);	/* Oid of relation */
35 	char		srsubstate;		/* state of the relation in subscription */
36 
37 	/*
38 	 * Although srsublsn is a fixed-width type, it is allowed to be NULL, so
39 	 * we prevent direct C code access to it just as for a varlena field.
40 	 */
41 #ifdef CATALOG_VARLEN			/* variable-length fields start here */
42 
43 	XLogRecPtr	srsublsn BKI_FORCE_NULL;	/* remote LSN of the state change
44 											 * used for synchronization
45 											 * coordination, or NULL if not
46 											 * valid */
47 #endif
48 } FormData_pg_subscription_rel;
49 
50 typedef FormData_pg_subscription_rel *Form_pg_subscription_rel;
51 
52 DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, on pg_subscription_rel using btree(srrelid oid_ops, srsubid oid_ops));
53 #define SubscriptionRelSrrelidSrsubidIndexId 6117
54 
55 #ifdef EXPOSE_TO_CLIENT_CODE
56 
57 /* ----------------
58  *		substate constants
59  * ----------------
60  */
61 #define SUBREL_STATE_INIT		'i' /* initializing (sublsn NULL) */
62 #define SUBREL_STATE_DATASYNC	'd' /* data is being synchronized (sublsn
63 									 * NULL) */
64 #define SUBREL_STATE_FINISHEDCOPY 'f'	/* tablesync copy phase is completed
65 										 * (sublsn NULL) */
66 #define SUBREL_STATE_SYNCDONE	's' /* synchronization finished in front of
67 									 * apply (sublsn set) */
68 #define SUBREL_STATE_READY		'r' /* ready (sublsn set) */
69 
70 /* These are never stored in the catalog, we only use them for IPC. */
71 #define SUBREL_STATE_UNKNOWN	'\0'	/* unknown state */
72 #define SUBREL_STATE_SYNCWAIT	'w' /* waiting for sync */
73 #define SUBREL_STATE_CATCHUP	'c' /* catching up with apply */
74 
75 #endif							/* EXPOSE_TO_CLIENT_CODE */
76 
77 typedef struct SubscriptionRelState
78 {
79 	Oid			relid;
80 	XLogRecPtr	lsn;
81 	char		state;
82 } SubscriptionRelState;
83 
84 extern void AddSubscriptionRelState(Oid subid, Oid relid, char state,
85 									XLogRecPtr sublsn);
86 extern void UpdateSubscriptionRelState(Oid subid, Oid relid, char state,
87 									   XLogRecPtr sublsn);
88 extern char GetSubscriptionRelState(Oid subid, Oid relid, XLogRecPtr *sublsn);
89 extern void RemoveSubscriptionRel(Oid subid, Oid relid);
90 
91 extern List *GetSubscriptionRelations(Oid subid);
92 extern List *GetSubscriptionNotReadyRelations(Oid subid);
93 
94 #endif							/* PG_SUBSCRIPTION_REL_H */
95