扩展开发的基本组成

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代码如下:

  #ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif PG_FUNCTION_INFO_V1(test_add_fun); Datum test_add_fun(PG_FUNCTION_ARGS); Datum test_add_fun(PG_FUNCTION_ARGS)
{
int sum,a,b; a = PG_GETARG_INT32();
b = PG_GETARG_INT32(); sum = a + b;
PG_RETURN_INT32(sum);
}

Makfile如下:

 MODULE_big = demo

 IBASE_VERSION=1.0

 OBJS =  demo.o

 EXTENSION = demo
DATA = demo--1.0.sql SHLIB_LINK += $(filter -lm, $(LIBS))
USE_PGXS=
ifdef USE_PGXS
PG_CONFIG = /usr/local/postgres/bin/pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
else
subdir = contrib/demo
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk
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 demo.so '/usr/local/postgres/lib/demo.so'
/usr/bin/install -c -m demo.control '/usr/local/postgres/share/extension/'
/usr/bin/install -c -m 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(,);
test_add_fun
-------------- ( row)

postgres扩展开发的更多相关文章

  1. 编写Postgres扩展之五:代码组织和版本控制

    原文:http://big-elephants.com/2015-11/writing-postgres-extensions-part-v/ 编译:Tacey Wong 在关于编写Postgres扩 ...

  2. 编写Postgres扩展之四:测试

    原文:http://big-elephants.com/2015-11/writing-postgres-extensions-part-iv/ 编译:http://big-elephants.com ...

  3. 编写Postgres扩展之一:基础

    原文:http://big-elephants.com/2015-10/writing-postgres-extensions-part-i/ 编译:Tacey Wong Postgres提供了广泛的 ...

  4. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

  5. PHP 扩展开发(将自己的一些代码封装成PHP扩展函数)

    今天时间不多,先给个地址,能搜到我这篇blog的朋友先看看我最近在看的一些文章.资料吧: 我的环境是 lnmp1.1 的 (LNMP一键安装包),所以要进行PHP扩展开发首先应该对环境配置和shell ...

  6. 关于PHP扩展开发(收藏)

    一.Linux shell命令: ls –lh    查看文件大小 du –a    查看文件及文件夹大小 -------------------------- nginx ------------- ...

  7. 【转发】NPAPI学习(Firefox和Chrome扩展开发 )

    NPAPI学习(Firefox和Chrome扩展开发 ) 2011-11-08 14:41:02 by [6yang], 1172 visits, 收藏 | 返回 Firefox和Chrome扩展开发 ...

  8. Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  9. PHP扩展开发相关总结

    1.线程安全宏定义 在TSRM/TSRM.h文件中有如下定义 #define TSRMLS_FETCH() void ***tsrm_ls = (void ***) ts_resource_ex(0, ...

随机推荐

  1. Android APP压力测试(二)之Monkey信息自动收集脚本

      Android APP压力测试(二) 之Monkey信息自动收集脚本 前言: 上一篇Monkey介绍基本搬抄官方介绍,主要是为了自己查阅方便.本文重点介绍我在进行Monkey时如何自动收集相关信息 ...

  2. jQuery-1.9.1源码分析系列(四) 缓存系统

    先前在分析Sizzle的时候分析到Sizzle有自己的缓存机制,点击这里查看.不过Sizzle的缓存只是对内使用的(内部自己存,自己取).接下来分析jQuery可以对外使用的缓存(可存可取). 首先需 ...

  3. 在Mac下运行ASP.NET Core应用程序

    在Mac下运行ASP.NET Core应用程序 通过参照.NET Core相关官方文档,在我的Mac电脑上用Visual Studio Code创建了我的第一个ASP.NET应用. 开发环境搭建 首先 ...

  4. STM32L时钟

    Four different clock sources can be used to drive the system clock (SYSCLK): 1.HSI ((high-speed inte ...

  5. WPF透明设置(Opacity)

    <TextBlock Text="阴影效果" FontSize="32"></TextBlock> <Border Height= ...

  6. C#中AppDomain.CurrentDomain.BaseDirectory及各种路径获取方法

    // 获取程序的基目录.System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径,包含文件名System.Diagnostics.Proces ...

  7. 自从升级到macOS后,整个人都不好了

    电脑一直莫名的随机卡死,各种软件都出现了一些崩溃和不稳定的情况. Siri就是个笑话,启用后就开始索引本地硬盘,不管你有没有正在工作:直到你启动Siri,会暂停一下,然后就算是你开在哪不动,过两分钟, ...

  8. 转载:《TypeScript 中文入门教程》 3、接口

    版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本. 介绍 TypeScript的核心原则之一是对值所具有的shape进行类型检查. 它有时 ...

  9. Linux Cmd Tool 系列之—history & search command history

    History cmd is for list Bash's log of the historical cmd you typed 1. List last n commands history n ...

  10. apache反向代理

    正向代理是客户端发送请求给代理服务器,代理服务器将请求发给实际处理的服务器 反向代理是客户端发送请求给服务器(实际上是个代理服务器),服务器将请求发给实际处理的服务器 情景 在一台服务器上开了apac ...