PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
message.h File Reference
#include "access/xlog.h"
#include "access/xlogdefs.h"
#include "access/xlogreader.h"
Include dependency graph for message.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  xl_logical_message
 

Macros

#define SizeOfLogicalMessage   (offsetof(xl_logical_message, message))
 
#define XLOG_LOGICAL_MESSAGE   0x00
 

Typedefs

typedef struct xl_logical_message xl_logical_message
 

Functions

XLogRecPtr LogLogicalMessage (const char *prefix, const char *message, size_t size, bool transactional, bool flush)
 
void logicalmsg_redo (XLogReaderState *record)
 
void logicalmsg_desc (StringInfo buf, XLogReaderState *record)
 
const char * logicalmsg_identify (uint8 info)
 

Macro Definition Documentation

◆ SizeOfLogicalMessage

#define SizeOfLogicalMessage   (offsetof(xl_logical_message, message))

Definition at line 30 of file message.h.

◆ XLOG_LOGICAL_MESSAGE

#define XLOG_LOGICAL_MESSAGE   0x00

Definition at line 37 of file message.h.

Typedef Documentation

◆ xl_logical_message

Function Documentation

◆ logicalmsg_desc()

void logicalmsg_desc ( StringInfo  buf,
XLogReaderState record 
)

Definition at line 19 of file logicalmsgdesc.c.

20{
21 char *rec = XLogRecGetData(record);
22 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
23
24 if (info == XLOG_LOGICAL_MESSAGE)
25 {
27 char *prefix = xlrec->message;
28 char *message = xlrec->message + xlrec->prefix_size;
29 char *sep = "";
30
31 Assert(prefix[xlrec->prefix_size - 1] == '\0');
32
33 appendStringInfo(buf, "%s, prefix \"%s\"; payload (%zu bytes): ",
34 xlrec->transactional ? "transactional" : "non-transactional",
35 prefix, xlrec->message_size);
36 /* Write message payload as a series of hex bytes */
37 for (int cnt = 0; cnt < xlrec->message_size; cnt++)
38 {
39 appendStringInfo(buf, "%s%02X", sep, (unsigned char) message[cnt]);
40 sep = " ";
41 }
42 }
43}
uint8_t uint8
Definition: c.h:500
Assert(PointerIsAligned(start, uint64))
#define XLOG_LOGICAL_MESSAGE
Definition: message.h:37
static char * buf
Definition: pg_test_fsync.c:72
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:145
bool transactional
Definition: message.h:23
char message[FLEXIBLE_ARRAY_MEMBER]
Definition: message.h:27
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:410
#define XLogRecGetData(decoder)
Definition: xlogreader.h:415

References appendStringInfo(), Assert(), buf, xl_logical_message::message, xl_logical_message::message_size, xl_logical_message::prefix_size, xl_logical_message::transactional, XLOG_LOGICAL_MESSAGE, XLogRecGetData, and XLogRecGetInfo.

◆ logicalmsg_identify()

const char * logicalmsg_identify ( uint8  info)

Definition at line 46 of file logicalmsgdesc.c.

47{
48 if ((info & ~XLR_INFO_MASK) == XLOG_LOGICAL_MESSAGE)
49 return "MESSAGE";
50
51 return NULL;
52}
#define XLR_INFO_MASK
Definition: xlogrecord.h:62

References XLOG_LOGICAL_MESSAGE, and XLR_INFO_MASK.

◆ logicalmsg_redo()

void logicalmsg_redo ( XLogReaderState record)

Definition at line 87 of file message.c.

88{
89 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
90
91 if (info != XLOG_LOGICAL_MESSAGE)
92 elog(PANIC, "logicalmsg_redo: unknown op code %u", info);
93
94 /* This is only interesting for logical decoding, see decode.c. */
95}
#define PANIC
Definition: elog.h:42
#define elog(elevel,...)
Definition: elog.h:225

References elog, PANIC, XLOG_LOGICAL_MESSAGE, and XLogRecGetInfo.

◆ LogLogicalMessage()

XLogRecPtr LogLogicalMessage ( const char *  prefix,
const char *  message,
size_t  size,
bool  transactional,
bool  flush 
)

Definition at line 43 of file message.c.

45{
47 XLogRecPtr lsn;
48
49 /*
50 * Force xid to be allocated if we're emitting a transactional message.
51 */
52 if (transactional)
53 {
56 }
57
58 xlrec.dbId = MyDatabaseId;
59 xlrec.transactional = transactional;
60 /* trailing zero is critical; see logicalmsg_desc */
61 xlrec.prefix_size = strlen(prefix) + 1;
62 xlrec.message_size = size;
63
66 XLogRegisterData(prefix, xlrec.prefix_size);
67 XLogRegisterData(message, size);
68
69 /* allow origin filtering */
71
72 lsn = XLogInsert(RM_LOGICALMSG_ID, XLOG_LOGICAL_MESSAGE);
73
74 /*
75 * Make sure that the message hits disk before leaving if emitting a
76 * non-transactional message when flush is requested.
77 */
78 if (!transactional && flush)
79 XLogFlush(lsn);
80 return lsn;
81}
Oid MyDatabaseId
Definition: globals.c:95
#define SizeOfLogicalMessage
Definition: message.h:30
bool IsTransactionState(void)
Definition: xact.c:387
TransactionId GetCurrentTransactionId(void)
Definition: xact.c:454
void XLogFlush(XLogRecPtr record)
Definition: xlog.c:2923
#define XLOG_INCLUDE_ORIGIN
Definition: xlog.h:154
uint64 XLogRecPtr
Definition: xlogdefs.h:21
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
Definition: xloginsert.c:474
void XLogRegisterData(const void *data, uint32 len)
Definition: xloginsert.c:364
void XLogSetRecordFlags(uint8 flags)
Definition: xloginsert.c:456
void XLogBeginInsert(void)
Definition: xloginsert.c:149

References Assert(), xl_logical_message::dbId, GetCurrentTransactionId(), IsTransactionState(), xl_logical_message::message_size, MyDatabaseId, xl_logical_message::prefix_size, SizeOfLogicalMessage, xl_logical_message::transactional, XLOG_INCLUDE_ORIGIN, XLOG_LOGICAL_MESSAGE, XLogBeginInsert(), XLogFlush(), XLogInsert(), XLogRegisterData(), and XLogSetRecordFlags().

Referenced by pg_logical_emit_message_bytea().