/*******************************************************************************
**
** Source File Name = client.c  1.2
**
** Licensed Materials - Property of IBM
**
** (C) COPYRIGHT International Business Machines Corp. 1995, 1999 
** All Rights Reserved.
**
** US Government Users Restricted Rights - Use, duplication or
** disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
**
**
**    PURPOSE :
**       an example showing how to use CLIENT APIs in order to:
**          - set a client
**          - and query a client
**
**    APIs USED :
**       SET CLIENT                     sqlesetc
**       QUERY CLIENT                   sqleqryc
**
**    STRUCTURES USED :
**       sqle_conn_setting
**       sqlca
**
**    OTHER FUNCTIONS DECLARED :
**       'C' COMPILER LIBRARY :
**          stdio.h  -  printf
**
**    EXTERNAL DEPENDENCIES :
**       - Ensure existence of database for precompile purposes.
**       - Compile and link with the compiler supported on your platform.
**
** For more information about these samples see the README file.
**
** For more information on programming in C, see the:
**   -  "Programming in C and C++" section of the Application Development Guide
** For more information on Building C Applications, see the:
**   -  "Building C Applications" section of the Application Building Guide.
**
** For more information on the SQL language see the SQL Reference.
**
*******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlenv.h>
#include "utilapi.h"

#define NUMSETTINGS 5

int printQuery (struct sqle_conn_setting *);

int main (void) 
{   int rc;
    struct sqlca sqlca;
    struct sqle_conn_setting connSetting[NUMSETTINGS];
    short temp_val1, temp_val2, temp_val3, temp_val4, temp_val5;
    connSetting[0].type = SQL_CONNECT_TYPE;
    connSetting[1].type = SQL_RULES;
    connSetting[2].type = SQL_DISCONNECT;
    connSetting[3].type = SQL_SYNCPOINT;
    connSetting[4].type = SQL_MAX_NETBIOS_CONNECTIONS;
    printf ("QUERY CLIENT**************************************************\n");
   
    /*************************\
    * QUERY CLIENT API called *
    \*************************/
    sqleqryc (&connSetting[0], NUMSETTINGS, &sqlca);
    API_SQL_CHECK( "QUERY CLIENT");

    rc = printQuery(&connSetting[0]);

    temp_val1 = connSetting[0].value;
    temp_val2 = connSetting[1].value;
    temp_val3 = connSetting[2].value;
    temp_val4 = connSetting[3].value;
    temp_val5 = connSetting[4].value;

    connSetting[0].value = SQL_CONNECT_2;
    connSetting[1].value = SQL_RULES_STD;
    connSetting[2].value = SQL_DISCONNECT_COND;
    connSetting[3].value = SQL_SYNC_TWOPHASE;
    connSetting[4].value = 254;

    printf ("SET CLIENT****************************************************\n");
    printf ("connect type        = SQL_CONNECT_2\n");
    printf ("rules               = SQL_RULES_STD\n");
    printf ("disconnect          = SQL_DISCONNECT_COND\n");
    printf ("syncpoint           = SQL_SYNC_TWOPHASE\n");
    printf ("max netbios conn.   = 254\n");
    /***********************\
    * SET CLIENT API called *
    \***********************/
    sqlesetc (&connSetting[0], NUMSETTINGS, &sqlca);
    API_SQL_CHECK( "SET CLIENT");      

    printf ("QUERY CLIENT**************************************************\n");
    /*************************\
    * QUERY CLIENT API called *
    \*************************/
    sqleqryc (&connSetting[0], NUMSETTINGS, &sqlca);
    API_SQL_CHECK( "QUERY CLIENT");    

    rc = printQuery(&connSetting[0]);

    connSetting[0].value = temp_val1;
    connSetting[1].value = temp_val2;
    connSetting[2].value = temp_val3;
    connSetting[3].value = temp_val4;
    connSetting[4].value = temp_val5;

    printf ("SET CLIENT back to original settings *************************\n");
    /***********************\
    * SET CLIENT API called *
    \***********************/
    sqlesetc (&connSetting[0], NUMSETTINGS, &sqlca); 
    API_SQL_CHECK( "SET CLIENT");    

    return 0;
}

int printQuery (struct sqle_conn_setting *connP) {
   printf ("\n\n\n");
   printf ("SQL CONNECTION TYPE\n");
   printf ("===================\n");
   switch (connP->value){
      case SQL_CONNECT_1:
         printf ("Enforces the rules for Remote Unit of Work (RUOW) from "
            "previous releases\n  TYPE = SQL_1\n\n");
         break;
      case SQL_CONNECT_2:
         printf ("Supports the multiple databases per unit of work semantics "
            "DUOW\n  TYPE = SQL_2\n\n");
         break;
      default:
         printf ("undefined value = %d\n\n", connP->value);
   } /* endswitch */

   connP++;
   printf ("SQL RULES\n");
   printf ("=========\n");
   switch (connP->value) {
      case SQL_RULES_DB2:
         printf ("Enables the SQL CONNECT statement to switch the current "
            "connection to an\nestablished (dormant) connection\n"
            "  TYPE = SQL_DB2\n\n");
         break;
      case SQL_RULES_STD:
         printf ("Permits the establishment of a new connection only through "
            "SQL CONNECT\nstatement.  Under SQL_STD, the SQL SET "
            "CONNECTION statement is used to switch\nthe current connection "
            "to a dormant connection.\n  TYPE = SQL_STD\n\n");
         break;
      default:
         printf ("undefined value = %d\n\n", connP->value);
   } /* endswitch */

   connP++;
   printf ("SQL DISCONNECT\n");
   printf ("==============\n");
   switch (connP->value) {
      case SQL_DISCONNECT_EXPL:
         printf ("Breaks those connections that have been explicitly marked "
            "for release at commit\nby the SQL RELEASE statement\n"
            "  TYPE = SQL_EXPLICIT\n\n");
         break;
      case SQL_DISCONNECT_COND:
         printf("Breaks those connections that have no open WITH HOLD "
            "cursors at commit,\nand those that have been marked for release "
            "by the SQL RELEASE statement\n  TYPE = SQL_CONDITIONAL\n\n");
         break;
      case SQL_DISCONNECT_AUTO:
         printf("Breaks all connections at commit\n  TYPE = SQL_AUTOMATIC\n\n");
         break;
      default:
         printf ("undefined value = %d\n\n", connP->value);
   } /* endswitch */

   connP++;
   printf ("SQL SYNCPOINT\n");
   printf ("=============\n");
   switch (connP->value) {
      case SQL_SYNC_TWOPHASE:
         printf ("Requires a Transaction Manager (TM) to coordinate two-"
            "phase commits among\ndatabases that support this protocol\n"
            "  TYPE = SQL_TWOPHASE\n\n");
         break;
      case SQL_SYNC_ONEPHASE:
         printf ("Uses one-phase commits to commit the work done by each"
            "database in multiple\ndatabase transactions.  Enforces single"
            "updater, multiple read behaviour\n  TYPE = SQL_ONEPHASE\n\n");
         break;
      case SQL_SYNC_NONE:
         printf ("Does not enforce two-phase commits, or singer updater, "
            "multiple\nread behaviour.\n  TYPE = SQL_NONE\n\n");
         break;
      default:
         printf ("undefined value = %d\n\n", connP->value);
   } /* endswitch */

   connP++;
   printf ("SQL MAX NETBIOS CONNECTIONS\n");
   printf ("===========================\n");
   printf ("This specifies the maximum number of concurrent connections that "
      "can be\nmade using the NETBIOS adapter in an application\n");
   printf ("  CONNECTIONS = %d\n", connP->value);

   printf ("\n\n\n");

   return 0;
}