| 1 | /*------------------------------------------------------------------------- |
| 2 | * |
| 3 | * logicalproto.h |
| 4 | * logical replication protocol |
| 5 | * |
| 6 | * Copyright (c) 2015-2019, PostgreSQL Global Development Group |
| 7 | * |
| 8 | * IDENTIFICATION |
| 9 | * src/include/replication/logicalproto.h |
| 10 | * |
| 11 | *------------------------------------------------------------------------- |
| 12 | */ |
| 13 | #ifndef LOGICAL_PROTO_H |
| 14 | #define LOGICAL_PROTO_H |
| 15 | |
| 16 | #include "replication/reorderbuffer.h" |
| 17 | #include "utils/rel.h" |
| 18 | |
| 19 | /* |
| 20 | * Protocol capabilities |
| 21 | * |
| 22 | * LOGICAL_PROTO_VERSION_NUM is our native protocol and the greatest version |
| 23 | * we can support. PGLOGICAL_PROTO_MIN_VERSION_NUM is the oldest version we |
| 24 | * have backwards compatibility for. The client requests protocol version at |
| 25 | * connect time. |
| 26 | */ |
| 27 | #define LOGICALREP_PROTO_MIN_VERSION_NUM 1 |
| 28 | #define LOGICALREP_PROTO_VERSION_NUM 1 |
| 29 | |
| 30 | /* Tuple coming via logical replication. */ |
| 31 | typedef struct LogicalRepTupleData |
| 32 | { |
| 33 | /* column values in text format, or NULL for a null value: */ |
| 34 | char *values[MaxTupleAttributeNumber]; |
| 35 | /* markers for changed/unchanged column values: */ |
| 36 | bool changed[MaxTupleAttributeNumber]; |
| 37 | } LogicalRepTupleData; |
| 38 | |
| 39 | typedef uint32 LogicalRepRelId; |
| 40 | |
| 41 | /* Relation information */ |
| 42 | typedef struct LogicalRepRelation |
| 43 | { |
| 44 | /* Info coming from the remote side. */ |
| 45 | LogicalRepRelId remoteid; /* unique id of the relation */ |
| 46 | char *nspname; /* schema name */ |
| 47 | char *relname; /* relation name */ |
| 48 | int natts; /* number of columns */ |
| 49 | char **attnames; /* column names */ |
| 50 | Oid *atttyps; /* column types */ |
| 51 | char replident; /* replica identity */ |
| 52 | Bitmapset *attkeys; /* Bitmap of key columns */ |
| 53 | } LogicalRepRelation; |
| 54 | |
| 55 | /* Type mapping info */ |
| 56 | typedef struct LogicalRepTyp |
| 57 | { |
| 58 | Oid remoteid; /* unique id of the remote type */ |
| 59 | char *nspname; /* schema name of remote type */ |
| 60 | char *typname; /* name of the remote type */ |
| 61 | } LogicalRepTyp; |
| 62 | |
| 63 | /* Transaction info */ |
| 64 | typedef struct LogicalRepBeginData |
| 65 | { |
| 66 | XLogRecPtr final_lsn; |
| 67 | TimestampTz committime; |
| 68 | TransactionId xid; |
| 69 | } LogicalRepBeginData; |
| 70 | |
| 71 | typedef struct LogicalRepCommitData |
| 72 | { |
| 73 | XLogRecPtr commit_lsn; |
| 74 | XLogRecPtr end_lsn; |
| 75 | TimestampTz committime; |
| 76 | } LogicalRepCommitData; |
| 77 | |
| 78 | extern void logicalrep_write_begin(StringInfo out, ReorderBufferTXN *txn); |
| 79 | extern void logicalrep_read_begin(StringInfo in, |
| 80 | LogicalRepBeginData *begin_data); |
| 81 | extern void logicalrep_write_commit(StringInfo out, ReorderBufferTXN *txn, |
| 82 | XLogRecPtr commit_lsn); |
| 83 | extern void logicalrep_read_commit(StringInfo in, |
| 84 | LogicalRepCommitData *commit_data); |
| 85 | extern void logicalrep_write_origin(StringInfo out, const char *origin, |
| 86 | XLogRecPtr origin_lsn); |
| 87 | extern char *logicalrep_read_origin(StringInfo in, XLogRecPtr *origin_lsn); |
| 88 | extern void logicalrep_write_insert(StringInfo out, Relation rel, |
| 89 | HeapTuple newtuple); |
| 90 | extern LogicalRepRelId logicalrep_read_insert(StringInfo in, LogicalRepTupleData *newtup); |
| 91 | extern void logicalrep_write_update(StringInfo out, Relation rel, HeapTuple oldtuple, |
| 92 | HeapTuple newtuple); |
| 93 | extern LogicalRepRelId logicalrep_read_update(StringInfo in, |
| 94 | bool *has_oldtuple, LogicalRepTupleData *oldtup, |
| 95 | LogicalRepTupleData *newtup); |
| 96 | extern void logicalrep_write_delete(StringInfo out, Relation rel, |
| 97 | HeapTuple oldtuple); |
| 98 | extern LogicalRepRelId logicalrep_read_delete(StringInfo in, |
| 99 | LogicalRepTupleData *oldtup); |
| 100 | extern void logicalrep_write_truncate(StringInfo out, int nrelids, Oid relids[], |
| 101 | bool cascade, bool restart_seqs); |
| 102 | extern List *logicalrep_read_truncate(StringInfo in, |
| 103 | bool *cascade, bool *restart_seqs); |
| 104 | extern void logicalrep_write_rel(StringInfo out, Relation rel); |
| 105 | extern LogicalRepRelation *logicalrep_read_rel(StringInfo in); |
| 106 | extern void logicalrep_write_typ(StringInfo out, Oid typoid); |
| 107 | extern void logicalrep_read_typ(StringInfo out, LogicalRepTyp *ltyp); |
| 108 | |
| 109 | #endif /* LOGICALREP_PROTO_H */ |
| 110 | |