/*********************************************************************************
 * Package   : c-sqld-psql.c
 * Author    : Hans Oesterholt-Dijkema.
 * Copyright : HOD 2004/2005.
 * License   : The Elemental Programming Artistic License.
 * CVS       : $Id: c-sqld-psql.c,v 1.1 2007/07/05 20:12:43 hoesterholt Exp $
 *********************************************************************************/

/*#include <libpq-fe.h>
#include <pg_config.h>*/

#include <string.h>
#ifdef Darwin
#include <stdlib.h>
#else
#include <malloc.h>
#endif

#ifdef _WIN32
#define EXPORT  __declspec(dllexport)
#else
#define EXPORT  extern
#endif

#include "c-threads.c"

typedef void PGresult;
typedef void PGconn;

typedef int (*block_f)(void *,void *,void *,float);
static block_f block=NULL;

typedef PGresult * (*pqexec_f)(void *,void *);
static pqexec_f pqexec=NULL;

typedef struct {
  PGconn   *conn;
  char     *query;
  PGresult *result;
  int       ready;
} t_exec_query;

static 
int execute_query_ready(void *data)
{
  t_exec_query *Q=(t_exec_query *) data;
  return Q->ready;
}

static 
int execute_query(void *data)
{
  t_exec_query *Q=(t_exec_query *) data;

  Q->result=pqexec(Q->conn,Q->query);
  Q->ready=1;
  return 0;  
}

EXPORT void c_psql_set_block(void *g)
{
	block=(block_f) g;
}

EXPORT void c_psql_set_pqexec(void * g)
{
	pqexec=(pqexec_f) g;
}


EXPORT PGresult *c_psql_query(PGconn *conn,const char *query)
{
  PGresult *res;

  {
    t_exec_query  *Q  = (t_exec_query *) malloc(sizeof(t_exec_query));
    t_c_thread_id id;

    Q->conn=conn;
    Q->query=(char *) query;
    Q->result=NULL;
    Q->ready=0;

    id = c_thread_create(execute_query,(void *) Q);
    block(execute_query_ready,NULL,Q,-1);
    c_thread_join(id);

    res=Q->result;

    free(Q);
  }
  
  return res;
}

void *scheme_reload(void *env)
{
}

void *scheme_initialize(void *env)
{
}

void *scheme_module_name(void)
{
}

