我正在尝试向PostgreSQL-8.4.15添加3个user_defined函数。下面是3个函数:
(1) start_create_profile();
(2) make_profile();
(3) check_anomaly();
它们都写在src/backend/tcop中的test.c文件中。我想从exec_simple_query()中间调用(1)和(3)。exec_simple_query()是在src/ PostgreSQL /tcop目录下的postgres.c中编写的后端函数。我想通过我的GUI直接调用(2)。
下面是我用"test.c“写的代码:
#include "postgres.h"
#ifndef PROGPROFILE_H_
#define PROGPROFILE_H_
/* interfaces */
extern void start_create_profile(List *querytree_list);
extern void create_profile();
extern void check_anomaly(List *querytree_list);
#endif /* Test ProgProf */
void start_create_profile(List *querytree_list){
ListCell *l;
ListCell *tl;
FILE *f;
//if the file exist just open and write
//else create and write
f = fopen ("QueryParsed.txt", "a+");
Query *query_idr = (Query *)linitial(querytree_list);
// CMD_SELECT=0 CMD_INSERT=1 CMD_UPDATE=2
switch (query_idr->commandType)
{
case CMD_SELECT:
fputs("CMD_SELECT, ", f);
break;
case CMD_INSERT:
fputs("CMD_INSERT, ", f);
break;
case CMD_UPDATE:
fputs("CMD_UPDATE, ", f);
break;
default:
break;
}
//to have the ID of the table
foreach(l, query_idr->rtable){
Oid tab_idT = ((RangeTblEntry *) lfirst(l)) ->relid;
//char temp1[10];
char *tab_idTConverted = itoa(tab_idT);
/* This is not a table */
if (tab_idT == 0)
continue;
fputs(" tab_id: , ", f);
fputs(tab_idTConverted, f);
}
//to have the name of the targer list
foreach(tl, query_idr->targetList){
TargetEntry *tle = (TargetEntry *) lfirst(tl);
Oid tab_id = tle->resorigtbl;
int tab_idCast=(int)tab_id;
//char temp[10];
char *tab_idConverted = itoa(tab_idCast);
char *resname=tle->resname;
fputs("Name of column: ", f);
fputs(resname, f);
fputs(" ID: ", f);
fputs(tab_idConverted, f);
fputs("\n", f);
}
//close the file that we write
fputs("$", f);
fclose (f);
}
void create_profile(){
}
void check_anomaly(List *querytree_list){
}现在,我已经创建了一个非常简单的GUI,其中包含3个按钮(由netbeans用java编写)。Button1、button2、button3依次对应于start_create_profile()、make_profile、check_anomaly()。
我想要使用一个全局变量(让我们考虑一下“按钮”,它可以设置为3个不同的值,比如0,1,2。我希望每当我按下button1或button3时,全局变量都会被设置为1或2,以便使用我用exec_simple_query()编写的"if“。这里是"if“
//initially button=0;
//inside exec_simple_query
if(button==1) start_create_profile();
if(button==2) check_anomaly;每当我推入button2时,就必须直接调用函数(2)。你知道如何设置这个变量才能使用GUI选择这3个函数中的一个吗?如何通过GUI直接调用函数(2)??
发布于 2013-02-22 16:18:13
这里有几个问题。
您不能从SQL中调用任何C函数
首先,您不能只从SQL调用任意函数,必须使用PostgreSQL的C扩展API和宏;查看源代码中现有的SQL可调用函数的实现,以获得示例。
您通常不必修改核心代码,扩展通常就足够了
其次,如果想要向核心PostgreSQL添加函数,则必须将它们添加到src/include/catalog/pg_proc.h中,以便在initdb期间定义它们。
然而,使用适当的扩展加载工具要好得多:
这样,您就可以LOAD一个扩展模块,根据文档CREATE FUNCTION C函数,并从SQL中调用它们。
在您的特定情况下,看起来您确实需要修改核心代码库,但这是相当不寻常的,所以我将此建议保留给其他人。
不能从图形用户界面“直接”调用PostgreSQL后端中的C函数
您有一个Java Swing GUI,并且您设想以某种方式在不同的进程中调用C函数,甚至可能在不同的主机上调用它。
这不会起作用的原因有很多,包括:
JNI或JNA.
JNI。你需要的是一个多阶段的过程:
palloc'd缓冲区。否则,您将需要从共享内存中分配一个缓冲区,或者使用文件system.或者:
处理这些文件
您甚至可以让Pg写入您的程序正在侦听的套接字,但我不建议这样做,因为程序中的停顿会导致PostgreSQL中的性能问题。
https://stackoverflow.com/questions/15019257
复制相似问题