00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 uses ('model' . DS . 'datasources' . DS . 'datasource');
00028 config('database');
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 class ConnectionManager extends Object {
00039
00040
00041
00042
00043
00044
00045 var $config = null;
00046
00047
00048
00049
00050
00051
00052 var $_dataSources = array();
00053
00054
00055
00056
00057
00058
00059 var $_connectionsEnum = array();
00060
00061
00062
00063
00064 function __construct() {
00065 if (class_exists('DATABASE_CONFIG')) {
00066 $this->config =& new DATABASE_CONFIG();
00067 }
00068 }
00069
00070
00071
00072
00073
00074
00075
00076 function &getInstance() {
00077 static $instance = array();
00078
00079 if (!$instance) {
00080 $instance[0] =& new ConnectionManager();
00081 }
00082
00083 return $instance[0];
00084 }
00085
00086
00087
00088
00089
00090
00091
00092
00093 function &getDataSource($name) {
00094 $_this =& ConnectionManager::getInstance();
00095
00096 if (!empty($_this->_dataSources[$name])) {
00097 $return =& $_this->_dataSources[$name];
00098 return $return;
00099 }
00100
00101 $connections = $_this->enumConnectionObjects();
00102 if (!empty($connections[$name])) {
00103 $conn = $connections[$name];
00104 $class = $conn['classname'];
00105 $_this->loadDataSource($name);
00106 $_this->_dataSources[$name] =& new $class($_this->config->{$name});
00107 $_this->_dataSources[$name]->configKeyName = $name;
00108 } else {
00109 trigger_error(sprintf(__("ConnectionManager::getDataSource - Non-existent data source %s", true), $name), E_USER_ERROR);
00110 return null;
00111 }
00112
00113 $return =& $_this->_dataSources[$name];
00114 return $return;
00115 }
00116
00117
00118
00119
00120
00121
00122
00123 function sourceList() {
00124 $_this =& ConnectionManager::getInstance();
00125 return array_keys($_this->_dataSources);
00126 }
00127
00128
00129
00130
00131
00132
00133
00134
00135 function getSourceName(&$source) {
00136 $_this =& ConnectionManager::getInstance();
00137 $names = array_keys($_this->_dataSources);
00138 for ($i = 0; $i < count($names); $i++) {
00139 if ($_this->_dataSources[$names[$i]] === $source) {
00140 return $names[$i];
00141 }
00142 }
00143 return null;
00144 }
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 function loadDataSource($connName) {
00156 $_this =& ConnectionManager::getInstance();
00157
00158 if (is_array($connName)) {
00159 $conn = $connName;
00160 } else {
00161 $connections = $_this->enumConnectionObjects();
00162 $conn = $connections[$connName];
00163 }
00164
00165 if (!empty($conn['parent'])) {
00166 $_this->loadDataSource($conn['parent']);
00167 }
00168
00169 if (class_exists($conn['classname'])) {
00170 return false;
00171 }
00172
00173 if (file_exists(MODELS . 'datasources' . DS . $conn['filename'] . '.php')) {
00174 require (MODELS . 'datasources' . DS . $conn['filename'] . '.php');
00175 } elseif (fileExistsInPath(LIBS . 'model' . DS . 'datasources' . DS . $conn['filename'] . '.php')) {
00176 require (LIBS . 'model' . DS . 'datasources' . DS . $conn['filename'] . '.php');
00177 } else {
00178 $error = __('Unable to load DataSource file %s.php', true);
00179 trigger_error(sprintf($error, $conn['filename']), E_USER_ERROR);
00180 return null;
00181 }
00182 }
00183
00184
00185
00186
00187
00188
00189
00190
00191 function enumConnectionObjects() {
00192 $_this =& ConnectionManager::getInstance();
00193
00194 if (!empty($_this->_connectionsEnum)) {
00195 return $_this->_connectionsEnum;
00196 }
00197 $connections = get_object_vars($_this->config);
00198
00199 if ($connections != null) {
00200 foreach ($connections as $name => $config) {
00201 $_this->_connectionsEnum[$name] = $_this->__getDriver($config);
00202 }
00203 return $_this->_connectionsEnum;
00204 } else {
00205 $_this->cakeError('missingConnection', array(array('className' => 'ConnectionManager')));
00206 }
00207 }
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217 function &create($name = '', $config = array()) {
00218 $_this =& ConnectionManager::getInstance();
00219
00220 if (empty($name) || empty($config) || array_key_exists($name, $_this->_connectionsEnum)) {
00221 $null = null;
00222 return $null;
00223 }
00224
00225 $_this->config->{$name} = $config;
00226 $_this->_connectionsEnum[$name] = $_this->__getDriver($config);
00227 $return =& $_this->getDataSource($name);
00228 return $return;
00229 }
00230
00231
00232
00233
00234
00235
00236 function __getDriver($config) {
00237 if (!isset($config['datasource'])) {
00238 $config['datasource'] = 'dbo';
00239 }
00240
00241 if (isset($config['driver']) && $config['driver'] != null && !empty($config['driver'])) {
00242 $filename = $config['datasource'] . DS . $config['datasource'] . '_' . $config['driver'];
00243 $classname = Inflector::camelize(strtolower($config['datasource'] . '_' . $config['driver']));
00244 $parent = $this->__getDriver(array('datasource' => $config['datasource']));
00245 } else {
00246 $filename = $config['datasource'] . '_source';
00247 $classname = Inflector::camelize(strtolower($config['datasource'] . '_source'));
00248 $parent = null;
00249 }
00250 return array('filename' => $filename, 'classname' => $classname, 'parent' => $parent);
00251 }
00252
00253
00254
00255
00256
00257 function __destruct() {
00258 if (Configure::read('Session.save') == 'database' && function_exists('session_write_close')) {
00259 session_write_close();
00260 }
00261 }
00262 }
00263 ?>