<?php
/**
 * @copyright (c) Kufer Software GmbH, Loisachstrasse 4, D-84453 Mühldorf
 */

define('ISWIZARDS', true);
include_once '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR . 'constants.php';




class CheckConnection extends Wizard
{
  public $connection;

  
  public function __construct()
  {
    $this->wizardName = 'Check Connection';
    $this->wizardDescription
      = 'Dieser Wizard prüft die Verbindung zur Datenbank.';
  }

  
  public function checkDB1()
  {
    $this->connection = false;
    $conInfo = DBConnectionInfo::getInstance();

    return $this->check(
      $conInfo->db_typ,
      $conInfo->db_server,
      $conInfo->db_user,
      $conInfo->db_password,
      $conInfo->db_name
    );
  }

  
  public function checkDB2()
  {
    $this->connection = false;
    $conInfo = DBConnectionInfo::getInstance();
    if (!$conInfo->db_hybrid) {
      return 'Buchungsstatus auf Ernstbestand wurde nicht aktiviert';
    }

    return $this->check(
      $conInfo->db2_typ,
      $conInfo->db2_server,
      $conInfo->db2_user,
      $conInfo->db2_password,
      $conInfo->db2_name
    );
  }

  
  public function check($pDbType, $pDbserver, $pDbuser, $pDbpass, $pDbname)
  {
    $retour = false;
    switch ($pDbType) {
      case 'MYSQL': $retour = $this->_test_mysql_connect($pDbserver, $pDbuser, $pDbpass, $pDbname);
        break;
      case 'MYSQLI': $retour = $this->_test_mysqli_connect($pDbserver, $pDbuser, $pDbpass, $pDbname);
        break;
      case 'MSSQL': $retour = $this->_test_mssql_connect($pDbserver, $pDbuser, $pDbpass, $pDbname);
        break;
      case 'ORACLE':
      case 'MSSQLODBC': $retour = $this->_test_odbc_connect($pDbserver, $pDbuser, $pDbpass, $pDbname);
        break;
    }

    return $retour;
  }

  
  public function _test_mysql_connect($pDbserver, $pDbuser, $pDbpass, $pDbname)
  {
    $this->connection = @mysql_connect($pDbserver, $pDbuser, $pDbpass);
    if ($this->connection === false) {
      return 'Verbindung zum MySQL Server ' . $pDbserver . ' kann nicht aufgebaut werden' . BR_WT
         . 'Error #' . mysql_errno() . ': ' . mysql_error();
    }
    $selectDbOk = true;
    @mysql_select_db($pDbname, $this->connection) or ($selectDbOk = false);
    if (!$selectDbOk) {
      return 'Fehler beim Auswählen der Datenbank (MySQL)' . BR_WT
         . 'Error #' . mysql_errno() . ': ' . mysql_error();
    }

    return true;
  }

  
  public function _test_mysqli_connect($pDbserver, $pDbuser, $pDbpass, $pDbname)
  {
    $this->connection = @mysqli_connect($pDbserver, $pDbuser, $pDbpass);
    if ($this->connection === false) {
      return 'Verbindung zum MySQL Server ' . $pDbserver . ' kann nicht aufgebaut werden' . BR_WT
         . 'Error #' . mysqli_errno($this->connection) . ': ' . mysqli_error($this->connection);
    }
    $selectDbOk = true;
    @mysqli_select_db($this->connection, $pDbname) or ($selectDbOk = false);
    if (!$selectDbOk) {
      return 'Fehler beim Auswählen der Datenbank (MySQL)' . BR_WT
         . 'Error #' . mysqli_errno($this->connection) . ': ' . mysqli_error($this->connection);
    }

    return true;
  }

  
  public function _test_mssql_connect($pDbserver, $pDbuser, $pDbpass, $pDbname)
  {
    if (function_exists('mssql_connect') !== true) {
      return 'Diese PHP Installation ist nicht für die Benutzung einer MSSQL Datenbank konfiguriert.';
    }

    $this->connection = @mssql_connect($pDbserver, $pDbuser, $pDbpass);
    if ($this->connection === false) {
      return 'Verbindung zum MSSQL Server ' . $pDbserver . ' kann nicht aufgebaut werden' . BR_WT
         . 'Error ' . mssql_get_last_message() . (StringOperations::strstr(PHP_OS, 'WIN')
         ? "\nBitte überprüfen Sie bei einem Windows-Server, ob in der Registry 
         der Schlüssel HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MSSQLServer
         \\Client\\ConnectTo\\DSQUERY den Wert DBNETLIB hat." : '');
    }
    $selectDbOk = true;
    @mssql_select_db($pDbname, $this->connection) or ($selectDbOk = false);
    if (!$selectDbOk) {
      return 'Fehler beim Auswählen der Datenbank (MSSQL)' . BR_WT
         . 'Error ' . mssql_get_last_message();
    }

    return true;
  }

  
  public function _test_odbc_connect($pDbserver, $pDbuser, $pDbpass, $pDbname)
  {
    if (function_exists('odbc_connect') !== true) {
      return 'Diese PHP Installation ist nicht für die Benutzung einer ODBC Datenbank konfiguriert.';
    }

    $this->connection = @odbc_connect($pDbserver, $pDbuser, $pDbpass);
    if ($this->connection === false) {
      return 'Verbindung zum ODBC Server ' . $pDbserver . ' kann nicht aufgebaut werden' . BR_WT
         . 'Error #' . odbc_error() . ': ' . odbc_errormsg();
    }

    return true;
  }

  
  public function _getWizardBody()
  {
    $conInfo = DBConnectionInfo::getInstance();
    $db1Requested = (isset($_REQUEST['checkDB1']) && $_REQUEST['checkDB1'] == 'true');
    $db2Requested = (isset($_REQUEST['checkDB2']) && $_REQUEST['checkDB2'] == 'true');
    $db2Activated = $conInfo->db_hybrid;

    $retour = '<form action="index.php" method="post">' . "\n"
      . '<input type="checkbox" value="true" name="checkDB1" ' . ($db1Requested ? 'checked ' : '') . '>Verbindung zur Datenbank 1 testen' . "\n";
    if ($db2Activated) {
      $retour .= BR_WT . '<input type="checkbox" value="true" name="checkDB2" ' . ($db2Requested ? 'checked ' : '') . '>Verbindung zur Datenbank 2 testen' . "\n";
    }

    $retour .= '<input type="submit" value="Go!">' . "\n"
            . '</form>';

    if ($db1Requested) {
      $result1 = $this->checkDB1();
      if ($result1 === true) {
        $retour .= '<p>Verbindung zur Datenbank 1 erfolgreich getestet!</p>' . "\n";
      } else {
        $retour .= '<p>Fehler beim Verbinden zur Datenbank 1:' . BR_WT . CleanOperations::cleanStringForHtml($result1) . '</p>' . "\n";
      }
    }

    if ($db2Requested && $db2Activated) {
      $result2 = $this->checkDB2();
      if ($result2 === true) {
        $retour .= '<p>Verbindung zur Datenbank 2 erfolgreich getestet!</p>' . "\n";
      } else {
        $retour .= '<p>Fehler beim Verbinden zur Datenbank 2:' . BR_WT . CleanOperations::cleanStringForHtml($result2) . '</p>' . "\n";
      }
    }

    return $retour;
  }
}

$checkConnection = new CheckConnection();
$checkConnection->start();