return to first page linux journal archive
keywordscontents
#include "PGConnection.h"
#include "libpq-fe.h"
#include "stdio.h"

#define thisPGconn ((PGconn *) \
    ((unhand(this))->PGconnRep))
#define COPYBUFLEN 1024

void PGConnection_finish(struct \
     HPGConnection *this)
{
  PQfinish(thisPGconn);
}


void PGConnection_connectDB \
           (struct HPGConnection *this,
	    struct Hjava_lang_String *host,
	    struct Hjava_lang_String *port,
	    struct Hjava_lang_String *options,
	    struct Hjava_lang_String *tty,
	    struct Hjava_lang_String *dbName)
{
		/* First, we get C versions of the */
		/* strings passed into the */
		/* constructor.  Java will free these */
		/* when they have no pointers */
		/* left. (at the end of this function)*/
  char *PGhost = makeCString(host);
  char *PGtty  = makeCString(tty);
  char *PGport = makeCString(port);
  char *PGoptions = makeCString(options);
  char *PGdbName = makeCString(dbName);

 
		/* Make the PQ call to create the */
		/* connection.  This will allocate a */
		/* new PGconn. */
  PGconn *tmpConn = PQsetdb(PGhost, PGport, \
       PGoptions, PGtty, PGdbName);
		/* Store this as a long in Java */
  unhand(this)->PGconnRep = (long)tmpConn;
  return;
}

struct Hjava_lang_String *PGConnection_db(struct\
      HPGConnection *this)
{
  /* We could use the macro thisPGconn 
  /* (defined above) here like so:*/
  /* char *tmp = PQdb(thisPGconn); */
  char *tmp = PQdb(((PGconn *)((unhand(this))->PGconnRep)));
  return makeJavaString(tmp, strlen(tmp));
}
struct Hjava_lang_String *PGConnection_host(struct\
      HPGConnection *this)
{
  char *tmp = PQhost(thisPGconn);
  return makeJavaString(tmp, strlen(tmp));
}
struct Hjava_lang_String *PGConnection_options(struct\
      HPGConnection *this)
{
  char *tmp = PQoptions(thisPGconn);
  return makeJavaString(tmp, strlen(tmp));
}
struct Hjava_lang_String *PGConnection_port(struct \
      HPGConnection *this)
{
  char *tmp = PQport(thisPGconn);
  return makeJavaString(tmp, strlen(tmp));
}
struct Hjava_lang_String *PGConnection_tty(struct\
      HPGConnection *this)
{
  char *tmp = PQtty(thisPGconn);
  return makeJavaString(tmp, strlen(tmp));
}
struct Hjava_lang_String *
PGConnection_errorMessage(struct HPGConnection *this)
{
  char *tmp = PQerrorMessage(thisPGconn);
  return makeJavaString(tmp, strlen(tmp));
}

void PGConnection_reset(struct HPGConnection *this)
{
		/* Simply call the PQ lib function */
  PQreset(thisPGconn);
  unhand(this)->copyDone = 0;\
  		/* false on reset */
  unhand(this)->getlineResult = 0; \
		/* also reset here */
  return;
}

long PGConnection_status(struct \
     HPGConnection *this)
{
		/* Simply call the PQ lib */ 
		/* function--in this case,*/
		/* cast the enum to a */
		/* long*/
  return (long)PQstatus(thisPGconn);
}

		/* Unfortunately, we can't */ 
		/* pass a File into native */
		/* code, so we use a filename */
		/* instead*/
void PGConnection_trace(struct HPGConnection *this,
			struct Hjava_lang_String *filename)
{
  char *tmpFilename = makeCString(filename);
  FILE *tmpFile;
  if (strcmp(tmpFilename, "stdout") == 0) \
		/* Check for stdout */
    tmpFile = stdout;
  else if (strcmp(tmpFilename, "stderr") == 0) \
		/* and stderr */
    tmpFile = stderr;
  else
    tmpFile = fopen(tmpFilename, "a");
  PQtrace(thisPGconn, tmpFile);
  return;
}

void PGConnection_untrace(struct \ 
     HPGConnection *this)
{
  PQuntrace(thisPGconn);
  return;
}

long PGConnection_nativeExec\
     (struct HPGConnection *this,
      struct Hjava_lang_String *query)
{
  char *tmpQuery = makeCString(query);

  PGresult *tmpResult = PQexec(thisPGconn, \
     tmpQuery);

  return (long)tmpResult;
}
extern struct Hjava_lang_String *
PGConnection_nativeGetline(struct \
      HPGConnection *this)
{
  char buffer[COPYBUFLEN];

  int res = PQgetline(thisPGconn, buffer, 1024);
  unhand(this)->getlineResult = res;
  return makeJavaString(buffer, strlen(buffer));
}

long PGConnection_endcopy(struct \
     HPGConnection *this)
{
  unhand(this)->copyDone = 0;
  return (long)PQendcopy(thisPGconn);
}


void PGConnection_putline \
           (struct HPGConnection *this,
            struct Hjava_lang_String *data)
{
  char *tmp = makeCString(data);
  PQputline(thisPGconn, tmp);
  return;
}


Back to article