Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Postgres自定义类型映射到C结构?_C++_C_Postgresql_Postgresql 12 - Fatal编程技术网

C++ Postgres自定义类型映射到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;

我正在编写一个定制的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;     
    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
);