https://github.com/postgres/postgres/commit/9ea3b6f751abd7701f3f32d9df26d66410754c94
该提交(9ea3b6f751abd7701f3f32d9df26d66410754c94)的主要内容和意义如下:
标题: Expand usage of macros for protocol characters 作者: Nathan Bossart 提交时间: 2025-08-06 链接: https://github.com/postgres/postgres/commit/9ea3b6f751abd7701f3f32d9df26d66410754c94
PqReplMsg_* 和 PqBackupMsg_*,分别用于复制、备份相关的特殊消息。'w'、'k'、'r'、'm'等。src/include/libpq/protocol.h 头文件中集中定义了这些宏,提升了可维护性和可读性,降低了出错风险。以物理复制和 BaseBackup 协议为例:
原代码(伪代码):
pq_sendbyte(ctx->out, 'w'); // 发送WAL数据
新代码:
pq_sendbyte(ctx->out, PqReplMsg_WALData);
原代码:
if (copybuf[0] == 'k') { ... } // 保活消息
新代码:
if (copybuf[0] == PqReplMsg_Keepalive) { ... }
原代码:
switch (GetCopyDataByte(...)) {
case 'n': // 新归档
...
}
新代码:
switch (GetCopyDataByte(...)) {
case PqBackupMsg_NewArchive:
...
}
#define PqReplMsg_Keepalive 'k'
#define PqReplMsg_WALData 'w'
#define PqReplMsg_StandbyStatusUpdate 'r'
#define PqBackupMsg_NewArchive 'n'
#define PqBackupMsg_ProgressReport 'p'
#define PqBackupMsg_Manifest 'm'
此次提交将协议相关的关键字母全部用宏封装,便于后续协议拓展和维护,也减少了开发者“魔法字符”误用、出错的可能性。所有涉及协议通信的地方都推荐采用这些宏。
如需进一步了解如何在自己的代码中应用这些宏,请告知具体使用场景。