PostgreSQL插件间如何传递数据

原创
2020/08/26 07:59
阅读数 132

本篇讲解如何在PostgreSQL的两个插件之间传递数据。

 

1、插件的插件

PL/pgSQL中:

PLpgSQL_plugin **plpgsql_plugin_ptr = NULL;
...// 中略
plpgsql_plugin_ptr = (PLpgSQL_plugin **) find_rendezvous_variable("PLpgSQL_plugin");

这里定义的是函数指针结构体的指针,完全也可以定义成其它类型指针。(到这里,熟悉的人已经知道怎样使用)。

 

2、哈希表rendezvousHash

查看函数find_rendezvous_variable,可以看到插件变量创建在TopMemoryContext中,不需要担心生命周期的问题。

并且在创建哈希entry之后:

if (!found)
  hentry->varValue = NULL;

那么可以用空和非空判断变量的存在。

(开始代码演示)

 

3、定义整数变量

还是在PL/pgSQL中

PLpgSQL_plugin **plpgsql_plugin_ptr = NULL;
int **plpgsql_int_ptr = NULL;
int plpgsql_int;

_PG_init中(应该也可以在其他位置,没有尝试):

plpgsql_plugin_ptr = (PLpgSQL_plugin **) find_rendezvous_variable("PLpgSQL_plugin");
plpgsql_int_ptr = (int **) find_rendezvous_variable("plpgsql_int");
*plpgsql_int_ptr = &plpgsql_int;
plpgsql_int = -12345;

 

4、使用变量

在其他插件中:

int **plpgsql_int_ptr = (int **) find_rendezvous_variable("plpgsql_int");
if (*plpgsql_int_ptr) // 其它插件已经启动并分配变量
{
  // 取值演示
  elog(WARNING, "plpgsql_int %d", **plpgsql_int_ptr);
  // 修改演示
  **plpgsql_int_ptr = 0;
}

5、测试效果

quanzl=# load 'plpgsql';
LOAD
quanzl=# load 'pg_prewarm';
WARNING:  plpgsql_int -12345
LOAD
quanzl=#

完毕,就是这么简单。

 

欢迎关注公众号

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部