/*
 * NAME
 *      tst_conn_twice
 *
 * USAGE
 *      tst_conn_twice [-g 0|1|2] [-t] 
 *
 * ARGUMENTS
 *     -g   gdi degub level: 0 (off) by default
 *          1 = GDI_DEBUG_ON
 *          2 = GDI_DEBUG_VERBOSE
 *
 *     -t   turns PQtrace on
 *
 * DESCRIPTION
 *      Tests switching between postgres servers.
 *
 * AUTHOR
 *     Jean T. Anderson
 */
#ifndef lint
static char     SccsId[] = "%W% %G%";
#endif

#include <stdio.h>
#include <stddef.h>
#include "libgendb.h"
#include "gdi_turbo.h"
#include "errno.h"
#include "proto.h"

extern    int getopt();

Proto     (static dbStatus, pg_databases,  (dbconn *dbconn));

#define USAGE\
"Usage:\ttst_conn_twice\t [-g 0|1|2] [-t]"

extern char     *optarg;

/****************************************************************************/
/*  main                                                                    */
/****************************************************************************/
void
main(argc, argv)
int        argc;
char      **argv;
{
     char    *vendor="postgres";
     char    database[GDI_DBNAME_SIZE +1];
     char    server[GDI_DBNAME_SIZE +1];

     int     c, i;

     dbConn  *dbconn = NULL;      /* GDI database connector */
     int     debug=0, trace=0;    /* GDI debug and trace */

     /*=====================================================*
      *========= Get command line arguments ================*
      *=====================================================*/

     while ((c = getopt(argc, argv, "g:ht")) != EOF)
     {
          switch(c)
          {
          case 'g':
               debug = atoi (optarg);
               break;
          case 'h':
               printf("%s\n", USAGE);
               exit(0);
          case 't':
               trace++;
               break;
          default:
               printf("%s\n", USAGE);
               exit(1);
          }
     }

     /* ==============
      * Initialize GDI
      * ==============
      */

     gdi_init(argv[0]);

     /* ==========================
      * Query a couple databases
      * ==========================
      */

     bzero(database, sizeof(database));
     bzero(server, sizeof(server));

     for(i=0; i < 2; i++)
     {
         if(i == 0)
         {
              strncpy(database, "jta", sizeof(database) - 1);
              database[sizeof(database) -1 ] = '\0';

              strncpy(server, "heel.s2k.berkeley.edu", sizeof(server) - 1);
              database[sizeof(server) -1 ] = '\0';
         }
         else if(i == 1)
         {
              strncpy(database, "jta2", sizeof(database) - 1);
              database[sizeof(database) -1 ] = '\0';

              strncpy(server, "arcadia.CS.Berkeley.EDU", sizeof(server) - 1);
              database[sizeof(server) -1 ] = '\0';
         }
          /* ====================
           * Connect to Database
           * ====================
           */
          printf("Connecting to database %s on host %s.\n", database, server);
          if ((dbconn = gdi_open(vendor, NULL, NULL, database, server, NULL))
               == (dbConn *)NULL )
          {
               printf ("Connect failed: %s\n", GDI_ERROR_MSG( (dbConn *)NULL) );
               exit (GDI_FAILURE);
          }
          else 
               printf("Successfully connected to database %s on host %s.\n\n", 
                    GDI_DATABASE(dbconn), GDI_NODE(dbconn));

          /* ====================
           * Set Debug & Trace
           * ====================
           */
          (void) gdi_error_init(dbconn, (dbDebug) debug, GDI_WARNING, 
               GDI_NOT_USED, GDI_NOT_USED);

          if(trace)
               gdi_trace(dbconn, TRUE, "");

          printf("The databases on this host are:\n");
          if( (pg_databases(dbconn)) != GDI_SUCCESS)
          {
               printf ("pg_databases failed: %s\n", GDI_ERROR_MSG(dbconn));
               exit(GDI_FAILURE);
          }

	if(gdi_close(dbconn) != GDI_SUCCESS)
        {
             printf("Failed to close connection: %s\n", GDI_ERROR_MSG(dbconn));
             exit(GDI_FAILURE);
        }
        else
             printf("\nClosed connection %d.\n\n", i+1);
     }
     exit(GDI_SUCCESS);
}

static
dbStatus
pg_databases(dbconn)
dbConn  *dbconn;
{
     char     *query = "retrieve (pg_database.datname)";
     dbObj    *result_obj;

     if ( gdi_submit(dbconn, query, -1, &GDI_TURBO, &result_obj))
     {    result_obj = gdi_obj_destroy(result_obj);
          return(GDI_FAILURE);
     }
     else
         if(GDI_OBJ_NUM_TUPLES(result_obj) > 0 )
             gdi_print_tuples( result_obj, GDI_FIXED_SPACE, TRUE);

     result_obj = gdi_obj_destroy(result_obj);
     return(GDI_SUCCESS);
}
