openGauss/MogDB调用C FUNCTION

openGauss/MogDB 调用 C FUNCTION

摘要

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

环境准备

  • 安装 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 <min> value or use a ...<max> 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: https://cloud.baidu.com/product/postgresql.html 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>
相关推荐
你不是我我2 小时前
【Java 开发日记】HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·开发语言·微服务
tjl521314_213 小时前
04C++ 名称空间(Namespace)
开发语言·c++
赏金术士3 小时前
Kotlin 数据流与单双向绑定
android·开发语言·kotlin
逻辑驱动的ken4 小时前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
杨云龙UP5 小时前
SQL Server2022部署:Windows Server 2016下安装、SSMS配置、备份还原与1433端口放通全流程_20260508
运维·服务器·数据库·sql·sqlserver·2022
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
wdfk_prog6 小时前
正常关闭虚拟机时,不要点“关机”,而要点“关闭客户机”
linux·c语言·网络·ide·vscode
墨染天姬6 小时前
【AI】cursor提示词小技巧
前端·数据库·人工智能
古月-一个C++方向的小白7 小时前
MySQL数据库——数据类型
android·数据库·mysql