首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用netbeans定义的图形用户界面调用位于postgreSQL中"postgres.c“中的用户定义函数

使用netbeans定义的图形用户界面调用位于postgreSQL中"postgres.c“中的用户定义函数
EN

Stack Overflow用户
提问于 2013-02-22 15:47:16
回答 1查看 1.2K关注 0票数 1

我正在尝试向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“写的代码:

代码语言:javascript
复制
#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“

代码语言:javascript
复制
//initially button=0;
//inside exec_simple_query

if(button==1) start_create_profile();
if(button==2) check_anomaly;

每当我推入button2时,就必须直接调用函数(2)。你知道如何设置这个变量才能使用GUI选择这3个函数中的一个吗?如何通过GUI直接调用函数(2)??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-22 16:18:13

这里有几个问题。

您不能从SQL中调用任何C函数

首先,您不能只从SQL调用任意函数,必须使用PostgreSQL的C扩展API和宏;查看源代码中现有的SQL可调用函数的实现,以获得示例。

您通常不必修改核心代码,扩展通常就足够了

其次,如果想要向核心PostgreSQL添加函数,则必须将它们添加到src/include/catalog/pg_proc.h中,以便在initdb期间定义它们。

然而,使用适当的扩展加载工具要好得多:

  • http://www.postgresql.org/docs/current/static/xfunc-c.html
  • http://www.postgresql.org/docs/current/static/extend-pgxs.html

这样,您就可以LOAD一个扩展模块,根据文档CREATE FUNCTION C函数,并从SQL中调用它们。

在您的特定情况下,看起来您确实需要修改核心代码库,但这是相当不寻常的,所以我将此建议保留给其他人。

不能从图形用户界面“直接”调用PostgreSQL后端中的C函数

您有一个Java Swing GUI,并且您设想以某种方式在不同的进程中调用C函数,甚至可能在不同的主机上调用它。

这不会起作用的原因有很多,包括:

JNI或JNA.

  • It不能直接调用不同进程中的C函数;您必须使用进程间通信(共享内存、管道、套接字、共享文件等)来交换information

  • While。您可以在Pg后端嵌入解释器,并通过
  • 类直接调用C函数,您真的不想尝试直接从Pg后端显示Swing JNI

你需要的是一个多阶段的过程:

  • 收集您希望在PostgreSQL后端捕获的数据。如果您打算从创建它的同一连接访问它,则可以使用普通的palloc'd缓冲区。否则,您将需要从共享内存中分配一个缓冲区,或者使用文件system.
  • Access交换数据。
  • 使用PostgreSQL连接将数据从您的SQL可调用接口函数传输到您的Java应用程序。在您的应用程序中对其进行解码并根据需要进行显示。

或者:

  • 要求您的Java程序或其代理运行在与PostgreSQL服务器相同的系统上,并使代理将文件写入Pg可写且您的程序可读的位置。
  • 使用您的程序或其代理读取文件,并为display

处理这些文件

您甚至可以让Pg写入您的程序正在侦听的套接字,但我不建议这样做,因为程序中的停顿会导致PostgreSQL中的性能问题。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15019257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档