$class, 'plugin' => null, 'message' => 'Datasource is not found in Model/Datasource package.' )); } self::$_dataSources[$name] = new $class(self::$config->{$name}); self::$_dataSources[$name]->configKeyName = $name; return self::$_dataSources[$name]; } /** * Gets the list of available DataSource connections * This will only return the datasources instantiated by this manager * It differs from enumConnectionObjects, since the latter will return all configured connections * * @return array List of available connections */ public static function sourceList() { if (empty(self::$_init)) { self::_init(); } return array_keys(self::$_dataSources); } /** * Gets a DataSource name from an object reference. * * @param DataSource $source DataSource object * @return string Datasource name, or null if source is not present * in the ConnectionManager. */ public static function getSourceName($source) { if (empty(self::$_init)) { self::_init(); } foreach (self::$_dataSources as $name => $ds) { if ($ds === $source) { return $name; } } return null; } /** * Loads the DataSource class for the given connection name * * @param string|array $connName A string name of the connection, as defined in app/Config/database.php, * or an array containing the filename (without extension) and class name of the object, * to be found in app/Model/Datasource/ or lib/Cake/Model/Datasource/. * @return boolean True on success, null on failure or false if the class is already loaded * @throws MissingDatasourceException */ public static function loadDataSource($connName) { if (empty(self::$_init)) { self::_init(); } if (is_array($connName)) { $conn = $connName; } else { $conn = self::$_connectionsEnum[$connName]; } if (class_exists($conn['classname'], false)) { return false; } $plugin = $package = null; if (!empty($conn['plugin'])) { $plugin = $conn['plugin'] . '.'; } if (!empty($conn['package'])) { $package = '/' . $conn['package']; } App::uses($conn['classname'], $plugin . 'Model/Datasource' . $package); if (!class_exists($conn['classname'])) { throw new MissingDatasourceException(array( 'class' => $conn['classname'], 'plugin' => substr($plugin, 0, -1) )); } return true; } /** * Return a list of connections * * @return array An associative array of elements where the key is the connection name * (as defined in Connections), and the value is an array with keys 'filename' and 'classname'. */ public static function enumConnectionObjects() { if (empty(self::$_init)) { self::_init(); } return (array)self::$config; } /** * Dynamically creates a DataSource object at runtime, with the given name and settings * * @param string $name The DataSource name * @param array $config The DataSource configuration settings * @return DataSource A reference to the DataSource object, or null if creation failed */ public static function create($name = '', $config = array()) { if (empty(self::$_init)) { self::_init(); } if (empty($name) || empty($config) || array_key_exists($name, self::$_connectionsEnum)) { return null; } self::$config->{$name} = $config; self::$_connectionsEnum[$name] = self::_connectionData($config); $return = self::getDataSource($name); return $return; } /** * Removes a connection configuration at runtime given its name * * @param string $name the connection name as it was created * @return boolean success if connection was removed, false if it does not exist */ public static function drop($name) { if (empty(self::$_init)) { self::_init(); } if (!isset(self::$config->{$name})) { return false; } unset(self::$_connectionsEnum[$name], self::$_dataSources[$name], self::$config->{$name}); return true; } /** * Gets a list of class and file names associated with the user-defined DataSource connections * * @param string $name Connection name * @return void * @throws MissingDatasourceConfigException */ protected static function _getConnectionObject($name) { if (!empty(self::$config->{$name})) { self::$_connectionsEnum[$name] = self::_connectionData(self::$config->{$name}); } else { throw new MissingDatasourceConfigException(array('config' => $name)); } } /** * Returns the file, class name, and parent for the given driver. * * @param array $config Array with connection configuration. Key 'datasource' is required * @return array An indexed array with: filename, classname, plugin and parent */ protected static function _connectionData($config) { $package = $classname = $plugin = null; list($plugin, $classname) = pluginSplit($config['datasource']); if (strpos($classname, '/') !== false) { $package = dirname($classname); $classname = basename($classname); } return compact('package', 'classname', 'plugin'); } }