<?php

require_once dirname(__FILE__) . '/accesscheck.php';

# try to set the configuration
if (empty($GLOBALS['SessionTableName'])) {
    return;
}

# only necessary on main pages, not in lt/dl etc
if (basename($_SERVER['SCRIPT_NAME']) != 'index.php') {
    return;
}

@ini_set('session.save_handler', 'user');
$SessionTableName = $GLOBALS['SessionTableName'];

if (ini_get('session.save_handler') == 'user') {
    session_set_save_handler(
        'mysql_session_open',
        'mysql_session_close',
        'mysql_session_read',
        'mysql_session_write',
        'mysql_session_destroy',
        'mysql_session_gc'
    );
} else {
    #  @ini_set("session.save_handler","files");
}

if (!Sql_Table_exists($GLOBALS['SessionTableName'])) {
    Sql_Create_Table($GLOBALS['SessionTableName'], array(
        'sessionid' => array('CHAR(32) NOT NULL PRIMARY KEY', ''),
        'lastactive' => array('INTEGER NOT NULL', ''),
        'data' => array('LONGTEXT', ''),
    ));
}

function mysql_session_open($save_path, $session_name)
{
    return true;
}

function mysql_session_close()
{
    return true;
}

function mysql_session_read($SessionID)
{
    #	dbg("Reading session info for $SessionID");
    $SessionTableName = $GLOBALS['SessionTableName'];
    $SessionID = addslashes($SessionID);

    $session_data_req = sql_query("SELECT data FROM $SessionTableName WHERE sessionid = '$SessionID'");
    if (Sql_Affected_Rows() == 1) {
        $data = Sql_Fetch_Row($session_data_req);

        return $data[0];
    } else {
        return false;
    }
}

function mysql_session_write($SessionID, $val)
{
    #	dbg("writing session info for $SessionID");
    $SessionTableName = $GLOBALS['SessionTableName'];
    $SessionID = addslashes($SessionID);
    $val = addslashes($val);

    $SessionExists = sql_fetch_row_query("select count(*) from  $SessionTableName where sessionid = '$SessionID'");
    if ($SessionExists[0] == 0) {
        $retval = sql_query(sprintf('insert into %s (sessionid,lastactive,data) values("%s",UNIX_TIMESTAMP(NOW()),"%s")',
            $SessionTableName, $SessionID, $val));
    } else {
        $retval = sql_query(sprintf('update %s SET data = "%s", lastactive = UNIX_TIMESTAMP(NOW()) where sessionid = "%s"',
            $SessionTableName, $val, $SessionID));
        if (sql_affected_rows() < 0) {
            sendError("unable to update session data for session $SessionID");
        }
    }

    return $retval;
}

function mysql_session_destroy($SessionID)
{
    $SessionTableName = $GLOBALS['SessionTableName'];
    $SessionID = addslashes($SessionID);
    $retval = sql_query("DELETE FROM $SessionTableName WHERE sessionid = '$SessionID'");

    return $retval;
}

function mysql_session_gc($maxlifetime = 300)
{
    $SessionTableName = $GLOBALS['SessionTableName'];
    $CutoffTime = time() - $maxlifetime;
    $retval = sql_query("DELETE FROM $SessionTableName WHERE lastactive < $CutoffTime");

    return $retval;
}
