openGauss/MogDB调用C FUNCTION
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的更多相关文章
- 按按钮调用PHP function函数
首先,请大家看一段HTML代码: <html> <head> </head> <body> <input type=button on_click ...
- 如何调用在$(function(){ //内部函数代码 });
这个文件主要完成如何调用在jquery内部定义的函数,主要有两种方法 法①: <script type="text/javascript"> $(function() ...
- MVC调用函数function.php
<?php //控制器的调用函数C function C($name, $method){ require_once('/libs/controller/'.$name.'Controller. ...
- Oracle数据库中的Function调用参数问题
在工作中用到了Oracle数据库,需要调用Oracle的Function,Function返回的游标和结果都是通过参数来获取的 比如Function定义如下: , intype, ininttype) ...
- function module 之间调用
1: 在一个function group 中定义一个function module 2:在另外一个module中调用该module "调用其它function 要用 单引号 引着. 一个mo ...
- Js基础知识4-函数的三种创建、四种调用(及关于new function()的解释)
在js中,函数本身属于对象的一种,因此可以定义.赋值,作为对象的属性或者成为其他函数的参数.函数名只是函数这个对象类的引用. 函数定义 // 函数的三种创建方法(定义方式) function one( ...
- 从成员函数指针生成可调用对象:function<>、mem_fn()和bind()
我们知道,普通函数指针是一个可调用对象,但是成员函数指针不是可调用对象.因此,如果我们想在一个保存string的vector中找到第一个空string,不能这样写: vector<string& ...
- oracle to mogdb 迁移---mtk工具
## 一.MTK工具介绍--------- MTK–异构数据迁移工具 MTK全称为 Database Migration Toolkit,是一个可以将Oracle/DB2/MySQL/openGaus ...
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- JavaScript语言精粹--Function,类,this,对象
1.类与对象 在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的. JS对象是一种复合类型,它 ...
随机推荐
- nodejs内存泄漏概要分析
const heapdump = require('heapdump'); setTimeout( ()=>{ heapdump.writeSnapshot(`${process.cwd()}/ ...
- RocketMQ(3) 根据消息key查询功能的实现: indexFile
三: indexFile 除了通过通常的指定Topic进行消息消费外,RocketMQ还提供了根据key进行消息查询的功能. 该查询是通过store目录中的index子目录中的indexFile进行索 ...
- JavaScript获取href的值
1.当href的值为正常网址时: <!DOCTYPE html> <html> <head> <title></title> <met ...
- 基于python的PC电脑报警系统
一 基本概念 1.这里实现了电脑的安全报警系统,假如有人不小心动了你的电脑,立即触发报警系统.报警是通过pc机的声卡播放报警信号. 2.该的基础是对python的pyxhook和wave库的合理应用. ...
- DRC音频处理算法原理解析及仿真结果
一 概念: 在声学领域中,DRC(Dynamic range compression) 一般用来动态调整音频输出幅值,在音量大时压制音量在某一范围内,在音量小时适当提升音量.通常用于控制音频输出功率, ...
- 从零开始写 Docker(六)---实现 mydocker run -v 支持数据卷挂载
本文为从零开始写 Docker 系列第六篇,实现类似 docker -v 的功能,通过挂载数据卷将容器中部分数据持久化到宿主机. 完整代码见:https://github.com/lixd/mydoc ...
- stream使用汇总
整理了下java使用stream处理list的几个便捷的方法 准备数据 List<KnowledgeInfoTable> knowledgeInfoTables = knowledgeIn ...
- windows通过cmd重启网卡
ipconfig/release ipconfig/renew
- JSF之Action 与ActionListener的区别
事件 检验 参数 事件产生 页面跳转 Action 有 无参数,不传入当前控件,有返回值 当铵钮被单击时产生事件.提交表单 返回页面---根据配置文件跳转 ActionLis ...
- C++ 赋值操作和assign()的区别(转自stack overflow)
https://stackoverflow.com/questions/19735395/stl-assignment-operator-vs-assign-member-function assig ...