Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/site/cake/libs/model/connection_manager.php
diff options
context:
space:
mode:
Diffstat (limited to 'site/cake/libs/model/connection_manager.php')
-rw-r--r--site/cake/libs/model/connection_manager.php243
1 files changed, 243 insertions, 0 deletions
diff --git a/site/cake/libs/model/connection_manager.php b/site/cake/libs/model/connection_manager.php
new file mode 100644
index 0000000..df7829c
--- /dev/null
+++ b/site/cake/libs/model/connection_manager.php
@@ -0,0 +1,243 @@
+<?php
+/* SVN FILE: $Id: connection_manager.php 6305 2008-01-02 02:33:56Z phpnut $ */
+
+/**
+ * Short description for file.
+ *
+ * Long description for file
+ *
+ * PHP versions 4 and 5
+ *
+ * CakePHP(tm) : Rapid Development Framework <http://www.cakephp.org/>
+ * Copyright 2005-2008, Cake Software Foundation, Inc.
+ * 1785 E. Sahara Avenue, Suite 490-204
+ * Las Vegas, Nevada 89104
+ *
+ * Licensed under The MIT License
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @filesource
+ * @copyright Copyright 2005-2008, Cake Software Foundation, Inc.
+ * @link http://www.cakefoundation.org/projects/info/cakephp CakePHP(tm) Project
+ * @package cake
+ * @subpackage cake.cake.libs.model
+ * @since CakePHP(tm) v 0.10.x.1402
+ * @version $Revision: 6305 $
+ * @modifiedby $LastChangedBy: phpnut $
+ * @lastmodified $Date: 2008-01-01 20:33:56 -0600 (Tue, 01 Jan 2008) $
+ * @license http://www.opensource.org/licenses/mit-license.php The MIT License
+ */
+
+/**
+ * Manages loaded instances of DataSource objects
+ *
+ * Long description for file
+ *
+ * @package cake
+ * @subpackage cake.cake.libs.model
+ */
+
+uses ('model' . DS . 'datasources' . DS . 'datasource');
+config('database');
+
+class ConnectionManager extends Object {
+
+/**
+ * Holds a loaded instance of the Connections object
+ *
+ * @var class:Connections
+ * @access public
+ */
+ var $config = null;
+/**
+ * Holds instances DataSource objects
+ *
+ * @var array
+ * @access private
+ */
+ var $_dataSources = array();
+/**
+ * Contains a list of all file and class names used in Connection settings
+ *
+ * @var array
+ * @access private
+ */
+ var $_connectionsEnum = array();
+/**
+ * Constructor.
+ *
+ */
+ function __construct() {
+ if (class_exists('DATABASE_CONFIG')) {
+ $this->config = new DATABASE_CONFIG();
+ }
+ }
+/**
+ * Gets a reference to the ConnectionManger object instance
+ *
+ * @return object
+ */
+ function &getInstance() {
+ static $instance = array();
+
+ if (!isset($instance[0]) || !$instance[0]) {
+ $instance[0] = &new ConnectionManager();
+ }
+
+ return $instance[0];
+ }
+/**
+ * Gets a reference to a DataSource object
+ *
+ * @param string $name The name of the DataSource, as defined in app/config/connections
+ * @return object
+ */
+ function &getDataSource($name) {
+ $_this =& ConnectionManager::getInstance();
+
+ if (in_array($name, array_keys($_this->_dataSources))) {
+ return $_this->_dataSources[$name];
+ }
+
+ $connections = $_this->enumConnectionObjects();
+ if (in_array($name, array_keys($connections))) {
+ $conn = $connections[$name];
+ $class = $conn['classname'];
+ $_this->loadDataSource($name);
+ $_this->_dataSources[$name] =& new $class($_this->config->{$name});
+ $_this->_dataSources[$name]->configKeyName = $name;
+ } else {
+ trigger_error(sprintf(__("ConnectionManager::getDataSource - Non-existent data source %s", true), $name), E_USER_ERROR);
+ return null;
+ }
+
+ return $_this->_dataSources[$name];
+ }
+/**
+ * Gets a DataSource name from an object reference
+ *
+ * @param object $source
+ * @return string
+ */
+ function getSourceName(&$source) {
+ $_this =& ConnectionManager::getInstance();
+
+ $names = array_keys($_this->_dataSources);
+ for ($i = 0; $i < count($names); $i++) {
+ if ($_this->_dataSources[$names[$i]] === $source) {
+ return $names[$i];
+ }
+ }
+ return null;
+ }
+/**
+ * Loads the DataSource class for the given connection name
+ *
+ * @param mixed $connName A string name of the connection, as defined in Connections config,
+ * or an array containing the file and class name of the object.
+ * @return boolean True on success, null on failure or false if the class is already loaded
+ */
+ function loadDataSource($connName) {
+ $_this =& ConnectionManager::getInstance();
+
+ if (is_array($connName)) {
+ $conn = $connName;
+ } else {
+ $connections = $_this->enumConnectionObjects();
+ $conn = $connections[$connName];
+ }
+
+ if (isset($conn['parent']) && !empty($conn['parent'])) {
+ $_this->loadDataSource($conn['parent']);
+ }
+
+ if (class_exists($conn['classname'])) {
+ return false;
+ }
+
+ if (file_exists(MODELS . DS . $conn['filename'] . '.php')) {
+ require (MODELS . DS . $conn['filename'] . '.php');
+ } elseif (fileExistsInPath(LIBS . 'model' . DS . $conn['filename'] . '.php')) {
+ require (LIBS . 'model' . DS . $conn['filename'] . '.php');
+ } else {
+ trigger_error(sprintf(__('Unable to load DataSource file %s.php', true), $conn['filename']), E_USER_ERROR);
+ return null;
+ }
+ }
+/**
+ * Gets a list of class and file names associated with the user-defined DataSource 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'.
+ */
+ function enumConnectionObjects() {
+ $_this =& ConnectionManager::getInstance();
+
+ if (!empty($_this->_connectionsEnum)) {
+ return $_this->_connectionsEnum;
+ }
+ $connections = get_object_vars($_this->config);
+
+ if ($connections != null) {
+ foreach ($connections as $name => $config) {
+ $_this->_connectionsEnum[$name] = $_this->__getDriver($config);
+ }
+ return $_this->_connectionsEnum;
+ } else {
+ $_this->cakeError('missingConnection', array(array('className' => 'ConnectionManager')));
+ }
+ }
+/**
+ * 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 object A reference to the DataSource object, or null if creation failed
+ */
+ function &create($name = '', $config = array()) {
+ $_this =& ConnectionManager::getInstance();
+
+ if (empty($name) || empty($config) || array_key_exists($name, $_this->_connectionsEnum)) {
+ $null = null;
+ return $null;
+ }
+
+ $_this->config->{$name} = $config;
+ $_this->_connectionsEnum[$name] = $_this->__getDriver($config);
+ return $_this->getDataSource($name);
+ }
+/**
+ * Private method
+ *
+ * Returns the file and class name for the given driver
+ */
+ function __getDriver($config) {
+ $_this =& ConnectionManager::getInstance();
+
+ if (!isset($config['datasource'])) {
+ $config['datasource'] = 'dbo';
+ }
+
+ if (isset($config['driver']) && $config['driver'] != null && !empty($config['driver'])) {
+ $filename = $config['datasource'] . DS . $config['datasource'] . '_' . $config['driver'];
+ $classname = Inflector::camelize(strtolower($config['datasource'] . '_' . $config['driver']));
+ $parent = $_this->__getDriver(array('datasource' => $config['datasource']));
+ } else {
+ $filename = 'datasources' . DS . $config['datasource'] . '_source';
+ $classname = Inflector::camelize(strtolower($config['datasource'] . '_source'));
+ $parent = null;
+ }
+ return array('filename' => $filename, 'classname' => $classname, 'parent' => $parent);
+ }
+/**
+ * Destructor.
+ *
+ */
+ function __destruct() {
+ if (CAKE_SESSION_SAVE == 'database' && function_exists('session_write_close')) {
+ session_write_close();
+ }
+ }
+}
+
+?> \ No newline at end of file