PostgreSQL-8.4.15 に 3 つの user_defined 関数を追加しようとしています。ここに3つの機能があります:
(1)start_create_profile();
(2)make_profile();
(3)check_anomaly();
それらはすべて、src/backend/tcop にあるファイル「test.c」に書き込まれます。の途中から(1)と(3)を呼びたいexec_simple_query()
。exec_simple_query()
src/backend/tcop にある「postgres.c」に記述されている PostgreSQL の関数です。(2) を GUI から直接呼び出したい。
「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){
}
これで、3 つのボタンを含む非常に単純な GUI を作成しました (Java の netbeans による)。、make_profile、、の順に対応するボタン1、ボタン2、start_create_profile()
ボタン3 check_anomaly()
。
グローバル変数を使用したい (0、1、2 のような 3 つの異なる値に設定できる「ボタン」を考えてみましょう。button1 または button3 を押すたびにグローバル変数が 1 または 2 に設定されるようにしたい私が書いた「if」を使ってexec_simple_query()
ください。
//initially button=0;
//inside exec_simple_query
if(button==1) start_create_profile();
if(button==2) check_anomaly;
そして、button2 を押すたびに、function(2) を直接呼び出す必要があります。GUI を使用してこれらの 3 つの関数のいずれかを選択できるようにするには、その変数をどのように設定する必要がありますか?? GUI から関数 (2) を直接呼び出すにはどうすればよいですか??