$this->isConnected = true;
} else if (is_array($adapter)) {
$this->options['dsn'] = $adapter['dsn'];
- $this->options['username'] = $adapter['user'];
- $this->options['password'] = $adapter['pass'];
-
- $this->options['other'] = array();
- if (isset($adapter['other'])) {
- $this->options['other'] = array(IPF_ORM::ATTR_PERSISTENT => $adapter['persistent']);
+ $this->options['username'] = $adapter['username'];
+ $this->options['password'] = $adapter['password'];
+
+ $this->options['other'] = array();
+ if (isset($adapter['options'])) {
+ if (in_array('persistent', $adapter['options']))
+ $this->options['other'][PDO::ATTR_PERSISTENT] = true;
}
}
return IPF_ORM_Manager::getInstance()->getCurrentConnection();
}
- public function openConnection($adapter, $name = null, $setCurrent = true, $persistent = false)
+ public function openConnection($adapter, $name = null, $setCurrent = true)
{
if (is_object($adapter)) {
if (!($adapter instanceof PDO))
throw new IPF_ORM_Exception("First argument should be an instance of PDO");
$driverName = $adapter->getAttribute(PDO::ATTR_DRIVER_NAME);
} else if (is_array($adapter)) {
- if (!isset($adapter[0]))
+ if (!count($adapter))
throw new IPF_ORM_Exception('Empty data source name given.');
- $e = explode(':', $adapter[0]);
-
- if ($e[0] == 'uri') {
- $e[0] = 'odbc';
+ if (array_key_exists('database', $adapter)) {
+ $adapter['dsn'] = $this->makeDsnForPDO($adapter['driver'], $adapter['host'], @$adapter['port'], $adapter['database']);
+ } else {
+ $adapter = array(
+ 'dsn' => urldecode($adapter[0]),
+ 'username' => (isset($adapter[1])) ? urldecode($adapter[1]) : null,
+ 'password' => (isset($adapter[2])) ? urldecode($adapter[2]) : null,
+ );
}
- $parts['dsn'] = $adapter[0];
- $parts['scheme'] = $e[0];
- $parts['user'] = (isset($adapter[1])) ? $adapter[1] : null;
- $parts['pass'] = (isset($adapter[2])) ? $adapter[2] : null;
- $driverName = $e[0];
- $adapter = $parts;
+ $e = explode(':', $adapter['dsn']);
+ $driverName = $e[0] !== 'uri' ? $e[0] : 'odbc';
} else {
- $parts = $this->parseDsn($adapter);
- $driverName = $parts['scheme'];
- $adapter = $parts;
- }
-
- // Decode adapter information
- if (is_array($adapter)) {
- foreach ($adapter as $key => $value) {
- $adapter[$key] = $value?urldecode($value):null;
- }
+ $adapter = $this->parseDsn($adapter);
+ $driverName = $adapter['scheme'];
}
if ($name !== null) {
$className = $drivers[$driverName];
$conn = new $className($this, $adapter);
- if ($persistent)
- $conn->setOption(IPF_ORM::ATTR_PERSISTENT, true);
$conn->setName($name);
$this->_connections[$name] = $conn;
case 'sqlite3':
if (isset($parts['host']) && $parts['host'] == ':memory') {
$parts['database'] = ':memory:';
- $parts['dsn'] = 'sqlite::memory:';
} else {
//fix windows dsn we have to add host: to path and set host to null
if (isset($parts['host'])) {
$parts['host'] = null;
}
$parts['database'] = $parts['path'];
- $parts['dsn'] = $parts['scheme'] . ':' . $parts['path'];
}
+ $parts['dsn'] = $this->makeDsnForPDO($parts['scheme'], $parts['host'], @$parts['port'], $parts['database']);
+
break;
case 'mssql':
throw new IPF_ORM_Exception('No hostname set in data source name');
}
- $parts['dsn'] = $parts['scheme'] . ':host='
- . $parts['host'] . (isset($parts['port']) ? ':' . $parts['port']:null) . ';dbname='
- . $parts['database'];
+ $parts['dsn'] = $this->makeDsnForPDO($parts['scheme'], $parts['host'], @$parts['port'], $parts['database']);
break;
throw new IPF_ORM_Exception('No hostname set in data source name');
}
- $parts['dsn'] = $parts['scheme'] . ':host='
- . $parts['host'] . (isset($parts['port']) ? ';port=' . $parts['port']:null) . ';dbname='
- . $parts['database'];
+ $parts['dsn'] = $this->makeDsnForPDO($parts['scheme'], $parts['host'], @$parts['port'], $parts['database']);
break;
default:
return $parts;
}
+ public function makeDsnForPDO($driver, $host, $port, $database)
+ {
+ switch ($driver) {
+ case 'sqlite':
+ case 'sqlite2':
+ case 'sqlite3':
+ if ($host == ':memory') {
+ return 'sqlite::memory:';
+ } else {
+ return $driver . ':' . $database;
+ }
+
+ case 'mssql':
+ case 'dblib':
+ return $driver . ':host=' . $host . ($port ? ':' . $port : '') . ';dbname=' . $database;
+
+ case 'mysql':
+ case 'informix':
+ case 'oci8':
+ case 'oci':
+ case 'firebird':
+ case 'pgsql':
+ case 'odbc':
+ case 'mock':
+ case 'oracle':
+ return $driver . ':host=' . $host . ($port ? ';port=' . $port : '') . ';dbname=' . $database;
+
+ default:
+ throw new IPF_ORM_Exception('Unknown driver '.$driver);
+ }
+ }
+
public function getConnection($name)
{
if ( ! isset($this->_connections[$name])) {