<?php
//****************************************************************************
// phpDbSession 1.0
//****************************************************************************
//      Author: Maxim Poltarak <maxx@e-taller.net>
//****************************************************************************
// The lib is FREEWARE. This means you can use it anywhere you want, you can 
// do anything with it. Author is NOT responsible for any consequences of
// using this library. 
// If you don't agree with this, you SHOULD NOT use the lib.
//****************************************************************************
// All improvings, feature requests, bug reports, etc. are gladly accepted.
//****************************************************************************
// Note: For best viewing of the code Tab size 4 is recommended
//****************************************************************************
// CREATE TABLE sys_sessions (
//   sess_id varchar(32) NOT NULL default '',
//   sess_data mediumtext NOT NULL,
//   sess_created int(10) unsigned NOT NULL default '0',
//   sess_updated int(10) unsigned NOT NULL default '0',
//   sess_persistent tinyint(1) unsigned NOT NULL default '0',
//   usr_id int(10) unsigned NOT NULL default '0',
//   PRIMARY KEY  (sess_id),
//   KEY sess_created (sess_created),
//   KEY sess_updated (sess_updated),
//   KEY sess_persistent (sess_persistent)
// ) TYPE=MyISAM;

if(!defined('IS_INSIDE')) die('Access denied');

define("DBSESSION_TABLE",    "sys_sessions");
    
define("DBSESSION_ID",                "sess_id");
define("DBSESSION_DATA",            "sess_data");
define("DBSESSION_UPDATED",            "sess_updated");
define("DBSESSION_CREATED",            "sess_created");

// Comment out the following two strings to not use 
// the persistent session functionality
define("DBSESSION_PERSISTENT",        "sess_persistent");
define("DBSESSION_PERSIST_TIME",    3600*24*90);

// variables to keep directly in DB fields
// example: array("var1"=>"val1", "var2"=>"val2");
$DBSESSION_AUTOPUT = array();

//*****************************************************************************
function dbsession_open() {
    return 
true;
}

//*****************************************************************************
function dbsession_close() {
    return 
true;
}

//*****************************************************************************
function dbsession_read($id) {
global 
$db;
    
$sql "SELECT * FROM ".DBSESSION_TABLE." WHERE ".DBSESSION_ID."='".$db->escape($id)."' LIMIT 1";
    if(!(
$q $db->query($sql)) || !== $db->num_rows($q) || !($DATA $db->fetch_array($q))) return false;
    return 
$DATA[DBSESSION_DATA];
}

//*****************************************************************************
function dbsession_write($id$sessData) {
global 
$db$DBSESSION_AUTOPUT;

    
$DATA = (is_array($DBSESSION_AUTOPUT)) ? $DBSESSION_AUTOPUT : array();
    
$DATA[DBSESSION_DATA] = $sessData;
    
$DATA[DBSESSION_UPDATED] = TIME_NOW;
    
$sess_sql '';
    foreach(
$DATA as $k => $v$sess_sql .= ", ".$db->escape($k)." = '".$db->escape($v)."'";

    
$sql "UPDATE ".DBSESSION_TABLE." SET ".substr($sess_sql1)." WHERE ".DBSESSION_ID."='".$db->escape($id)."'";
    if(!(
$q $db->query($sql))) return false;
    if(
!== $db->affected_rows($q)) {
        
$DATA[DBSESSION_ID] = $db->escape($id);
        
$DATA[DBSESSION_CREATED] = TIME_NOW;
        
$DATA_SQL = array();
        foreach(
$DATA as $k => $v$DATA_SQL[$db->escape($k)] = $db->escape($v);

        
$sql "INSERT INTO ".DBSESSION_TABLE."(".implode(", "array_keys($DATA_SQL)).") ";
        
$sql .= "VALUES('".implode("', '"array_values($DATA_SQL))."')";
        if(!(
$q $db->query($sql)) || !== $db->affected_rows($q)) return false;
    }
    return 
true;
}

//*****************************************************************************
function dbsession_destroy($id) {
global 
$db$DBSESSION_AUTOPUT;
    
$sql "DELETE FROM ".DBSESSION_TABLE." WHERE ".DBSESSION_ID."='".$db->escape($id)."'";
    if(!(
$q $db->query($sql)) || !== $db->affected_rows($q)) return false;
    return 
true;
}

//*****************************************************************************
function dbsession_gc($maxLifeTime) {
global 
$db;
    if(
$maxLifeTime 1) return true;
    
$sql "DELETE FROM ".DBSESSION_TABLE." ";
    if(
defined("DBSESSION_PERSISTENT")) {
        
$sql .= "WHERE (".DBSESSION_PERSISTENT." = 0 AND ".DBSESSION_UPDATED." < ".(TIME_NOW $maxLifeTime).") ";
        
$sql .= "OR (".DBSESSION_PERSISTENT." = 1 AND ".DBSESSION_UPDATED." < ".(TIME_NOW DBSESSION_PERSIST_TIME).") ";
    } else {
        
$sql .= "WHERE ".DBSESSION_UPDATED." < ".(TIME_NOW $maxLifeTime)." ";
    }
    if(!(
$q $db->query($sql))) return false;
    return 
true;
}

//*****************************************************************************
if(false === ini_set("session.save_handler""user")) die("ini_set(): Can't alter session.save_handler");
session_set_save_handler(
    
"dbsession_open",
    
"dbsession_close",
    
"dbsession_read",
    
"dbsession_write",
    
"dbsession_destroy",
    
"dbsession_gc"
);
?>