我正在尝试在我的所有源文件和postgres db之间创建一个连接,这就是我试图分享conn的方式,我是这个postgres api的新手,所以还在学习。
主C程序:
tp_main.c:
// system header
#include <tcl.h>
#include <tk.h>
#include <blt.h>
#include </usr/include/postgresql/libpq-fe.h>
#include "dbConn.h"
PGconn *conn;
int Tcl_AppInit(Tcl_Interp *interp) {
char sTclFile[] = "./maingui.tcl";
if (Tcl_Init(interp) == TCL_ERROR) return TCL_ERROR;
if (Tk_Init(interp) == TCL_ERROR) return TCL_ERROR;
if (Blt_Init(interp) == TCL_ERROR) return TCL_ERROR;
if (Tcl_EvalFile(interp, sTclFile) == TCL_ERROR) return TCL_ERROR;
Tk_MainLoop();
Tcl_DeleteInterp(interp);
Tcl_Exit(0);
return TCL_OK;
}
int main(int argc, char *argv[] ) {
//Initiate database connection
conn = PQconnectdb("dbname=jw1_v2 host=localhost user=imdw password=1234");
if (PQstatus(conn) == CONNECTION_BAD) {
printf("Connection_Error\n");
}else{
printf("Connection_Ok\n");
}
Tk_Main(argc, argv, Tcl_AppInit);
return 0;
}
我正在使用头文件尝试将'conn'变量设为全局变量,这是头文件:
#include </usr/include/postgresql/libpq-fe.h>
#ifndef DBCONN_H
#define DBCONN_H
extern PGconn *conn;
#endif
这是尝试使用连接的源文件之一,但是我得到了未定义的符号conn:
Samples.C:
#include <tcl.h>
#include <tk.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include </usr/include/postgresql/libpq-fe.h>
#include <time.h>
#include <blt.h>
#include "dbConn.h"
extern PGconn *conn;
PGresult *res;
static int sampleList(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]){
Tcl_Obj *result;
if (objc != 1) {
Tcl_WrongNumArgs(interp, 1, objv, "number of argument error");
return TCL_ERROR;
}
char command[256];
PQclear(res);
strcpy(command, "SELECT \"allSamplesDates\"()");
res = PQexec(conn,command);
result = Tcl_GetObjResult(interp);
Tcl_SetStringObj(result, PQgetvalue(res,0,0), strlen(PQgetvalue(res,0,0)));
return TCL_OK;
}
所以也许我正在声明变量是错误的,我不知道,但是我发现在你为每个源文件创建一个新连接之前,你在共享一个变量的方式可能与连接有所不同。从TCL调用该函数如下:
PGconn *conn;
PGresult *res;
static int connectDB2(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) {
// check number of arguments
if (objc != 1) {
Tcl_WrongNumArgs(interp, 2, objv, "number of argument error");
return TCL_ERROR;
}
conn = PQconnectdb("dbname=jw1_v2 host=localhost user=imdw password=1234");
if (PQstatus(conn) == CONNECTION_BAD) {
printf("Connection_Error\n");
}else{
//printf("Connection_Ok\n");
}
return TCL_OK;
}
这是我编译两个C文件的方式: samples.c
gcc -shared -o samples.so -DUSE_TCL_STUBS -I/usr/include/tcl samples.c -L/usr/lib -ltcl8.5 -lpq
tp_main
gcc -o tp_main -I/usr/include/tcl tp_main.c -L/usr/lib -ltcl8.5 -ltk8.5 -lBLT25 -lpq
TCL代码将调用该函数'connectDB2'并且将为每个源文件执行,但我不喜欢这样,所以我正在尝试改进它