* @since 2.0 */ class DbDependency extends CacheDependency { /** * @var string the ID of a {@link CDbConnection} application component. Defaults to 'db'. */ public $connectionID = 'db'; /** * @var string the SQL statement whose result is used to determine if the dependency has been changed. * Note, the SQL statement should return back a single value. */ public $sql; /** * @var array parameters (name=>value) to be bound to the SQL statement specified by {@link sql}. * @since 1.1.4 */ public $params; private $_db; /** * Constructor. * @param string $sql the SQL statement whose result is used to determine if the dependency has been changed. */ public function __construct($sql = null) { $this->sql = $sql; } /** * PHP sleep magic method. * This method ensures that the database instance is set null because it contains resource handles. * @return array */ public function __sleep() { $this->_db = null; return array_keys((array)$this); } /** * Generates the data needed to determine if dependency has been changed. * This method returns the value of the global state. * @return mixed the data needed to determine if dependency has been changed. */ protected function generateDependencyData() { if ($this->sql !== null) { $db = $this->getDbConnection(); $command = $db->createCommand($this->sql); if (is_array($this->params)) { foreach ($this->params as $name => $value) { $command->bindValue($name, $value); } } if ($db->queryCachingDuration > 0) { // temporarily disable and re-enable query caching $duration = $db->queryCachingDuration; $db->queryCachingDuration = 0; $result = $command->queryRow(); $db->queryCachingDuration = $duration; } else { $result = $command->queryRow(); } return $result; } else { throw new CException(Yii::t('yii', 'DbDependency.sql cannot be empty.')); } } /** * @return CDbConnection the DB connection instance * @throws CException if {@link connectionID} does not point to a valid application component. */ protected function getDbConnection() { if ($this->_db !== null) { return $this->_db; } else { if (($this->_db = \Yii::$application->getComponent($this->connectionID)) instanceof CDbConnection) { return $this->_db; } else { throw new CException(Yii::t('yii', 'DbDependency.connectionID "{id}" is invalid. Please make sure it refers to the ID of a CDbConnection application component.', array('{id}' => $this->connectionID))); } } } }