openGauss

开源数据库

openGauss社区官网

开源社区

openGauss/MogDB调用C FUNCTION

夏克2022-04-08openGauss/MogDB调用C FUNCTION

openGauss/MogDB 调用 C FUNCTION

环境准备

  • 安装 openGauss/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: 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>