[limb-svn] r7009 - in 3.x/trunk/limb/dbal: src/toolkit tests/cases/toolkit

svn at limb-project.com svn at limb-project.com
Tue May 13 01:27:12 MSD 2008


Author: korchasa
Date: 2008-05-13 01:27:12 +0400 (Tue, 13 May 2008)
New Revision: 7009
URL: http://fisheye.limb-project.com/changelog/limb/?cs=7009

Modified:
   3.x/trunk/limb/dbal/src/toolkit/lmbDbTools.class.php
   3.x/trunk/limb/dbal/tests/cases/toolkit/lmbDbToolsTest.class.php
Log:
-- added methods to get/set database connections by dsn

Modified: 3.x/trunk/limb/dbal/src/toolkit/lmbDbTools.class.php
===================================================================
--- 3.x/trunk/limb/dbal/src/toolkit/lmbDbTools.class.php	2008-05-12 08:57:46 UTC (rev 7008)
+++ 3.x/trunk/limb/dbal/src/toolkit/lmbDbTools.class.php	2008-05-12 21:27:12 UTC (rev 7009)
@@ -20,8 +20,9 @@
  */
 class lmbDbTools extends lmbAbstractTools
 {
-  protected $db_configs = array('dsn' => null);
-  protected $connections = array('dsn' => null);
+  protected $dsnes_available = array('dsn' => null);
+  protected $dsnes_active = array();
+  protected $dsnes_names = array('dsn' => null);
   protected $cache_db_info = true;
   protected $db_info = array();
   protected $db_tables = array();
@@ -29,12 +30,12 @@
 
   function setDbEnvironment($env)
   {
-    $this->db_env = $env;
+    $this->dsnes_available = $env;
   }
 
   function getDbEnvironment()
   {
-    return $this->db_env;
+    return $this->dsnes_available;
   }
 
   function setDefaultDbDSN($dsn)
@@ -62,37 +63,58 @@
       return false;
     }
   }
-
-  function setDbDSNByName($name, $dsn)
+  
+  protected function _getDbDsnHash($dsn)
   {
     if(is_object($dsn))
-      $this->db_configs[$name] = $dsn;
-    else
-      $this->db_configs[$name] = new lmbDbDSN($dsn);
+      $dsn = $dsn->toString();      
+    return md5($dsn);
   }
-
-  function getDbDSNByName($name)
+  
+  protected function _tryLoadDsnFromEnvironment($conf, $name)
+  {    
+    $env = $conf->get($this->db_env);
+    if(!is_array($env) || !isset($env[$name]))
+      throw new lmbException("Could not find database connection settings for environment '{$this->db_env}'");
+    return $env[$name];
+  }
+  
+  protected function _loadDbDsnFromConfig($name)
   {
-    if(isset($this->db_configs[$name]) && is_object($this->db_configs[$name]))
-      return $this->db_configs[$name];
-
     $conf = $this->toolkit->getConf('db');
 
     //for BC 'dsn' overrides other db environments
-    if($dsn = $conf->get($name))
+    $dsn = ($conf->has($name))
+      ? $conf->get($name)
+      : $this->_tryLoadDsnFromEnvironment($conf, $name);
+    
+    $this->setDbDSNByName($name, new lmbDbDSN($dsn));
+    
+    return $dsn;
+  }
+
+  function setDbDSNByName($name, $dsn)
+  {
+    if(!is_object($dsn))
+      $dsn = new lmbDbDSN($dsn);
+    
+    $this->dsnes_names[$name] = $this->_getDbDsnHash($dsn);
+    $this->dsnes_available[$this->dsnes_names[$name]] = $dsn;
+  }
+
+  function getDbDSNByName($name)
+  {  
+    if(isset($this->dsnes_names[$name]))
+      $dsn = $this->dsnes_names[$name];
+    else 
     {
-      $this->setDbDSNByName($name, new lmbDbDSN($dsn));
+      $dsn = $this->_loadDbDsnFromConfig($name);
     }
-    else
-    {
-      $env = $conf->get($this->db_env);
-      if(!is_array($env) || !isset($env[$name]))
-        throw new lmbException("Could not find database connection settings for environment '{$this->db_env}'");
+      
+    if(isset($this->dsnes_available[$dsn]) && is_object($this->dsnes_available[$dsn]))
+      return $this->dsnes_available[$dsn];    
 
-      $this->setDbDSNByName($name, new lmbDbDSN($env[$name]));
-    }
-
-    return $this->db_configs[$name];
+    return $this->dsnes_available[$this->_getDbDsnHash($dsn)];
   }
 
   function getDbDSN($env)
@@ -105,22 +127,38 @@
 
     return new lmbDbDSN($array['dsn']);
   }
+  
+  function getDbConnectionByDsn($dsn)
+  {
+    $dsn_hash = $this->_getDbDsnHash($dsn);
+    
+    if(isset($this->dsnes_active[$dsn_hash]) && is_object($this->dsnes_active[$dsn_hash]))
+      return $this->dsnes_active[$dsn_hash];
 
+    $this->setDbConnectionByDsn($dsn, $this->createDbConnection($dsn));
+    return $this->dsnes_active[$dsn_hash];
+  }
+  
+  function setDbConnectionByDsn($dsn, $conn)
+  {
+    $this->dsnes_active[$this->_getDbDsnHash($dsn)] = $conn;
+  }
+  
   function setDbConnectionByName($name, $conn)
   {
-    $this->connections[$name] = $conn;
+    $this->dsnes_active[$name] = $conn;
   }
 
   function getDbConnectionByName($name)
   {
-    if(isset($this->connections[$name]) && is_object($this->connections[$name]))
-      return $this->connections[$name];
+    if(isset($this->dsnes_active[$name]) && is_object($this->dsnes_active[$name]))
+      return $this->dsnes_active[$name];
 
     if(!is_object($dsn = $this->toolkit->getDbDSNByName($name)))
       throw new lmbException($name . ' database DSN is not valid');
 
     $this->setDbConnectionByName($name, $this->createDbConnection($dsn));
-    return $this->connections[$name];
+    return $this->dsnes_active[$name];
   }
 
   function setDefaultDbConnection($conn)

Modified: 3.x/trunk/limb/dbal/tests/cases/toolkit/lmbDbToolsTest.class.php
===================================================================
--- 3.x/trunk/limb/dbal/tests/cases/toolkit/lmbDbToolsTest.class.php	2008-05-12 08:57:46 UTC (rev 7008)
+++ 3.x/trunk/limb/dbal/tests/cases/toolkit/lmbDbToolsTest.class.php	2008-05-12 21:27:12 UTC (rev 7009)
@@ -80,13 +80,37 @@
 
   function testSetDbConnectionByName()
   {
-    $connection = $this->tools->createDbConnection(new lmbDbDSN($this->config['dsn']));
-    $another_connection = $this->tools->createDbConnection(new lmbDbDSN($this->config['another_dsn']));
+    $dsn = new lmbDbDSN($this->config['dsn']);
+    $another_dsn = new lmbDbDSN($this->config['another_dsn']);
+    
+    $connection = $this->tools->createDbConnection($dsn);
+    $another_connection = $this->tools->createDbConnection($another_dsn);
 
-    $this->assertEqual($connection, $this->tools->getDefaultDbConnection());
+    $this->assertIdentical($connection, $this->tools->getDbConnectionByName('dsn'));
 
     $this->tools->setDbConnectionByName('dsn', $another_connection);
 
-    $this->assertIdentical($another_connection, $this->tools->getDefaultDbConnection());
+    $this->assertIdentical($another_connection, $this->tools->getDbConnectionByName('dsn'));
+  }  
+  
+  function testGetDbConnectionByDsn()
+  {
+    $connection = $this->tools->createDbConnection(new lmbDbDSN($this->config['another_dsn']));
+    $this->assertIdentical($connection, $this->tools->getDbConnectionByDsn(new lmbDbDSN($this->config['another_dsn'])));
   }
+  
+  function testSetDbConnectionByDsn()
+  {
+    $dsn = new lmbDbDSN($this->config['dsn']);
+    $another_dsn = new lmbDbDSN($this->config['another_dsn']);
+    
+    $connection = $this->tools->createDbConnection($dsn);
+    $another_connection = $this->tools->createDbConnection($another_dsn);
+
+    $this->assertIdentical($connection, $this->tools->getDbConnectionByDsn($dsn));
+
+    $this->tools->setDbConnectionByDsn($dsn, $another_connection);
+
+    $this->assertIdentical($another_connection, $this->tools->getDbConnectionByDsn($dsn));
+  }  
 }



More information about the limb-svn mailing list