PostgreSQL 19 魔法字符将被抛弃
|
maoxiaoming
2025年8月27日 15:21
本文热度 57
|
PostgreSQL 19 preview - 协议扩展: 新增宏替代魔法字符
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
主要内容
- 本次提交将协议消息中的“魔法字符(protocol characters)”硬编码,替换为了统一的宏定义(macro)。
- 新增了多个宏,如
PqReplMsg_*
和 PqBackupMsg_*
,分别用于复制、备份相关的特殊消息。 - 在多处代码(如流复制、逻辑复制、BaseBackup、pg_basebackup工具等)用宏替换了原本的字符字面量,如
'w'
、'k'
、'r'
、'm'
等。 - 在
src/include/libpq/protocol.h
头文件中集中定义了这些宏,提升了可维护性和可读性,降低了出错风险。
影响范围
- 客户端工具(如pg_basebackup、pg_recvlogical等)
使用示例
以物理复制和 BaseBackup 协议为例:
1. 后端发送 WAL 数据
原代码(伪代码):
pq_sendbyte(ctx->out, 'w'); // 发送WAL数据
新代码:
pq_sendbyte(ctx->out, PqReplMsg_WALData);
2. 客户端接收消息类型
原代码:
if (copybuf[0] == 'k') { ... } // 保活消息
新代码:
if (copybuf[0] == PqReplMsg_Keepalive) { ... }
3. 备份流程中处理新归档文件
原代码:
switch (GetCopyDataByte(...)) {
case 'n': // 新归档
...
}
新代码:
switch (GetCopyDataByte(...)) {
case PqBackupMsg_NewArchive:
...
}
4. 定义宏(src/include/libpq/protocol.h)
#define PqReplMsg_Keepalive 'k'
#define PqReplMsg_WALData 'w'
#define PqReplMsg_StandbyStatusUpdate 'r'
#define PqBackupMsg_NewArchive 'n'
#define PqBackupMsg_ProgressReport 'p'
#define PqBackupMsg_Manifest 'm'
总结
此次提交将协议相关的关键字母全部用宏封装,便于后续协议拓展和维护,也减少了开发者“魔法字符”误用、出错的可能性。所有涉及协议通信的地方都推荐采用这些宏。
参考链接
如需进一步了解如何在自己的代码中应用这些宏,请告知具体使用场景。
该文章在 2025/8/27 15:21:34 编辑过