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-2018, 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 "catalog/genbki.h"
22 #include "catalog/pg_subscription_rel_d.h"
23 
24 #include "access/xlogdefs.h"
25 #include "nodes/pg_list.h"
26 
27 /* ----------------
28  *		pg_subscription_rel definition. cpp turns this into
29  *		typedef struct FormData_pg_subscription_rel
30  * ----------------
31  */
32 CATALOG(pg_subscription_rel,6102,SubscriptionRelRelationId) BKI_WITHOUT_OIDS
33 {
34 	Oid			srsubid;		/* Oid of subscription */
35 	Oid			srrelid;		/* Oid of relation */
36 	char		srsubstate;		/* state of the relation in subscription */
37 
38 	/*
39 	 * Although srsublsn is a fixed-width type, it is allowed to be NULL, so
40 	 * we prevent direct C code access to it just as for a varlena field.
41 	 */
42 #ifdef CATALOG_VARLEN			/* variable-length fields start here */
43 
44 	XLogRecPtr	srsublsn;		/* remote LSN of the state change used for
45 								 * synchronization coordination, or NULL if
46 								 * not valid */
47 #endif
48 } FormData_pg_subscription_rel;
49 
50 typedef FormData_pg_subscription_rel *Form_pg_subscription_rel;
51 
52 #ifdef EXPOSE_TO_CLIENT_CODE
53 
54 /* ----------------
55  *		substate constants
56  * ----------------
57  */
58 #define SUBREL_STATE_INIT		'i' /* initializing (sublsn NULL) */
59 #define SUBREL_STATE_DATASYNC	'd' /* data is being synchronized (sublsn
60 									 * NULL) */
61 #define SUBREL_STATE_SYNCDONE	's' /* synchronization finished in front of
62 									 * apply (sublsn set) */
63 #define SUBREL_STATE_READY		'r' /* ready (sublsn set) */
64 
65 /* These are never stored in the catalog, we only use them for IPC. */
66 #define SUBREL_STATE_UNKNOWN	'\0'	/* unknown state */
67 #define SUBREL_STATE_SYNCWAIT	'w' /* waiting for sync */
68 #define SUBREL_STATE_CATCHUP	'c' /* catching up with apply */
69 
70 #endif							/* EXPOSE_TO_CLIENT_CODE */
71 
72 typedef struct SubscriptionRelState
73 {
74 	Oid			relid;
75 	XLogRecPtr	lsn;
76 	char		state;
77 } SubscriptionRelState;
78 
79 extern Oid AddSubscriptionRelState(Oid subid, Oid relid, char state,
80 						XLogRecPtr sublsn);
81 extern Oid UpdateSubscriptionRelState(Oid subid, Oid relid, char state,
82 						   XLogRecPtr sublsn);
83 extern char GetSubscriptionRelState(Oid subid, Oid relid,
84 						XLogRecPtr *sublsn, bool missing_ok);
85 extern void RemoveSubscriptionRel(Oid subid, Oid relid);
86 
87 extern List *GetSubscriptionRelations(Oid subid);
88 extern List *GetSubscriptionNotReadyRelations(Oid subid);
89 
90 #endif							/* PG_SUBSCRIPTION_REL_H */
91