Projekt

Obecné

Profil

Stáhnout (3.55 KB) Statistiky
| Větev: | Tag: | Revize:
<?php defined('SYSPATH') or die('No direct script access.');
/**
* Session database driver.
*
* $Id: Database.php 1928 2008-02-05 21:00:14Z PugFish $
*
* @package Core
* @author Kohana Team
* @copyright (c) 2007-2008 Kohana Team
* @license http://kohanaphp.com/license.html
*/
class Session_Database_Driver implements Session_Driver {

/*
CREATE TABLE kohana_session
(
session_id VARCHAR(40) NOT NULL,
last_activity INT(11) NOT NULL,
data TEXT NOT NULL,
PRIMARY KEY (session_id)
);
*/

protected $db;
protected $input;
protected $encrypt;

protected $db_group;
protected $new_session = TRUE;
protected $old_id;

// Session has been written?
protected $written = FALSE;

public function __construct()
{
$this->db_group = Config::item('session.storage');

$this->input = new Input;

// Load Encrypt library
if (Config::item('session.encryption'))
{
$this->encrypt = new Encrypt;
}

// Write the session when PHP shuts down, this stops the database
// being connected to twice when exit is called manually
register_shutdown_function('session_write_close');

Log::add('debug', 'Session Database Driver Initialized');
}

public function open($path, $name)
{
if (Config::item('database.'.$this->db_group) === NULL)
{
// There's no defined group, use the default database
$this->db = new Database;
}
else
{
// Connect to the database using a database group, defined
// by the 'session.storage' config item.
$this->db = new Database($this->db_group);
}

return is_object($this->db);
}

public function close()
{
return TRUE;
}

public function read($id)
{
$query = $this->db->from($this->db_group)->where('session_id', $id)->get()->result(TRUE);

if ($query->count() > 0)
{
// No new session, this is used when writing the data
$this->new_session = FALSE;
return (Config::item('session.encryption')) ? $this->encrypt->decode($query->current()->data) : $query->current()->data;
}

// Return value must be string, NOT a boolean
return '';
}

public function write($id, $data)
{
// Has the session already been written?
if ($this->written)
return TRUE;

$session = array
(
'session_id' => $id,
'last_activity' => time(),
'data' => (Config::item('session.encryption')) ? $this->encrypt->encode($data) : $data
);

// Existing session, with regenerated session id
if ( ! empty($this->old_id))
{
$query = $this->db->update($this->db_group, $session, array('session_id' => $this->old_id));
}
// New session
elseif ($this->new_session)
{
$query = $this->db->insert($this->db_group, $session);
}
// Existing session, without regenerated session id
else
{
// No need to update session_id
unset($session['session_id']);

$query = $this->db->update($this->db_group, $session, array('session_id' => $id));

$this->written = TRUE;
}

return (bool) $query->count();
}

public function destroy($id)
{
return (bool) $this->db->delete($this->db_group, array('session_id' => $id))->count();
}

public function regenerate()
{
// It's wasteful to delete the old session and insert a whole new one so
// we cache the old id to simply update the db with the new one
$this->old_id = session_id();

session_regenerate_id();

// Return new session id
return session_id();
}

public function gc($maxlifetime)
{
$query = $this->db->delete($this->db_group, array('last_activity <' => time() - $maxlifetime));

Log::add('debug', 'Session garbage collected: '.$query->count().' row(s) deleted.');

return TRUE;
}

} // End Session Database Driver
(2-2/2)