Exemplo n.º 1
0
 /**
  * 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());
     }
 }