Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * logicalmsgdesc.c 4 : * rmgr descriptor routines for replication/logical/message.c 5 : * 6 : * Portions Copyright (c) 2015-2024, PostgreSQL Global Development Group 7 : * 8 : * 9 : * IDENTIFICATION 10 : * src/backend/access/rmgrdesc/logicalmsgdesc.c 11 : * 12 : *------------------------------------------------------------------------- 13 : */ 14 : #include "postgres.h" 15 : 16 : #include "replication/message.h" 17 : 18 : void 19 0 : logicalmsg_desc(StringInfo buf, XLogReaderState *record) 20 : { 21 0 : char *rec = XLogRecGetData(record); 22 0 : uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; 23 : 24 0 : if (info == XLOG_LOGICAL_MESSAGE) 25 : { 26 0 : xl_logical_message *xlrec = (xl_logical_message *) rec; 27 0 : char *prefix = xlrec->message; 28 0 : char *message = xlrec->message + xlrec->prefix_size; 29 0 : char *sep = ""; 30 : 31 : Assert(prefix[xlrec->prefix_size - 1] == '\0'); 32 : 33 0 : appendStringInfo(buf, "%s, prefix \"%s\"; payload (%zu bytes): ", 34 0 : xlrec->transactional ? "transactional" : "non-transactional", 35 : prefix, xlrec->message_size); 36 : /* Write message payload as a series of hex bytes */ 37 0 : for (int cnt = 0; cnt < xlrec->message_size; cnt++) 38 : { 39 0 : appendStringInfo(buf, "%s%02X", sep, (unsigned char) message[cnt]); 40 0 : sep = " "; 41 : } 42 : } 43 0 : } 44 : 45 : const char * 46 0 : logicalmsg_identify(uint8 info) 47 : { 48 0 : if ((info & ~XLR_INFO_MASK) == XLOG_LOGICAL_MESSAGE) 49 0 : return "MESSAGE"; 50 : 51 0 : return NULL; 52 : }