Esempio n. 1
0
 /**
  * Class constructor
  *
  * Validates the DSN string and/or detects the subdriver.
  *
  * @param	array	$params
  * @return	void
  */
 public function __construct($params)
 {
     parent::__construct($params);
     if (preg_match('/([^:]+):/', $this->dsn, $match) && count($match) === 2) {
         // If there is a minimum valid dsn string pattern found, we're done
         // This is for general PDO users, who tend to have a full DSN string.
         $this->subdriver = $match[1];
         return;
     } elseif (preg_match('/([^:]+):/', $this->hostname, $match) && count($match) === 2) {
         $this->dsn = $this->hostname;
         $this->hostname = NULL;
         $this->subdriver = $match[1];
         return;
     } elseif (in_array($this->subdriver, array('mssql', 'sybase'), TRUE)) {
         $this->subdriver = 'dblib';
     } elseif ($this->subdriver === '4D') {
         $this->subdriver = '4d';
     } elseif (!in_array($this->subdriver, array('4d', 'cubrid', 'dblib', 'firebird', 'ibm', 'informix', 'mysql', 'oci', 'odbc', 'pgsql', 'sqlite', 'sqlsrv'), TRUE)) {
         Logger::logError('PDO: Invalid or non-existent subdriver');
         if ($this->db_debug) {
             throw new DatabaseException('Invalid or non-existent PDO subdriver', 1);
         }
     }
     $this->dsn = NULL;
 }
Esempio n. 2
0
 /**
  * Class constructor
  *
  * Appends the port number to the hostname, if needed.
  *
  * @param	array	$params
  * @return	void
  */
 public function __construct($params)
 {
     parent::__construct($params);
     if (!empty($this->port)) {
         $this->hostname .= (DIRECTORY_SEPARATOR === '\\' ? ',' : ':') . $this->port;
     }
 }
Esempio n. 3
0
 /**
  * Class constructor
  *
  * @param	array	$params
  * @return	void
  */
 public function __construct($params)
 {
     parent::__construct($params);
     if (preg_match('/^CUBRID:[^:]+(:[0-9][1-9]{0,4})?:[^:]+:[^:]*:[^:]*:(\\?.+)?$/', $this->dsn, $matches)) {
         if (stripos($matches[2], 'autocommit=off') !== FALSE) {
             $this->auto_commit = FALSE;
         }
     } else {
         // If no port is defined by the user, use the default value
         empty($this->port) or $this->port = 33000;
     }
 }
Esempio n. 4
0
 /**
  * Class constructor
  *
  * Creates a DSN string to be used for db_connect() and db_pconnect()
  *
  * @param	array	$params
  * @return	void
  */
 public function __construct($params)
 {
     parent::__construct($params);
     if (!empty($this->dsn)) {
         return;
     }
     $this->dsn === '' or $this->dsn = '';
     if (strpos($this->hostname, '/') !== FALSE) {
         // If UNIX sockets are used, we shouldn't set a port
         $this->port = '';
     }
     $this->hostname === '' or $this->dsn = 'host=' . $this->hostname . ' ';
     if (!empty($this->port) && ctype_digit($this->port)) {
         $this->dsn .= 'port=' . $this->port . ' ';
     }
     if ($this->username !== '') {
         $this->dsn .= 'user='******' ';
         /* An empty password is valid!
          *
          * $db['password'] = NULL must be done in order to ignore it.
          */
         $this->password === NULL or $this->dsn .= "password='******' ";
     }
     $this->database === '' or $this->dsn .= 'dbname=' . $this->database . ' ';
     /* We don't have these options as elements in our standard configuration
      * array, but they might be set by parse_url() if the configuration was
      * provided via string. Example:
      *
      * postgre://username:password@localhost:5432/database?connect_timeout=5&sslmode=1
      */
     foreach (array('connect_timeout', 'options', 'sslmode', 'service') as $key) {
         if (isset($this->{$key}) && is_string($this->key) && $this->key !== '') {
             $this->dsn .= $key . "='" . $this->key . "' ";
         }
     }
     $this->dsn = rtrim($this->dsn);
 }
Esempio n. 5
0
 /**
  * Class constructor
  *
  * @param	array	$params
  * @return	void
  */
 public function __construct($params)
 {
     parent::__construct($params);
     // Legacy support for DSN in the hostname field
     if (empty($this->dsn)) {
         $this->dsn = $this->hostname;
     }
 }
Esempio n. 6
0
 /**
  * Class constructor
  *
  * @param	array	$params
  * @return	void
  */
 public function __construct($params)
 {
     parent::__construct($params);
     $valid_dsns = array('tns' => '/^\\(DESCRIPTION=(\\(.+\\)){2,}\\)$/', 'ec' => '/^(\\/\\/)?[a-z0-9.:_-]+(:[1-9][0-9]{0,4})?(\\/[a-z0-9$_]+)?(:[^\\/])?(\\/[a-z0-9$_]+)?$/i', 'in' => '/^[a-z0-9$_]+$/i');
     /* Space characters don't have any effect when actually
      * connecting, but can be a hassle while validating the DSN.
      */
     $this->dsn = str_replace(array("\n", "\r", "\t", ' '), '', $this->dsn);
     if ($this->dsn !== '') {
         foreach ($valid_dsns as $regexp) {
             if (preg_match($regexp, $this->dsn)) {
                 return;
             }
         }
     }
     // Legacy support for TNS in the hostname configuration field
     $this->hostname = str_replace(array("\n", "\r", "\t", ' '), '', $this->hostname);
     if (preg_match($valid_dsns['tns'], $this->hostname)) {
         $this->dsn = $this->hostname;
         return;
     } elseif ($this->hostname !== '' && strpos($this->hostname, '/') === FALSE && strpos($this->hostname, ':') === FALSE && (!empty($this->port) && ctype_digit($this->port) or $this->database !== '')) {
         /* If the hostname field isn't empty, doesn't contain
          * ':' and/or '/' and if port and/or database aren't
          * empty, then the hostname field is most likely indeed
          * just a hostname. Therefore we'll try and build an
          * Easy Connect string from these 3 settings, assuming
          * that the database field is a service name.
          */
         $this->dsn = $this->hostname . (!empty($this->port) && ctype_digit($this->port) ? ':' . $this->port : '') . ($this->database !== '' ? '/' . ltrim($this->database, '/') : '');
         if (preg_match($valid_dsns['ec'], $this->dsn)) {
             return;
         }
     }
     /* At this point, we can only try and validate the hostname and
      * database fields separately as DSNs.
      */
     if (preg_match($valid_dsns['ec'], $this->hostname) or preg_match($valid_dsns['in'], $this->hostname)) {
         $this->dsn = $this->hostname;
         return;
     }
     $this->database = str_replace(array("\n", "\r", "\t", ' '), '', $this->database);
     foreach ($valid_dsns as $regexp) {
         if (preg_match($regexp, $this->database)) {
             return;
         }
     }
     /* Well - OK, an empty string should work as well.
      * PHP will try to use environment variables to
      * determine which Oracle instance to connect to.
      */
     $this->dsn = '';
 }
Esempio n. 7
0
 /**
  * Class constructor
  *
  * @param	array	$params
  * @return	void
  */
 public function __construct($params)
 {
     parent::__construct($params);
     // This is only supported as of SQLSRV 3.0
     if ($this->scrollable === NULL) {
         $this->scrollable = defined('SQLSRV_CURSOR_CLIENT_BUFFERED') ? SQLSRV_CURSOR_CLIENT_BUFFERED : FALSE;
     }
 }
Esempio n. 8
0
 /**
  * Class constructor
  *
  * @param	array	$params
  * @return	void
  */
 public function __construct($params)
 {
     parent::__construct($params);
     if (!empty($this->port)) {
         $this->hostname .= ':' . $this->port;
     }
 }