写在前面:因为科研需要,需要使用vs来开发一个postgre-extension,查了很多了资料,翻遍了postgresql的官方文档,只了解到有关开发extension 的一些C语言相关知识,不过对于具体操作细节还是知之甚少,后来通过参考大神的博文,和很多次心累的尝试之后,终于实现了一个小的demo,现在分享出来给有需要的童鞋们,希望可以避免大家走太多的弯路。
环境准备 : visual studio 2017, C/C++开发环境(VS自带即可),postgresql 9.6, navicat(psql也可)。
实现目标 : 开发一个pg-extension,其功能是可以查看本机的主机名称
开发过程:
- vs2017配置
新建一个C++项目,并设置属性。不管是release 或者 debug,全部设置为:
设置动态库:
设置包含目录:主要包含一些头文件和API代码:
点击应用即可。
设置附加库目录:
附加依赖项
- 代码编写
项目名称为:pg_kmcb,添加一个C文件为:pg_function.c
其内容为:
#include <stdio.h>
#include "postgres.h"
#include "fmgr.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
/*获取主机名函数*/
PGDLLEXPORT Datum hostname(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(hostname);
/*获取主机名*/
Datum hostname(PG_FUNCTION_ARGS) {
text *result;
size_t len;
char buf[1024 + sizeof(char)];
gethostname(buf, 1024);
len = strlen(buf);
elog(NOTICE, "hostname=%s\n", buf);
result = (text *)palloc(len + VARHDRSZ);
SET_VARSIZE(result, len + VARHDRSZ);
memcpy(VARDATA(result), buf, len);
PG_RETURN_TEXT_P(PointerGetDatum(result));
}
新建一个comtrol文件:
(红色框里卖弄的路径为编译好的dll文件路径)
新建一个sql文件:
用于在pg中创建函数hostname.
-
编译并操作
编译。
停止postgresql。
然后将生成的pg_kmcb.dll 文件:2017C++\x64\Release\pg_kmcb.dll 复制到\pgsql\lib中;
将2017C++\pg_kmcb\pg_kmcb.control文件复制到 \pgsql\share\extension\中;
将\2017C++\pg_kmcb\pg_kmcb–1.0.sql文件复制到 \pgsql\share\extension\中。 -
数据库操作
第一次使用要在需要的数据库中创建扩展,以后除非新加函数,否则不需要再次创建扩展.
在命令行中或者navicat中新建查询:输入语句:
drop extension if exists pg_kmcb;
create extension pg_kmcb;
- 结果展示
创建extension之后,就可以使用刚刚创建的函数,运行结果如下:
便可以查出主机名称!
到这里,第一步就打通了!加油!