Postgresql中的C库函数

时间:2016-09-22 17:09:58

标签: c visual-studio postgresql function

我正在使用Visual Studio 2015构建postgres函数,当我尝试使用我的函数时收到此消息:

  

服务器意外关闭了连接       这可能意味着服务器异常终止       处理请求之前或处理时。

这是我的代码:

C:

.c文件:

#include<iostream>
#include<math.h>

extern "C" {
#include "postgres.h"
#include "fmgr.h"
#include "sysmoroundtoabnt.h"
#include "utils/builtins.h"
#include "catalog/pg_type.h"
#ifdef PG_MODULE_MAGIC
    PG_MODULE_MAGIC;
#endif
}

PG_FUNCTION_INFO_V1(sysmoroundtoabnt);

Datum
sysmoroundtoabnt(PG_FUNCTION_ARGS)
{
    PG_RETURN_INT32(10);
    //PG_RETURN_FLOAT8(10);
    //...
}

.h文件

#ifndef SYSMOROUNDTOABNT_H
#define SYSMOROUNDTOABNT_H

#include "fmgr.h"

extern "C" __declspec(dllimport) Datum sysmoroundtoabnt(PG_FUNCTION_ARGS);

#endif  

PostgreSQL的:

create or replace function teste_victor( double precision, integer )
returns double precision
as '$libdir/sysmoroundtoabnt', 'sysmoroundtoabnt' language C;

SQL命令

select teste_victor(0.015, -2)

PS。:如果我更改C代码以返回PG_RETURN_FLOAT8(10),我会收到错误:

  

无效的内存分配请求大小4294967290

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:0)

代码

PG_RETURN_INT32(10);

绑定失败,因为声明函数返回double precision而不是integer。 C对这种错误是不可原谅的。

我尝试了你的功能(没有__declspec(dllimport),因为我在Linux上使用GNU C)使用正确的

PG_RETURN_FLOAT8(10);

它按预期工作。

因此,构建可执行文件似乎一定存在错误。

如果你使用的是C而不是Windows,我建议使用PostgreSQL extension building infrastructure,但这不是C ++或Windows的选项。

问题是您必须使用与PostgreSQL相同的#define构建函数 查看definition of PG_RETURN_FLOAT8,我怀疑相关的#defineUSE_FLOAT8_BYVAL

您使用的是构建PostgreSQL时使用的include/pg_config.h吗?

如果您在构建标记中添加/DUSE_FLOAT8_BYVAL/UUSE_FLOAT8_BYVAL,是否有效?

您是否使用了用于构建PostgreSQL的相同Visual Studio版本?

您使用\MD构建了吗?

答案 1 :(得分:0)

解决问题:

  1. 删除两个文件的extern "C";
  2. PGDLLEXPORT Datum sysmoroundtoabnt(PG_FUNCTION_ARGS)放在.h文件上;
  3. 在.c文件上将Double更改为Float8,将Int更改为Int32;
  4. 我想主要的问题是我如何阐述我的功能。