/** * Connect to database * * @throws DBIConnexionMissingParameterException * @throws DBIConnexionException */ private static function connect() { if (!is_null(self::$instance)) { return; } // Get config, check mandatory parameters $config = Config::get('db_*'); $config['dsn'] = Config::get('dsn'); foreach (array('type', 'host', 'database', 'port', 'username', 'password', 'driver_options', 'charset', 'collation') as $p) { if (!array_key_exists($p, $config)) { $config[$p] = null; } } // Build dsn from individual components if not defined if (!$config['dsn']) { if (!$config['type']) { $config['type'] = 'pgsql'; } $params = array(); if (!$config['host']) { throw new DBIConnexionMissingParameterException('host'); } $params[] = 'host=' . $config['host']; if (!$config['database']) { throw new DBIConnexionMissingParameterException('database'); } $params[] = 'dbname=' . $config['database']; if ($config['port']) { $params[] = 'port=' . $config['port']; } $config['dsn'] = $config['type'] . ':' . implode(';', $params); } // Check that required parameters are not empty if (!$config['username']) { throw new DBIConnexionMissingParameterException('username'); } if (!$config['password']) { throw new DBIConnexionMissingParameterException('password'); } if (!$config['driver_options']) { $config['driver_options'] = array(); } // Try to connect, cast any thrown exception try { // Connect self::$instance = new PDO($config['dsn'], $config['username'], $config['password'], $config['driver_options']); // Set options : throw if error, do not cast returned values to string, fetch as associative array by default self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); self::$instance->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false); self::$instance->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); // db_charset given in config ? if ($config['charset']) { if ($config['collation']) { self::prepare('SET NAMES :charset COLLATE :collation')->execute(array(':charset' => $config['charset'], ':collation' => $config['collation'])); } else { self::prepare('SET NAMES :charset')->execute(array(':charset' => $config['charset'])); } } } catch (Exception $e) { throw new DBIConnexionException('DBI connect error : ' . $e->getMessage()); } }