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代码如下:
#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扩展开发的更多相关文章
- 编写Postgres扩展之五:代码组织和版本控制
原文:http://big-elephants.com/2015-11/writing-postgres-extensions-part-v/ 编译:Tacey Wong 在关于编写Postgres扩 ...
- 编写Postgres扩展之四:测试
原文:http://big-elephants.com/2015-11/writing-postgres-extensions-part-iv/ 编译:http://big-elephants.com ...
- 编写Postgres扩展之一:基础
原文:http://big-elephants.com/2015-10/writing-postgres-extensions-part-i/ 编译:Tacey Wong Postgres提供了广泛的 ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- PHP 扩展开发(将自己的一些代码封装成PHP扩展函数)
今天时间不多,先给个地址,能搜到我这篇blog的朋友先看看我最近在看的一些文章.资料吧: 我的环境是 lnmp1.1 的 (LNMP一键安装包),所以要进行PHP扩展开发首先应该对环境配置和shell ...
- 关于PHP扩展开发(收藏)
一.Linux shell命令: ls –lh 查看文件大小 du –a 查看文件及文件夹大小 -------------------------- nginx ------------- ...
- 【转发】NPAPI学习(Firefox和Chrome扩展开发 )
NPAPI学习(Firefox和Chrome扩展开发 ) 2011-11-08 14:41:02 by [6yang], 1172 visits, 收藏 | 返回 Firefox和Chrome扩展开发 ...
- Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- PHP扩展开发相关总结
1.线程安全宏定义 在TSRM/TSRM.h文件中有如下定义 #define TSRMLS_FETCH() void ***tsrm_ls = (void ***) ts_resource_ex(0, ...
随机推荐
- 使用 gpg 加密文件 - 通过 shell 或 php
使用 gpg 加密文件 - 通过 shell 或 php 背景:客户提供私钥,并要求我方通过php把加密后的文件传输给他们. 环境 macOS Sierra 10.12.1 php 7.0.8 0.安 ...
- Node.js、express、mongodb 入门(基于easyui datagrid增删改查)
前言 从在本机(win8.1)环境安装相关环境到做完这个demo大概不到两周时间,刚开始只是在本机安装环境并没有敲个Demo,从周末开始断断续续的想写一个,按照惯性思维就写一个增删改查吧,一方面是体验 ...
- jquery兼容实验
使用jquery时候,曾经遇到两个问题: 1.一个页面里,使用了很多基于jquery的前端ui库,但是各个库之间对jquery的依赖的版本不一样,有的依赖jquery1.4,jquery2.0用不了: ...
- 归一化变换 Normalizing transformations
归一化变换包含两个部分,图像坐标的平移和尺度的缩放.进行归一化的变换不但能够提高处理结果的精确度,而且通过选择一个标准的坐标系预先的消除了图像尺度和坐标原点的选择对算法最终结果的影响. 归一化变换的步 ...
- Go语言异常处理defer\panic\recover
Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会很容易使得代码变得混乱.因为开发者很容易滥用异常, ...
- CSS魔法堂:"那不是bug,是你不懂我!" by inline-block
前言 每当来个需要既要水平排版又要设置固定高宽时,我就会想起display:inline-block,还有为了支持IE5.5/6/7的hack*display:inline;*zoom:1;.然后发 ...
- 多说使用ua-parser-js显示浏览器和系统信息
前言 昨天博客接入了评论系统,使用的是国内的多说. 之前看到过有些利用该评论系统的有浏览器和系统信息的显示,感觉很不错. 所以,也想有这样的效果. 问题 多说如何显示浏览器和系统的信息? 解决方法 经 ...
- 【MVVM Light】新手初识MVVM,你一看就会
一.前言 作为一个初入软件业的新手,各种设计模式与框架对我是眼花缭乱的.所以当我接触到这些新知识的时候就希望自己能总结几个步骤,以便更好更方便的在日常工作中进行使用. MVVM顾名思义就是Model- ...
- .net源码分析 – Dictionary<TKey, TValue>
接上篇:.net源码分析 – List<T> Dictionary<TKey, TValue>源码地址:https://github.com/dotnet/corefx/blo ...
- Android开发之重力传感器
重力传感器与方向传感器的开发步骤类似,只要理清了期中的x,y,z的值之后就可以根据他们的变化来进行编程了,首先来看一副图 假设当地的重力加速度值为g 当手机正面朝上的时候,z的值为q,反面朝上的时候, ...