<?php
/*******************************************************************************
* MUSPA
*
* Copyright (C) 2004 MUSPA Project
*
* Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
* sob os termos da Licença Pública Geral GNU conforme publicada pela Free
* Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
* qualquer versão posterior.
*
* Este programa é distribuído na expectativa de que seja útil, porém, SEM
* NENHUMA GARANTIA; nem mesmo a garantia implícita de COMERCIABILIDADE OU
* ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral do
* GNU para mais detalhes.
*
* Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto com
* este programa; se não, escreva para a Free Software Foundation, Inc., no
* endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
*
*******************************************************************************/
/**
*
* Session Handler
*
*/
class SessionHandler {
/** SQL ID da sessão */
var $iSQLId;
/** DB Object */
var $oDB;
/**
* Constructor
* @param $admin DB Object.
*/
function SessionHandler( &$db )
{
$this->iSQLId = 0;
if (!is_a($db, 'db'))
trigger_error('Parâmetro 0 precisa ser uma instância da classe DB.', E_USER_ERROR);
$this->oDB =& $db;
// Se auto-instala como session handler...
session_set_save_handler( array(&$this, 'open'),
array(&$this, 'close'),
array(&$this, 'read'),
array(&$this, 'write'),
array(&$this, 'destroy'),
array(&$this, 'gc'));
}
/**
* Abre a sessão
*/
function open( $save_path, $session_name )
{
return true;
}
/**
* Fecha a sessão
*/
function close()
{
return true;
}
/**
* Lê os dados da sessão
*/
function read( $id )
{
$this->oDB->query('SELECT id, data FROM '.PRE_TABLE.'sessions WHERE sessid = "'.$id.'"', __FILE__, __LINE__);
if (!$this->oDB->numRows())
return '';
$this->iSQLId = $this->oDB->result(0, 0);
return $this->oDB->result(0, 1);
}
/**
* Escreve os dados da sessão
*/
function write($id, $data)
{
$this->oDB->query('REPLACE INTO '.PRE_TABLE.'sessions SET id="'.$this->iSQLId.'", '
.' sessid="'.$id.'", data="'.$this->oDB->escapeString($data, true).'", time=NOW()',
__FILE__, __LINE__);
return true;
}
/**
* Destroy a sessão
*/
function destroy($id)
{
// Apaga todos os arquivos temporarios desta seção
$dir = opendir(TEMPDIR);
while(($file = readdir($dir)) !== false)
if (strpos($file, 'sess'.$id.'_') === 0)
unlink(TEMPDIR.$file);
closedir($dir);
$this->oDB->query('DELETE FROM '.PRE_TABLE.'sessions WHERE sessid="'.$id.'"',
__FILE__, __LINE__);
return true;
}
/**
* Garbaga collector
*/
function gc( $maxtime )
{
$maxtime = 3600; // Força o tempo mínimo para 1 hora.
// Procura todas as seções expiradas
$this->oDB->query('SELECT sessid FROM '.PRE_TABLE.'sessions WHERE '
.' DATE_SUB( NOW( ) , INTERVAL '.$maxtime.' SECOND ) > time', __FILE__, __LINE__);
if (!$this->oDB->numRows())
return true;
// Para cada seção expirada, apague seus arquivos temporarios
$dir = opendir(TEMPDIR);
while($row = $this->oDB->fetchAssoc())
{
rewinddir($dir);
while(($file = readdir($dir)) !== false)
if (strpos($file, 'sess'.$row['sessid'].'_') === 0)
unlink(TEMPDIR.$file);
}
closedir($dir);
// finalmente... apague as seções expiradas do DB
$this->oDB->query('DELETE FROM '.PRE_TABLE.'sessions WHERE '
.' DATE_SUB( NOW() , INTERVAL '.$maxtime.' SECOND ) > time', __FILE__, __LINE__);
return true;
}
};
/**
* Retorna uma sugestão de nome de arquivo
* Obs.: Talvez esta função devesse ficar dentro da classe SessionHandler.
*/
function sess_CreateFileName( $file )
{
return TEMPDIR.'sess'.session_id().'_'.$file;
}