C++ Postgres自定义类型映射到C结构?
我正在编写一个定制的Postgres C聚合扩展。我想知道如何正确地将PSQL中定义的类型映射到C中定义的结构。我已经尽我所知尽了最大努力,但没有得到结果,我在测试时得到一个空行 C结构具有以下形式:C++ Postgres自定义类型映射到C结构?,c++,c,postgresql,postgresql-12,C++,C,Postgresql,Postgresql 12,我正在编写一个定制的Postgres C聚合扩展。我想知道如何正确地将PSQL中定义的类型映射到C中定义的结构。我已经尽我所知尽了最大努力,但没有得到结果,我在测试时得到一个空行 C结构具有以下形式: typedef struct { int64_t row_idx; //Row number in the processing order (NOT thread safe) int64_t data1_size; int64_t data2_size;
typedef struct {
int64_t row_idx; //Row number in the processing order (NOT thread safe)
int64_t data1_size;
int64_t data2_size;
char data2[ 1<<10 ];
char data1[ 1<<10 ];
} search_state;
我可以给你一些建议 首先,我想你知道这件事 数据类型的内部表示形式可以是任何形式,但我不会分配超出需要的内存 内部和外部表示之间的映射完全由您决定,并由您编写的类型输入和输出函数决定 但我不明白,如果您只想编写一个聚合函数,为什么需要用C编写一个特殊类型 我只是想
CREATE TYPE search_state AS (
row_idx bigint,
data2 text,
data1 text
);
并将此复合类型与函数一起使用。在您的C代码中获得这种类型的组件并不困难,而且它将为您省去编写大量锅炉板代码的麻烦。我给出的示例简单明了。真正的代码是复杂的,而且在字符串数据上发生了很多花哨的计算,由于依赖性和类库,C++中的扩展是必需的。但我不明白为什么这需要用C写的类型。你能不能写一个简单的例子,说明如何在聚合函数中从C/C++中写入/读取这种类型的data1、data2?所以,这种方法的复杂性对我来说太高了…有很多postgres框架的东西需要担心。。。没有一个清晰的示例/模板可供参考。官方文件在这方面没有帮助。我决定以不同的方式实现这一点。
Datum fancy_select(PG_FUNCTION_ARGS){
//Get the Postgres C-Extension Parameters
search_state *state = (search_state * ) PG_GETARG_POINTER(0);
char *inputText = PG_GETARG_CSTRING(1);
uint64_t numeric_id = PG_GETARG_INT64(2);
//Make object to store state from now on.
search_state *new_state = (search_state *) palloc( 2*(1<<10) + 8*3 );
//Small Test updating the state
new_state->row_idx = 1;
new_state->data1[0] = 'T'
new_state->data1[1] = '\0'
new_state->data2[0] = 'H'
new_state->data2[1] = '\0'
new_state->data1_size = strlen( new_state->data1 ) ;
new_state->data2_size = strlen( new_state->data2 ) ;
//Return state
PG_RETURN_POINTER( new_state );
};
}
ERROR: type with OID 0 does not exist
CONTEXT: PL/pgSQL function final_func(search_state) while storing call arguments into local variables
CREATE TYPE search_state AS (
row_idx bigint,
data2 text,
data1 text
);