1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Application
* @subpackage Resource
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id$
*/
require_once 'Zend/Application/Resource/ResourceAbstract.php';
require_once 'Zend/Db/Table.php';
/**
*/
/**
* Cache Manager resource
*
* Example configuration:
* <pre>
* resources.multidb.db1.adapter = "pdo_mysql"
* resources.multidb.db1.host = "localhost"
* resources.multidb.db1.username = "webuser"
* resources.multidb.db1.password = "XXXX"
* resources.multidb.db1.dbname = "db1"
* resources.multidb.db1.default = true
*
* resources.multidb.db2.adapter = "pdo_pgsql"
* resources.multidb.db2.host = "example.com"
* resources.multidb.db2.username = "dba"
* resources.multidb.db2.password = "notthatpublic"
* resources.multidb.db2.dbname = "db2"
* </pre>
*
* @category Zend
* @package Zend_Application
* @subpackage Resource
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
class Zend_Application_Resource_Multidb extends Zend_Application_Resource_ResourceAbstract
{
/**
* Associative array containing all configured db's
*
* @var array
*/
protected $_dbs = array();
/**
* An instance of the default db, if set
*
* @var null|Zend_Db_Adapter_Abstract
*/
protected $_defaultDb;
/**
* Initialize the Database Connections (instances of Zend_Db_Table_Abstract)
*
* @return Zend_Application_Resource_Multidb
*/
public function init()
{
$options = $this->getOptions();
foreach ($options as $id => $params) {
$adapter = $params['adapter'];
$default = (int) (
isset($params['isDefaultTableAdapter']) && $params['isDefaultTableAdapter']
|| isset($params['default']) && $params['default']
);
unset(
$params['adapter'],
$params['default'],
$params['isDefaultTableAdapter']
);
$this->_dbs[$id] = Zend_Db::factory($adapter, $params);
if ($default) {
$this->_setDefault($this->_dbs[$id]);
}
}
return $this;
}
/**
* Determine if the given db(identifier) is the default db.
*
* @param string|Zend_Db_Adapter_Abstract $db The db to determine whether it's set as default
* @return boolean True if the given parameter is configured as default. False otherwise
*/
public function isDefault($db)
{
if(!$db instanceof Zend_Db_Adapter_Abstract) {
$db = $this->getDb($db);
}
return $db === $this->_defaultDb;
}
/**
* Retrieve the specified database connection
*
* @param null|string|Zend_Db_Adapter_Abstract $db The adapter to retrieve.
* Null to retrieve the default connection
* @return Zend_Db_Adapter_Abstract
* @throws Zend_Application_Resource_Exception if the given parameter could not be found
*/
public function getDb($db = null)
{
if ($db === null) {
return $this->getDefaultDb();
}
if (isset($this->_dbs[$db])) {
return $this->_dbs[$db];
}
throw new Zend_Application_Resource_Exception(
'A DB adapter was tried to retrieve, but was not configured'
);
}
/**
* Get the default db connection
*
* @param boolean $justPickOne If true, a random (the first one in the stack)
* connection is returned if no default was set.
* If false, null is returned if no default was set.
* @return null|Zend_Db_Adapter_Abstract
*/
public function getDefaultDb($justPickOne = true)
{
if ($this->_defaultDb !== null) {
return $this->_defaultDb;
}
if ($justPickOne) {
return reset($this->_dbs); // Return first db in db pool
}
return null;
}
/**
* Set the default db adapter
*
* @var Zend_Db_Adapter_Abstract $adapter Adapter to set as default
*/
protected function _setDefault(Zend_Db_Adapter_Abstract $adapter)
{
Zend_Db_Table::setDefaultAdapter($adapter);
$this->_defaultDb = $adapter;
}
}
|