Development

/branches/1.4/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineDatabase.class.php

You must first sign up to be able to contribute.

root/branches/1.4/lib/plugins/sfDoctrinePlugin/lib/database/sfDoctrineDatabase.class.php

Revision 28902, 4.7 kB (checked in by Jonathan.Wage, 4 years ago)

[1.3, 1.4] Fixing issue with properly shutting down sfDoctrineDatabase and closing the Doctrine connection (closes #7081)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1 <?php
2
3 /*
4  * This file is part of the symfony package.
5  * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
6  * (c) Jonathan H. Wage <jonwage@gmail.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 /**
13  * A symfony database driver for Doctrine.
14  *
15  * @package    symfony
16  * @subpackage doctrine
17  * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
18  * @author     Jonathan H. Wage <jonwage@gmail.com>
19  * @version    SVN: $Id$
20  */
21 class sfDoctrineDatabase extends sfDatabase
22 {
23   /**
24    * Instance of the Doctrine_Connection for this instance of sfDoctrineDatabase.
25    * Connection can be accessed by the getDoctrineConnection() accessor method.
26    *
27    * @var Doctrine_Connection $_doctrineConnection
28    */
29   protected $_doctrineConnection = null;
30
31   /**
32    * @var sfDoctrineConnectionProfiler
33    **/
34   protected $profiler = null;
35
36   /**
37    * Initialize a sfDoctrineDatabase connection with the given parameters.
38    *
39    * <code>
40    * $parameters = array(
41    *    'name'       => 'doctrine',
42    *    'dsn'        => 'sqlite:////path/to/sqlite/db');
43    *
44    * $p = new sfDoctrineDatabase($parameters);
45    * </code>
46    *
47    * @param array $parameters  Array of parameters used to initialize the database connection
48    * @return void
49    */
50   public function initialize($parameters = array())
51   {
52     parent::initialize($parameters);
53
54     if (null !== $this->_doctrineConnection)
55     {
56       return;
57     }
58
59     $dsn = $this->getParameter('dsn');
60     $name = $this->getParameter('name');
61
62     // Make sure we pass non-PEAR style DSNs as an array
63     if ( !strpos($dsn, '://'))
64     {
65       $dsn = array($dsn, $this->getParameter('username'), $this->getParameter('password'));
66     }
67
68     // Make the Doctrine connection for $dsn and $name
69     $configuration = sfProjectConfiguration::getActive();
70     $dispatcher = $configuration->getEventDispatcher();
71     $manager = Doctrine_Manager::getInstance();
72
73     $this->_doctrineConnection = $manager->openConnection($dsn, $name);
74
75     $attributes = $this->getParameter('attributes', array());
76     foreach ($attributes as $name => $value)
77     {
78       if (is_string($name))
79       {
80         $stringName = $name;
81         $name = constant('Doctrine_Core::ATTR_'.strtoupper($name));
82       }
83
84       if (is_string($value))
85       {
86         $valueConstantName = 'Doctrine_Core::'.strtoupper($stringName).'_'.strtoupper($value);
87         $value = defined($valueConstantName) ? constant($valueConstantName) : $value;
88       }
89
90       $this->_doctrineConnection->setAttribute($name, $value);
91     }
92
93     $encoding = $this->getParameter('encoding', 'UTF8');
94     $eventListener = new sfDoctrineConnectionListener($this->_doctrineConnection, $encoding);
95     $this->_doctrineConnection->addListener($eventListener);
96
97     // Load Query Profiler
98     if ($this->getParameter('profiler', sfConfig::get('sf_debug')))
99     {
100       $this->profiler = new sfDoctrineConnectionProfiler($dispatcher, array(
101         'logging' => $this->getParameter('logging', sfConfig::get('sf_logging_enabled')),
102       ));
103       $this->_doctrineConnection->addListener($this->profiler, 'symfony_profiler');
104     }
105
106     // Invoke the configuration methods for the connection if they exist (deprecated in favor of the "doctrine.configure_connection" event)
107     $method = sprintf('configureDoctrineConnection%s', ucwords($this->_doctrineConnection->getName()));
108
109     if (method_exists($configuration, 'configureDoctrineConnection') && ! method_exists($configuration, $method))
110     {
111       $configuration->configureDoctrineConnection($this->_doctrineConnection);
112     }
113
114     if (method_exists($configuration, $method))
115     {
116       $configuration->$method($this->_doctrineConnection);
117     }
118
119     $dispatcher->notify(new sfEvent($manager, 'doctrine.configure_connection', array('connection' => $this->_doctrineConnection, 'database' => $this)));
120   }
121
122   /**
123    * Get the Doctrine_Connection instance.
124    *
125    * @return Doctrine_Connection $conn
126    */
127   public function getDoctrineConnection()
128   {
129     return $this->_doctrineConnection;
130   }
131
132   /**
133    * Returns the connection profiler.
134    *
135    * @return sfDoctrineConnectionProfiler|null
136    */
137   public function getProfiler()
138   {
139     return $this->profiler;
140   }
141
142   /**
143    * Initializes the connection and sets it to object.
144    *
145    * @return void
146    */
147   public function connect()
148   {
149     $this->connection = $this->_doctrineConnection->getDbh();
150   }
151
152   /**
153    * Execute the shutdown procedure.
154    *
155    * @return void
156    */
157   public function shutdown()
158   {
159     if ($this->connection !== null)
160     {
161       $this->connection = null;
162     }
163     if ($this->_doctrineConnection !== null)
164     {
165       $this->_doctrineConnection->getManager()->closeConnection($this->_doctrineConnection);
166     }
167   }
168 }
Note: See TracBrowser for help on using the browser.