postgres扩展开发

扩展开发的基本组成

demo--1.0.sql

demo.c

demo.control

Makefile

demo.c当中包含了自定义函数的实现,纯C语言,目录下可包含多个.c文件。
demo—1.0.sql对自定义函数的声明,在pg启动的时候会执行这个sql。
demo.control这个应该是版本控制,以及module_pathname告诉PG在执行到用户自定义函数的时候去这个路径下找库文件。
Makefile编译文件。

开发的基本技巧

写扩展函数的基本三部曲
第一步:(必须要的)
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
第二步:(必须要的)
PG_FUNCTION_INFO_V1(test_add_fun);
第三步:(必须要的)
test_add_fun函数功能的实现。

获取外部参数函数是PG_GETARG_XXXX();
返回值的返回函数PG_RETURN_XXXX();
Ps:按照这一套你就能进行扩展开发了。

demo.c代码如下:

 1 #ifdef PG_MODULE_MAGIC
 2 PG_MODULE_MAGIC;
 3 #endif
 4 
 5 PG_FUNCTION_INFO_V1(test_add_fun);
 6 
 7 Datum test_add_fun(PG_FUNCTION_ARGS);
 8 
 9 Datum test_add_fun(PG_FUNCTION_ARGS)
10 {
11         int sum,a,b;
12 
13         a = PG_GETARG_INT32(0);
14         b = PG_GETARG_INT32(1);
15 
16         sum = a + b;
17         PG_RETURN_INT32(sum);
18 }

Makfile如下:

 1 MODULE_big = demo
 2 
 3 IBASE_VERSION=1.0
 4 
 5 OBJS =  demo.o
 6 
 7 EXTENSION = demo
 8 DATA = demo--1.0.sql
 9 
10 SHLIB_LINK += $(filter -lm, $(LIBS))
11 USE_PGXS=1
12 ifdef USE_PGXS
13 PG_CONFIG = /usr/local/postgres/bin/pg_config
14 PGXS := $(shell $(PG_CONFIG) --pgxs)
15 include $(PGXS)
16 else
17 subdir = contrib/demo
18 top_builddir = ../..
19 include $(top_builddir)/src/Makefile.global
20 include $(top_srcdir)/contrib/contrib-global.mk
21 endif

编译安装

[root@centos01 demo]# make
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -O0 -fpic -I. -I./ -I/usr/local/postgres/include/server -I/usr/local/postgres/include/internal -D_GNU_SOURCE   -c -o demo.o demo.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -O0 -fpic -shared -o demo.so demo.o -L/usr/local/postgres/lib -Wl,--as-needed -Wl,-rpath,'/usr/local/postgres/lib',--enable-new-dtags  -lm 
[root@centos01 demo]# make install
/usr/bin/mkdir -p '/usr/local/postgres/lib'
/usr/bin/mkdir -p '/usr/local/postgres/share/extension'
/usr/bin/mkdir -p '/usr/local/postgres/share/extension'
/usr/bin/install -c -m 755  demo.so '/usr/local/postgres/lib/demo.so'
/usr/bin/install -c -m 644 demo.control '/usr/local/postgres/share/extension/'
/usr/bin/install -c -m 644 demo--1.0.sql '/usr/local/postgres/share/extension/'

创建扩展并使用

postgres=# create extension demo;
CREATE EXTENSION
postgres=# sf test_add_fun
CREATE OR REPLACE FUNCTION public.test_add_fun(a integer, b integer)
 RETURNS integer
 LANGUAGE c
 STRICT
AS '$libdir/demo', $function$test_add_fun$function$
postgres=# select test_add_fun(12,22);
 test_add_fun 
--------------
           34
(1 row)

 

原文地址:https://www.cnblogs.com/lujunfeng/p/6092608.html