openGauss/MogDB 调用 C FUNCTION

摘要

之前写过一篇关于postgresql 自定义函数实现,通过 contrib 模块进行扩展的帖子,今天和恩墨工程师进行了一些交流,在 MogDB 中也可以实现同样的功能,原以为需要完整的 openGauss 的源码才能完成,但在恩墨工程师的指点下,了解到,通过既有官网版本的安装包就可以进行插件开发。而且,使用 postgres 的 C FUNCTION 要比开发插件更加容易些。也感谢恩墨专家提供的线索和思路

环境准备

安装 MogDB 参考官方文档,写的已经很详细了。

服务器环境 本地虚拟机 centos 7.9

注意:尽量进入omm用户下进行编译,可以避免一些不必要的环境问题

代码

C 代码 基本与 postgres 插件开发一样,关键是 4,5,6 三行。

include "postgres.h"

include "fmgr.h"

PG_MODULE_MAGIC;

extern "C" Datum add_ab(PG_FUNCTION_ARGS);

PG_FUNCTION_INFO_V1(add_ab);

Datum

add_ab(PG_FUNCTION_ARGS)

{

int32 arg_a = PG_GETARG_INT32(0);

int32 arg_b = PG_GETARG_INT32(1);

      PG_RETURN_INT32(arg_a + arg_b);

}

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)

project (gs_plug)

set(CMAKE_CXX_FLAGS "-Wall -std=c++11 -Wall")

set(CMAKE_CXX_FLAGS_DEBUG "-g3")

set(CMAKE_CXX_FLAGS_RELEASE "-O2")

set(CMAKE_BUILD_TYPE Debug)

set(MOG_INCLUDE /opt/mogdb/app/include/postgresql/server)

set(MOG_LIBPATH /opt/mogdb/app/lib/postgresql/proc_srclib)

include_directories(${MOG_INCLUDE})

aux_source_directory(. DIR_SRCS)

add_library (${PROJECT_NAME} SHARED ${DIR_SRCS})

install(TARGETS ${PROJECT_NAME} DESTINATION ${MOG_LIBPATH})

要点 1:获取包含头文件的目录

[omm@vmpc funcs]$ pg_config --includedir

/opt/mogdb/app/include

所需头文件路径:pg_config --includedir/postgresql/server

要点 1:c 函数安装路径

[omm@vmpc funcs]$ pg_config --pkglibdir

/opt/mogdb/app/lib/postgresql

安装路径:pg_config --pkglibdir/proc_srclib/

编译 & 安装

[omm@vmpc funcs]$ mkdir build

[omm@vmpc funcs]$ cd build/

[omm@vmpc build]$ cmake ../

CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):

Compatibility with CMake < 2.8.12 will be removed from a future version of

CMake.

Update the VERSION argument value or use a ... suffix to tell

CMake that the project does not need compatibility with older versions.

-- The C compiler identification is GNU 4.8.5

-- The CXX compiler identification is GNU 4.8.5

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Check for working C compiler: /bin/cc - skipped

-- Detecting C compile features

-- Detecting C compile features - done

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

-- Check for working CXX compiler: /bin/c++ - skipped

-- Detecting CXX compile features

-- Detecting CXX compile features - done

-- Configuring done

-- Generating done

-- Build files have been written to: /opt/mogdb/funcs/build

[omm@vmpc build]$ make

[ 50%] Building CXX object CMakeFiles/gs_plug.dir/testfunc.cpp.o

[100%] Linking CXX shared library libgs_plug.so

[100%] Built target gs_plug

[omm@vmpc build]$ make install

Consolidate compiler generated dependencies of target gs_plug

[100%] Built target gs_plug

Install the project...

-- Install configuration: "Debug"

-- Installing: /opt/mogdb/app/lib/proc_srclib/libgs_plug.so

依次执行如下命令

mkdir build

cd build

cmake ../

make

make install

确认安装

[omm@vmpc build]$ ll /opt/mogdb/app/lib/proc_srclib/libgs_plug.so

-rwxr-xr-x. 1 omm dbgrp 215696 Apr 2 00:17 /opt/mogdb/app/lib/proc_srclib/libgs_plug.so

验证

链接 mogdb

[omm@vmpc ~]$ pgcli -p 26000 -d postgres

Server: PostgreSQL 9.2.4

Version: 3.4.1

Home: http://pgcli.com

postgres>

创建 C FUNCTION

postgres> CREATE FUNCTION add_ab(a int ,b int ) RETURNS integer

AS 'testfunc.so', 'add_ab'

LANGUAGE C STRICT;

CREATE FUNCTION

Time: 0.039s

查看函数

调用函数

postgres> select add_ab(a := 4, b := 2);

+--------+

add_ab
6
+--------+
SELECT 1
Time: 0.033s
postgres>

openGauss/MogDB调用C FUNCTION的更多相关文章

  1. 按按钮调用PHP function函数

    首先,请大家看一段HTML代码: <html> <head> </head> <body> <input type=button on_click ...

  2. 如何调用在$(function(){ //内部函数代码 });

    这个文件主要完成如何调用在jquery内部定义的函数,主要有两种方法 法①: <script type="text/javascript"> $(function() ...

  3. MVC调用函数function.php

    <?php //控制器的调用函数C function C($name, $method){ require_once('/libs/controller/'.$name.'Controller. ...

  4. Oracle数据库中的Function调用参数问题

    在工作中用到了Oracle数据库,需要调用Oracle的Function,Function返回的游标和结果都是通过参数来获取的 比如Function定义如下: , intype, ininttype) ...

  5. function module 之间调用

    1: 在一个function group 中定义一个function module 2:在另外一个module中调用该module "调用其它function 要用 单引号 引着. 一个mo ...

  6. Js基础知识4-函数的三种创建、四种调用(及关于new function()的解释)

    在js中,函数本身属于对象的一种,因此可以定义.赋值,作为对象的属性或者成为其他函数的参数.函数名只是函数这个对象类的引用. 函数定义 // 函数的三种创建方法(定义方式) function one( ...

  7. 从成员函数指针生成可调用对象:function<>、mem_fn()和bind()

    我们知道,普通函数指针是一个可调用对象,但是成员函数指针不是可调用对象.因此,如果我们想在一个保存string的vector中找到第一个空string,不能这样写: vector<string& ...

  8. oracle to mogdb 迁移---mtk工具

    ## 一.MTK工具介绍--------- MTK–异构数据迁移工具 MTK全称为 Database Migration Toolkit,是一个可以将Oracle/DB2/MySQL/openGaus ...

  9. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  10. JavaScript语言精粹--Function,类,this,对象

    1.类与对象 在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的. JS对象是一种复合类型,它 ...

随机推荐

  1. Taurus.MVC WebMVC 入门开发教程7:部分视图和页面片段(结束篇)

    本系列的目录大纲为: Taurus.MVC WebMVC 入门开发教程1:框架下载环境配置与运行 Taurus.MVC WebMVC 入门开发教程2:一个简单的页面呈现 Taurus.MVC WebM ...

  2. 3.1蓝桥杯每日知识点,全排列permutation

    next_permutation()函数 适用于生成当前序列的下一个排列 如果存在下一个排列,则将当前序列更改为下一个排列,并返回true 如果当前序列已经是最后一个排列,则将序列更改为第一个排列,并 ...

  3. python使用selenium适配谷歌浏览器插件, chromedriver与chrome各版本及下载地址

    python selenium使用,需要谷歌chromedriver.exe插件 chromedriver.exe插件是放在python的安装目录下(亲测,其它的都不对) 以下是chromedrive ...

  4. 基于RocketMQ实现分布式事务

    背景 在一个微服务架构的项目中,一个业务操作可能涉及到多个服务,这些服务往往是独立部署,构成一个个独立的系统.这种分布式的系统架构往往面临着分布式事务的问题.为了保证系统数据的一致性,我们需要确保这些 ...

  5. 新零售SaaS架构:什么是线上商城系统?

    零售商家为什么要建设线上商城 传统的实体门店服务范围有限,只能吸引周边500米内的消费者.因此,如何拓展服务范围,吸引更多消费者到店,成为了店家迫切需要解决的问题. 缺乏忠实顾客,客户基础不稳,往往是 ...

  6. 深入浅出Java多线程(十一):AQS

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十一篇内容:AQS(AbstractQueuedSynchronizer).大家觉得有用请点赞,喜欢请关注!秀才在此谢 ...

  7. eclipse错误之Errors occurred during the build. Errors running builder 'JavaScript Validator' on project

    把JavaScript Validator去掉.去掉的方法是:选择一个项目--右键Properties--Builders(排第二)--点一下右侧会有四项--取消第一项"JavaScript ...

  8. eclipse错误之Unhandled event loop exception PermGen space

    原来一直用eclipse3.5,最近尝试升级到3.7和4.2,但不管是3.7还是4.2项目编译过程中总提示"Unhandled event loop exception PermGen sp ...

  9. 软件开发、持续集成(CI)、持续交付(CD)、持续部署(CD) 和 版本管理(Version Control) 的理解和思考

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  10. YAML语法入门

    Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. Ansible系列博文直达链接:Ansible入门系列 前言 在学习playboo ...