<?PHP
/****************************************************************************
 * (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: UtilConnection_DB2.php
 *
 * Description:
 * This class extends IO_Helper.
 *
 * It is meant to perform the generic work of connecting and disconnecting from
 * a database as well as to commit and rollback transactions.
 *
 * $HTML_GENERAL_HELP and $CLI_GENERAL_HELP have been defined to include any
 * necessary information needed for the IBM_DB2 diver to function properly.
 *
 * Public Variables
 * $dbconn - This represents the last database connection that was requested to
 *            be formed
 * $schema - This represents the current schema that the sample is working in.
 *
 * Function List:
 *
 * __construct($initialize = true)
 *   The   Constructor
 *      Initialize IO_Helper and passes it the value of $initialize
 *
 * make_Connection($persistentConnection = false)
 *    Attempts to form a database connection the connection will be
 *      persistent if $persistentConnection is set to true. For the
 *      purposes that this class is going to be used if the
 *      connection  fails an error message is outputted and the program exits.
 *
 * rollback($dbconn = null)
 *    Performs a transaction rollback on the connection $dbconn. If $dbconn
 *      is  set to null the $this->dbconn is used.
 *
 * commit($dbconn = null)
 *    Performs a transaction commit on the connection $dbconn. If $dbconn is
 *      set  to null the $this->dbconn is used.
 *
 * close_Connection($dbconn = null)
 *    Tries to closes the connection dbconn. If $dbconn is set to null the
 *      $this- >dbconn is used.
 *
 *
 **************************************************************************/

class DB2_Connection extends IO_Helper
{
  public $dbconn = null;
  public $HTML_GENERAL_HELP =
'
    echo
\'<Table>
  <tr>
    <td>
      Connection String (Default \\\'Sample\\\'):
    </td>
    <td>
      <input type="text" name="ConnectionString" value="\';
echo $this->connectionString;
echo \'" /></td>
  </tr><tr>
    <td>
      User Name (Default blank):
    </td>
    <td>
      <input type="text" name="UserName" value="\';
echo $this->userName;
echo \'"  /></td>
  </tr><tr>
    <td>
      Password (Default blank):
    </td>
    <td>
      <input type="password" name="Password" value="\';
echo $this->userPassword;
echo \'" /></td>
  </tr>
  </tr><tr>
    <td>
    </td>
    <td>
    </td>
  </tr>
  </tr><tr>
    <td>
      Schema (Default logged in user):
    </td>
    <td>
      <input type="text" name="schema" value="\';
echo isset($this->passedArgs["schema"]) ? $this->passedArgs["schema"] : "";
echo \'" /></td>
  </tr>
</Table>\';
';
  public $CLI_GENERAL_HELP =
'
echo \'
    Connection Options:
      -db -- If present specifies the connection
                string to use default -db="sample"

      -u  -- If present specifies the user name

      -p  -- If present specifies the user password

      -schema
          -- If present will specify what schema the
              sample database is located under.
\';
';
  function __construct($initialize = true)
  {
    parent::__construct($initialize);
  }

  public function make_Connection($persistentConnection = false)
  {
    echo "\nTrying to Open a connection to the database...\n\n";

    /* Attempts to connect to the database */
    if($persistentConnection)
    {
      // Persistent
      $this->dbconn = db2_pconnect($this->connectionString, $this->userName, $this->userPassword);
    }
    else
    {
      // Not persistent
      $this->dbconn = db2_connect($this->connectionString, $this->userName, $this->userPassword);
    }

    /* Checks to see if a database connection was successfully established */
    if($this->dbconn == null)
    {
      /* If a connection was not established the returned error message is outputted and then the program is terminated. */
      echo "\n" . db2_conn_errormsg() . "\n";
      exit;
    }
    else
    {
      /* If the connection was established we say so */
      echo "\nConnection Open\n";

      /***
       * Verify that auto commit is turned off or we try to turn it off
       * If we can not turn off auto commit we close the connection and exit.
       ***/
      if(db2_autocommit($this->dbconn) == 0)
      {
         $this->format_Output("-- AUTOCOMMIT is off.\n");
      }
      else
      {
        if(db2_autocommit($this->dbconn, DB2_AUTOCOMMIT_OFF))
        {
           $this->format_Output("-- AUTOCOMMIT is off.\n");
         }
         else
         {
           $this->format_Output("-- AUTOCOMMIT is on.\n");
           $this->format_Output("Connection Failed\n");
           close_Connection();
           exit;
         }
      }
      echo "\n";
    }
    return $this->dbconn;
  }

  public function rollback($dbconn = null)
  {
  	// if $dbconn is null use the local connection
    if($dbconn === null) $dbconn = $this->dbconn;

    // if $dbconn is still null say so and exit the function
    if($dbconn === null)
    {
      $this->format_Output("\nThere is not connection to perform a rollback on!\n");
      return false;
    };
    $this->format_Output("\nRolling back the transaction...");

    if(db2_rollback($dbconn))
    {
      $this->format_Output("\nThe transaction was rolled back.\n");
      return true;
    }
    else
    {
      $this->format_Output("\nError in rolling back transaction\n");
      return false;
    }
  }

  public function commit($dbconn = null)
  {
    // if $dbconn is null use the local connection
    if($dbconn === null) $dbconn = $this->dbconn;

    // if $dbconn is still null say so and exit the function
    if($dbconn === null)
    {
      $this->format_Output("\nThere is not connection to perform a commit on!\n");
      return false;
    };

    $this->format_Output("\nCommitting the transaction...");

    if(db2_commit($dbconn))
    {
      $this->format_Output("\nThe transaction was committed.\n");
      return true;
    }
    else
    {
      $this->format_Output("\nError in Committing the transaction\n");
      return false;
    }
  }

  public function close_Connection($dbconn = null)
  {
    // if $dbconn is null use the local connection
    if($dbconn === null) $dbconn = $this->dbconn;

    // if $dbconn is still null say so and exit the function
    if($dbconn === null)
    {
      $this->format_Output("\nThere is not connection to close!\n");
      return false;
    };

    $this->format_Output("\n\nTrying to close a connection to the database...");

    if(db2_close($dbconn)==1)
    {
      $this->format_Output("\nConnection Closed.\n");
      return true;
    }
    else
    {
      $this->format_Output("\nError Closing Connection .");
    }
    return false;
  }

  public function exec($query)
  {
    if(db2_exec($this->dbconn, $query) === false)
    {
      return false;
    }
    return true;
  }

  public function get_Error()
  {
  	return db2_stmt_errormsg() . "\n";
  }
}
?>