基于C语言和利用visual studio 2017 开发postgre-extension 的一波操作【实际体验了酸爽之后的分享】

news/2024/7/9 21:41:50 标签: c++, postgresql

写在前面:因为科研需要,需要使用vs来开发一个postgre-extension,查了很多了资料,翻遍了postgresql的官方文档,只了解到有关开发extension 的一些C语言相关知识,不过对于具体操作细节还是知之甚少,后来通过参考大神的博文,和很多次心累的尝试之后,终于实现了一个小的demo,现在分享出来给有需要的童鞋们,希望可以避免大家走太多的弯路。

环境准备 : visual studio 2017, C/C++开发环境(VS自带即可),postgresql 9.6, navicat(psql也可)。

实现目标 : 开发一个pg-extension,其功能是可以查看本机的主机名称

开发过程

  1. vs2017配置
    新建一个C++项目,并设置属性。不管是release 或者 debug,全部设置为:
    在这里插入图片描述
    设置动态库:
    在这里插入图片描述
    设置包含目录:主要包含一些头文件和API代码:
    在这里插入图片描述
    点击应用即可。

设置附加库目录:
在这里插入图片描述
附加依赖项
在这里插入图片描述

  1. 代码编写
    项目名称为: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.

  1. 编译并操作
    编译。
    停止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\中。

  2. 数据库操作
    第一次使用要在需要的数据库中创建扩展,以后除非新加函数,否则不需要再次创建扩展.
    在命令行中或者navicat中新建查询:输入语句:
    drop extension if exists pg_kmcb;
    create extension pg_kmcb;

在这里插入图片描述

  1. 结果展示
    创建extension之后,就可以使用刚刚创建的函数,运行结果如下:
    在这里插入图片描述
    便可以查出主机名称!

到这里,第一步就打通了!加油!


http://www.niftyadmin.cn/n/1438011.html

相关文章

基于rocksdb的开发API分享

rocksdb是一个基于LSM-Tree的kv存储引擎&#xff0c;通过官方api文档&#xff0c;可以进行一些开发&#xff0c;其网址为&#xff1a;https://rocksdb.org.cn/doc/Basic-Operations.html

leetcode题470:等概率生成随机数

此题是9.5日的每日一题&#xff0c;还是挺有趣的。一开始想的是利用两个随机数进行操作&#xff0c;然后获取结果进行一些操作&#xff0c;但是关键难度在于如何构造这个操作&#xff0c;其中需要一些技巧。后来看了题解&#xff0c;发现用二进制的方法来的更加直观巧妙&#x…

leecode5864,游戏中弱角色的数量

题目&#xff1a; 此题暴力肯定超时&#xff0c;所以可以利用一些技巧。 先让第一位升序&#xff0c;然后第二位降序的方式&#xff0c;从后向前遍历&#xff0c;并记录遍历时候第1维的最大值&#xff0c;因为如果第1维的数据小于前面记录的最大值&#xff0c;就表示第0维已经…

力扣239-滑动窗口最大值-单调队列

题目如下&#xff1a; 分析&#xff1a;利用单调队列&#xff0c;保持按照从大到小的顺序存放&#xff0c;同时为了保持滑动窗口的长度&#xff0c;所以队列中保存的是数据的下标。 代码如下&#xff1a; int len nums.length;List<Integer> list new ArrayList&l…

力扣502-IPO-hard-贪心,优先队列 -java

思路&#xff1a; 本题可以先构造处一个模型&#xff0c;我们的目的在于满足小于等于w的基础上&#xff0c;使得加上profits最大即可&#xff0c;因为是纯利润&#xff0c;不需要考虑w-capital的情况&#xff0c;所以我们只需要构造一个大根堆将所有满足条件的profits加入到堆中…

flink小试牛刀(java版本)-实现wordCount

导语&#xff1a;flink是一款优秀的批处理和流处理的大数据计算引擎&#xff0c;本文将通过flink的java api实现wordCount. 环境准备&#xff1a;idea, maven 实验&#xff1a; 1、maven 内容&#xff1a; <!-- flink--><!-- https://mvnrepository.com/art…

postgresql将查询到的json字符串转为jsonb格式并且转为Integer格式进行计算的语法

问题&#xff1a;如果你存在数据库中的某个字段的值为varchar格式&#xff0c;不过是json标准字符串格式&#xff0c;比如&#xff1a;{"zLen":"2438.4","yLen":"15049.9996086053","xLen":"26101.272018522"}&am…

力扣秋季赛-第二题-心算挑战

题目描述&#xff1a; 思路&#xff1a; 其实这一题最开始我是使用dfs进行搜索的&#xff0c;状态为dfs(pos, sum)&#xff1b;pos为当前枚举的cnt的位置&#xff0c;sum为当前的总和&#xff0c;但是由于数据量较大&#xff0c;容易超时。 其实这一题可以通过将奇数和偶数分离…