在C中使用相同的连接postgresql跨多个源文件

时间:2014-06-23 19:56:17

标签: c postgresql tcl

我正在尝试在我的所有源文件和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'并且将为每个源文件执行,但我不喜欢这样,所以我正在尝试改进它

0 个答案:

没有答案