PostgreSQL 16中适配VARSIZE/SET_VARSIZE编译mapnik-german-l10n
解决Ubuntu 22.04编译mapnik-german-l10n时PostgreSQL 16宏未定义报错
问题场景
在Ubuntu 22.04上编译mapnik-german-l10n时,osml10n_translit.cpp文件触发编译错误,提示VARSIZE、VARDATA、SET_VARSIZE未定义。
原因分析
PostgreSQL 16对变长数据类型(TOAST支持)的相关接口做了调整,postgres.h中移除了PostgreSQL 15及更早版本存在的VARSIZE、VARDATA、SET_VARSIZE宏,导致原有代码无法适配新版本。
代码修改方案
将osml10n_translit.cpp中涉及这三个宏的代码替换为PostgreSQL 16兼容的接口:
- 替换
VARSIZE(ptr)为VARSIZE_ANY(ptr):获取变长数据的总大小(包含头部),兼容普通和TOAST压缩的数据 - 替换
VARDATA(ptr)为VARDATA_ANY(ptr):获取变长数据的实际内容指针,兼容普通和TOAST压缩的数据 - 替换
SET_VARSIZE(ptr, size)为SET_VARSIZE_ANY_EXHDR(ptr, size - VARHDRSZ):设置变长数据的总大小,size - VARHDRSZ为实际数据长度(减去头部大小)
示例修改
原代码片段:
int old_len = VARSIZE(old_val); char* old_data = VARDATA(old_val); SET_VARSIZE(new_val, new_len);
修改后:
int old_len = VARSIZE_ANY(old_val); char* old_data = VARDATA_ANY(old_val); SET_VARSIZE_ANY_EXHDR(new_val, new_len - VARHDRSZ);
修改完成后重新编译即可解决报错。
内容的提问来源于stack exchange,提问作者stackbiz
相关产品推荐
相关产品推荐

