/****************************************************************************
** (c) Copyright IBM Corp. 2007 All rights reserved.
** 
** The following sample of source code ("Sample") is owned by International 
** Business Machines Corporation or one of its subsidiaries ("IBM") and is 
** copyrighted and licensed, not sold. You may use, copy, modify, and 
** distribute the Sample in any form without payment to IBM, for the purpose of 
** assisting you in the development of your applications.
** 
** The Sample code is provided to you on an "AS IS" basis, without warranty of 
** any kind. IBM HEREBY EXPRESSLY DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR 
** IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Some jurisdictions do 
** not allow for the exclusion or limitation of implied warranties, so the above 
** limitations or exclusions may not apply to you. IBM shall not be liable for 
** any damages you suffer as a result of using, copying, modifying or 
** distributing the Sample, even if IBM has been advised of the possibility of 
** such damages.
*****************************************************************************
**
** SOURCE FILE NAME: dbcongui.c
**
** SAMPLE: How to connect to a database with a graphical user interface (GUI)
**   
**         Note: The GUI feature is only supported on the Windows NT platform.
**               o You can still connnect to the database without the GUI
**                 feature on non-NT Windows platforms by providing four
**                 arguments (see below).
**               o You can still connect to the database without the GUI
**                 feature on UNIX platforms by providing either two or four
**                 arguments (see below).
**
**         This program demonstrates how SQLDriverConnect() can be used to
**         prompt a user for connection information through a GUI.  The
**         application behaves differently depending on how many arguments
**         you supply when calling it from the command line:
**
**           o If one command line argument (program name) is supplied, the
**             user will be prompted for the database alias, user ID, and
**             password by a window that appears.
**
**           o If two arguments (program name, database alias) are supplied,
**             the user will be prompted for the user ID and password by
**             a window that appears.
**
**           o If three arguments (program name, database alias, user ID) are
**             supplied, a usage message is displayed indicating how the
**             program should be called:
**               USAGE: dbcongui [dbAlias [userid  passwd]]
**
**           o If four arguments (program name, database alias, user ID,
**             password) are supplied, the program will establish a connection
**             to the target database without prompting the user for any
**             further information.
**
**         This sample also allows you to change the password through a GUI.
**
** CLI FUNCTIONS USED:
**         SQLAllocHandle -- Allocate Handle
**         SQLDriverConnect -- Connect to a Data Source (Expanded)
**         SQLFreeHandle -- Free Handle Resources
*****************************************************************************
**
** For more information on the sample programs, see the README file.
**
** For information on developing CLI applications, see the CLI Guide
** and Reference.
**
** For information on using SQL statements, see the SQL Reference.
**
** For the latest information on programming, building, and running DB2 
** applications, visit the DB2 application development website: 
**     http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp
****************************************************************************/

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <sqlcli1.h>
#include "utilcli.h" /* header file for CLI sample code */

int main(int argc, char * argv[])
{
  SQLHWND sqlHWND; /* window handle */
  SQLCHAR inConnectionString[255]; /* connection string */
  SQLSMALLINT strLength1; /* length of inConnectionString */
  SQLCHAR outConnectionString[255];  
  SQLSMALLINT bufferLength;
  SQLSMALLINT strLength2[255];
  SQLUSMALLINT driveCompletion; /* indicate prompting information */
  short rc = 0; 
  SQLHANDLE henv; /* environment handle */
  SQLHANDLE hdbc; /* database connection handle */
  char dbAlias[SQL_MAX_DSN_LENGTH + 1] ;
  char user[MAX_UID_LENGTH + 1] ;
  char pswd[MAX_PWD_LENGTH + 1] ;
  
  printf("\nTHIS SAMPLE SHOWS ");
  printf("HOW TO CONNECT TO AND DISCONNECT FROM A DATABASE\n");
  printf("USING THE CLI FUNCTION SQLDRIVERCONNECT.\n");

  /* check the command line arguments */
  rc = CmdLineArgsCheck1( argc, argv, dbAlias, user, pswd );
  if ( rc != 0 )
  {    
    return( 1 ) ;     
  }
  else
  {  
    printf("\n----------------------------------------------------------");
    printf("\nUSE THE CLI FUNCTIONS\n");
    printf("  SQLAllocHandle\n");
    printf("  SQLDriverConnect\n");
    printf("  SQLFreeHandle\n");
    printf("TO CONNECT TO A DATABASE:\n\n");
    
    strcpy((char*)strLength2, "");
    sprintf((char*)outConnectionString, "%s","");
    bufferLength = SQL_MAX_OPTION_STRING_LENGTH;
    
    switch (argc)
    {    
      /* no arguments supplied to the program */
      case 1:
        sqlHWND =  0L;
        sprintf((char *)inConnectionString, "%s", "");
        strLength1 = 0;
        driveCompletion = SQL_DRIVER_PROMPT;
        printf("  You have entered the [program name].\n\n");
        printf("  On the Windows platform:\n");
        printf("  1) Choose the database alias you want to connect to\n");
        printf("     from the 'Database alias' pull-down menu.\n");
        printf("  2) [Optional] Enter your user ID and password ");
        printf("in the appropriate fields.\n");
        printf("  3) [Optional] If you want to change your password, ");
        printf("check the 'Change password'\n");
        printf("     checkbox and enter your new password.\n"); 
        printf("  4) [Optional] Select a connection mode.\n");
        printf("  5) Click on the 'OK' button to COMMIT or the ");   
        printf("'Cancel' button to cancel.\n\n");
        break;

      /* one argument (database alias) supplied to the program */
      case 2:
        sqlHWND =  0L;
        sprintf((char *)inConnectionString, "DSN=%s;UID=%s;PWD=%s",
                argv[1], "","");                             
        strLength1 = SQL_MAX_OPTION_STRING_LENGTH;             
        driveCompletion = SQL_DRIVER_COMPLETE;
        printf("  You have entered the [program name, database alias].\n ");
        printf("  On the Windows platform:\n");
        printf("  1) Enter your user ID and password ");
        printf("in the appropriate fields.\n");
        printf("  2) [Optional] If you want to change your password, ");
        printf("check the 'Change password'\n");
        printf("     checkbox and enter your new password.\n"); 
        printf("  3) [Optional] Select a connection mode.\n");
        printf("  4) Click on the 'OK' button to COMMIT or the ");   
        printf("'Cancel' button to cancel.\n\n");
        break;
  
      /* two arguments (database alias, user ID) supplied to the program */ 
      case 3:
        sqlHWND =  0L;         
        sprintf((char *)inConnectionString, "DSN=%s;UID=%s;PWD=%s",
                argv[1], argv[2], "");
        strLength1 = SQL_MAX_OPTION_STRING_LENGTH; 
        driveCompletion = SQL_DRIVER_COMPLETE_REQUIRED;
        break;
        
      /* three arguments (database alias, user ID, password)
         supplied to the program */
      case 4:
        sqlHWND =  0L;
        sprintf((char *)inConnectionString, "DSN=%s;UID=%s;PWD=%s", argv[1],
                argv[2], argv[3]);
        strLength1 = SQL_MAX_OPTION_STRING_LENGTH; 
        driveCompletion = SQL_DRIVER_NOPROMPT;                   
        printf("  You have entered the [program name, database alias, ");
        printf("userid, passwd].\n\n");
        printf("  All of the required information has been supplied, \n");
        printf("  so now connecting to the database without prompting.\n\n");
        break;
    } 
  }

        
  /* allocate an environment handle */
  rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
  ENV_HANDLE_CHECK(henv, rc);
  
  /* set attribute to enable application to run as ODBC 3.0 application */
  rc = SQLSetEnvAttr(henv,
                     SQL_ATTR_ODBC_VERSION,
                     (void *)SQL_OV_ODBC3,
                     0);
  ENV_HANDLE_CHECK(henv, rc);

  /* allocate a database connection handle */
  rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
  DBC_HANDLE_CHECK(hdbc, rc);
  
  /* connect to a database with SQLDriverConnect, which is an enhanced
     connection function that supports the ability to prompt the user for
     connection information */
  rc = SQLDriverConnect(hdbc,
                        (SQLHWND)sqlHWND,
                        inConnectionString,
                        strLength1,
                        outConnectionString,
                        bufferLength,
                        strLength2,
                        driveCompletion);

  if (rc != SQL_SUCCESS) /* connection failed */
  {
 
    printf("Connection failed!\n"); /* print out an error message */

    printf("\n--WARNING ---------------\n");
    printf("If you are running this program on a UNIX platform,\n");
    printf("you must provide as arguments to the program either:\n");
    printf("  o  the database alias\n");
    printf("  o  or the database alias and the userid and password\n");
    printf("The SQLDriverConnect() GUI options are not supported on UNIX plaforms.\n");
    printf("-------------------------\n");
    
    /* connection handle checking */
    DBC_HANDLE_CHECK(hdbc, rc);
  }
  else
  {       
    printf("Connected to the database...\n\n"); 
    rc = SQLDisconnect(hdbc); /* disconnect from the database */
    if (rc != SQL_SUCCESS) /* disconnect failed */
    {
      printf("Unable to disconnect.\n");
      DBC_HANDLE_CHECK(hdbc, rc);
    }
    else        
    {   
      printf("Disconnected from the database.\n");
     
      /* free the connection handle */
      rc = SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
      if (rc != SQL_SUCCESS)
      {
        /* connection handle checking */
        DBC_HANDLE_CHECK(hdbc, rc);
      }
      else
      {
        /* free the environment handle */
        rc = SQLFreeHandle(SQL_HANDLE_ENV, henv);
        if (rc != SQL_SUCCESS)
        {
          /* environment handle checking */ 
          ENV_HANDLE_CHECK(henv, rc);
        }
      }
    }
  }
  return (rc);
}