<?php /** * @package Joomla.Platform * @subpackage Database * * @copyright Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE */ defined('JPATH_PLATFORM') or die; /** * Session table * * @package Joomla.Platform * @subpackage Table * @since 11.1 */ class JTableSession extends JTable { /** * Constructor * * @param database &$db A database connector object * * @return JTableSession * * @since 11.1 */ function __construct(&$db) { parent::__construct('#__session', 'session_id', $db); $this->guest = 1; $this->username = ''; } /** * Insert a session * * @param string $sessionId The session id * @param integer $clientId The id of the client application * * @return boolean True on success * * @since 11.1 */ function insert($sessionId, $clientId) { $this->session_id = $sessionId; $this->client_id = $clientId; $this->time = time(); $ret = $this->_db->insertObject($this->_tbl, $this, 'session_id'); if (!$ret) { $this->setError(JText::sprintf('JLIB_DATABASE_ERROR_STORE_FAILED', strtolower(get_class($this)), $this->_db->stderr())); return false; } else { return true; } } /** * Updates the session * * @param boolean $updateNulls True to update fields even if they are null. * * @return boolean True on successs. * * @since 11.1 */ function update($updateNulls = false) { $this->time = time(); $ret = $this->_db->updateObject($this->_tbl, $this, 'session_id', $updateNulls); if (!$ret) { $this->setError(JText::sprintf('JLIB_DATABASE_ERROR_STORE_FAILED', strtolower(get_class($this)), $this->_db->stderr())); return false; } else { return true; } } /** * Destroys the pesisting session * * @param integer $userId Identifier of the user for this session. * @param integer $clientIds Array of client ids for which session(s) * will be destroyed * * @return boolean True on successs. * * @since 11.1 */ function destroy($userId, $clientIds = array()) { $clientIds = implode(',', $clientIds); $query = 'DELETE FROM #__session' . ' WHERE userid = '. $this->_db->Quote($userId) . ' AND client_id IN ('.$clientIds.')' ; $this->_db->setQuery($query); if (!$this->_db->query()) { $this->setError($this->_db->stderr()); return false; } return true; } /** * Purge old sessions * * @param integer $maxLifetime Session age in seconds * * @return mixed Resource on success, null on fail * * @since 11.1 */ function purge($maxLifetime = 1440) { $past = time() - $maxLifetime; $query = 'DELETE FROM '. $this->_tbl .' WHERE (time < \''. (int) $past .'\')'; // Index on 'VARCHAR' $this->_db->setQuery($query); return $this->_db->query(); } /** * Find out if a user has a one or more active sessions * * @param integer $userid The identifier of the user * * @return boolean True if a session for this user exists * * @since 11.1 */ function exists($userid) { $query = 'SELECT COUNT(userid) FROM #__session' . ' WHERE userid = '. $this->_db->Quote($userid); $this->_db->setQuery($query); if (!$result = $this->_db->loadResult()) { $this->setError($this->_db->stderr()); return false; } return (boolean) $result; } /** * Overloaded delete method * * We must override it because of the non-integer primary key * * @return mixed True if successful otherwise an error message * * @since 11.1 */ function delete($oid=null) { //if (!$this->canDelete($msg)) //{ // return $msg; //} $k = $this->_tbl_key; if ($oid) { $this->$k = $oid; } $query = 'DELETE FROM '.$this->_db->quoteName($this->_tbl). ' WHERE '.$this->_tbl_key.' = '. $this->_db->Quote($this->$k); $this->_db->setQuery($query); if ($this->_db->query()) { return true; } else { $this->setError($this->_db->getErrorMsg()); return false; } } }