gpt4 book ai didi

c - 如何访问Postgresql c语言函数中的大对象?

转载 作者:太空宇宙 更新时间:2023-11-04 00:04:54 25 4
gpt4 key购买 nike

我正在写一个 c-language postgresql 9.3.5 的用户定义函数。我没有使用 pl/pgsql 或 pl/python,因为其中一部分需要用 C 编写以提高速度。

该函数获取一个现有的 OID 作为参数。如何从 C 语言函数中访问和修改 OID 数据?我找不到任何文档!

到目前为止,函数内部只有读取参数的部分:

#include "postgres.h"
#include "fmgr.h"
PG_MODULE_MAGIC;

Datum tsdb_write_lob(PG_FUNCTION_ARGS) ;

PG_FUNCTION_INFO_V1(tsdb_write_lob);



Datum tsdb_write_lob(PG_FUNCTION_ARGS) {
int16 arg_dataformat = PG_GETARG_INT16(0);
int16 arg_granularity_days = PG_GETARG_INT16(1);
Oid arg_dataoid = PG_GETARG_OID(2);

ereport( INFO, (errcode( ERRCODE_SUCCESSFUL_COMPLETION ),
errmsg("Arguments were: %d, %d, %ld\n",arg_dataformat,arg_granularity_days,arg_dataoid)));


/*TODO:
* open oid (lo_open ?)
* read data
* decompress data
* parse data
* add new data
* compress data
* save to same oid
*/



PG_RETURN_VOID();
}

更新:这似乎是一个例子:

https://github.com/postgres/postgres/blob/master/src/backend/libpq/be-fsstubs.c

最佳答案

这是一个想法

#include <postgres.h>
#include <utils/rel.h>
#include <utils/array.h>
#include <commands/trigger.h>
#include <executor/spi.h>

PG_MODULE_MAGIC;

Datum tsdb_write_lob(PG_FUNCTION_ARGS) ;

extern SPITupleTable *SPI_tuptable;

PG_FUNCTION_INFO_V1(tsdb_write_lob);
Datum tsdb_write_lob(PG_FUNCTION_ARGS) {
{
int16 arg_dataformat = PG_GETARG_INT16(0);
int16 arg_granularity_days = PG_GETARG_INT16(1);
Oid arg_dataoid = PG_GETARG_OID(2);
char command[128];

if (SPI_ERROR_CONNECT == SPI_connect())
PG_RETURN_VOID();
snprintf(command, sizeof(command), "SELECT lo_open(INV_READ, %d)", arg_dataoid);
if (SPI_OK_SELECT != SPI_execute(command, false, 0))
PG_RETURN_VOID();
.
.
.
/* do loread here the same way by using SPI_execute("SELECT loread ...") */
SPI_finish();

PG_RETURN_VOID();
}

您需要阅读有关 SPI_tubtable 的内容找出如何解析查询的指针,以及整个 SPI Server Programming Interface .

关于c - 如何访问Postgresql c语言函数中的大对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28156936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com