Вход Регистрация
Файл: framework/base/CDbStatePersister.php
Строк: 179
<?php
/**
 * CDbStatePersister class file.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @link http://www.yiiframework.com/
 * @copyright 2008-2013 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 * @package system.base
 * @since 1.1.17
 */

/**
 * CDbStatePersister implements a database persistent data storage.
 *
 * It can be used to keep data available through multiple requests and sessions.
 *
 * By default, CDbStatePersister stores data in a table named 'state'.
 * You may change the location by setting the {@link stateTableName} property.
 *
 * To retrieve the data from CDbStatePersister, call {@link load()}. To save the data,
 * call {@link save()}.
 *
 * Comparison among state persister, session and cache is as follows:
 * <ul>
 * <li>session: data persisting within a single user session.</li>
 * <li>state persister: data persisting through all requests/sessions (e.g. hit counter).</li>
 * <li>cache: volatile and fast storage. It may be used as storage medium for session or state persister.</li>
 * </ul>
 *
 * @package system.base
 * @since 1.1.17
 */
class CDbStatePersister extends CApplicationComponent implements IStatePersister
{
    
/**
     * @var string the database table name storing the state data. Make sure the table
     * exists or database user is granted to CREATE tables.
     */
    
public $stateTableName='state';
    
/**
     * @var string connection ID
     */
    
public $dbComponent='db';
    
/**
     * @var CDbConnection instance
     */
    
public $db;
    
/**
     * @var string Column name for value-field
     */
    
public $valueField='value';
    
/**
     * @var string Column name for key-field
     */
    
public $keyField='key';


    
/**
     * Initializes the component.
     * This method overrides the parent implementation by making sure {@link stateFile}
     * contains valid value.
     */
    
public function init()
    {
        
parent::init();
        if(
$this->stateTableName===null)
            throw new 
CException(Yii::t('yii''stateTableName param cannot be null.'));
        
$this->db=Yii::app()->getComponent($this->dbComponent);
        if(
$this->db===null)
            throw new 
CException(Yii::t('yii'''{db}' component doesn't exist.',array(
                '
{db}'=>$this->dbComponent
            )));
        if(!($this->db instanceof CDbConnection))
            throw new CException(Yii::t ('
yii', ''{db}' component is not a valid CDbConnection instance.',array(
                '
{db}'=>$this->dbComponent
            )));
        if($this->db->schema->getTable($this->stateTableName,true)===null)
            $this->createTable();
    }

    /**
     * Loads state data from persistent storage.
     * @return mixed state data. Null if no state data available.
     */
    public function load()
    {
        $command=$this->db->createCommand();
        $command=$command->select($this->valueField)->from($this->stateTableName);
        $command=$command->where($this->db->quoteColumnName($this->keyField).'
=:key',array(
            '
:key'=>Yii::app()->name
        ));
        $state=$command->queryScalar();
        if(false!==$state)
            return unserialize($state);
        else
            return null;
    }

    /**
     * Saves application state in persistent storage.
     * @param mixed $state state data (must be serializable).
     * @return int
     */
    public function save($state)
    {
        $command=$this->db->createCommand();
        if(false===$this->exists())
            return $command->insert($this->stateTableName,array(
                $this->keyField=>Yii::app()->name,
                $this->valueField=>serialize($state)
            ));
        else
            return $command->update($this->stateTableName,array($this->valueField=>serialize($state)),
                $this->db->quoteColumnName($this->keyField).'
=:key',
                array('
:key'=>Yii::app()->name)
        );
    }

    /**
     * @return mixed
     */
    public function exists()
    {
        $command=$this->db->createCommand();
        $command=$command->select($this->keyField)->from($this->stateTableName);
        $command=$command->where($this->db->quoteColumnName($this->keyField).'
=:key',array(
            '
:key'=>Yii::app()->name
        ));
        return $command->queryScalar();
    }

    /**
     * Creates state persister table
     * @throws CException
     */
    protected function createTable()
    {
        try
        {
            $command=$this->db->createCommand();
            $command->createTable($this->stateTableName,array(
                $this->keyField=>'
string NOT NULL',
                $this->valueField=>'
text NOT NULL',
                '
PRIMARY KEY ('.$this->db->quoteColumnName($this->keyField).')'
            ));
        }
        catch (CDbException $e)
        {
            throw new CException(Yii::t('
yii','Can't create state persister table. Check CREATE privilege for '{db}' connection user or create table manually with SQL: {sql}.',array('{db}'=>$this->dbComponent,'{sql}'=>$command->text ) ) );
        }
    }
}
Онлайн: 2
Реклама