微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

libpqxx C聚合扩展返回错误的数据?

如何解决libpqxx C聚合扩展返回错误的数据?

我正在学习如何创建C聚合扩展,以及如何在客户端使用带有C ++的libpqxx来处理数据。

我的玩具集合扩展名有一个类型为[9,19] 的参数,并且状态也为类型bytea。以下是我的问题的最简单示例:

服务器端:

bytea

客户端:

PG_FUNCTION_INFO_V1( simple_func );

Datum simple_func( PG_FUNCTION_ARGS ){

    bytea *new_state   = (bytea *) palloc( 128 + VARHDRSZ );
    memset(new_state,128 + VARHDRSZ );
    SET_VARSIZE( new_state,128 + VARHDRSZ );

    PG_RETURN_BYTEA_P( new_state );

}

在客户端打印结果:

std::basic_string< std::byte > buffer;

pqxx::connection c{"postgresql://user:simplepassword@localhost/contrib_regression"};
pqxx::work w(c);
c.prepare( "simple_func","SELECT simple_func( $1 )  FROM table" );
pqxx::result r = w.exec_prepared( "simple_func",buffer );

for (auto row: r){ 
        cout << "  Result Size: " << row[ "simple_func" ].size() << endl;
        cout << "Raw Result Data: ";
        for( int jj=0; jj < row[ "simple_func" ].size(); jj++ ) printf( "%02" PRIx8,(uint8_t) row[ "simple_func" ].c_str()[jj] )  ;
        cout << endl;
}

重复Result Size: 258 Raw Result Data: 5c783030303030303030303030303030... 模式直到字符串末尾,并且十六进制打印的字符串为512字节。

我希望收到一个长度为128个字节的数组,其中每个字节都设置为零。我在做什么错了?

libpqxx版本为7.2,在Ubuntu 20.04上为Postgresql 12。

附录

安装sql语句;

30

解决方法

答案似乎是必须从7.0版本开始在libpqxx库中按如下方式检索客户端的bytea类型数据(在较早版本中未测试):

row[ "simple_func" ].as<std::basic_string<std::byte>>()

这将检索正确的字节数据,而无需进行任何转换,字符串特殊性或我所看到的意外行为。

,

我建议您一一解决这些问题:首先使该功能正常工作,在交互式查询中使用psql对其进行测试,然后编写客户端代码(反之亦然)。

我无法谈论libpqxx,但是我不得不抱怨您的功能:您呈现的内容甚至都无法编译,因为您以大写形式写了DATUM,并且忘记了标头和其他重要内容。

此函数将按预期编译并运行:

#include "postgres.h"
#include "fmgr.h"

PG_MODULE_MAGIC;

PG_FUNCTION_INFO_V1(simplest_func);

Datum simplest_func(PG_FUNCTION_ARGS) {
    bytea *new_state = (bytea *) palloc(128 + VARHDRSZ);
    memset(new_state,128 + VARHDRSZ);
    SET_VARSIZE(new_state,128 + VARHDRSZ);

    PG_RETURN_BYTEA_P(new_state);
}

memset可以那样工作,但是设置varlena的值的更好,更惯用且更可靠的方法是

    memset(VARDATA(new_state),128);

我不知道结果如何,但是由于您提供的代码无法编译,因此我不知道您的函数的外观。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。