<?php

/* Brevno - web statistics collection tool.
   Author: Grigory Rubtsov [rgbeast], rgbeast@sqlinfo.ru
   For description and installation instructions (in Russian) see
	   http://webew.ru/articles/748.webew

   This code is a public domain.
*/

class brevno {
	private $GET_PARAMS = array('id','pid','p'); // GET parameters to track
	private $COOKIE_NAME = 'BREVNOID';
	private $COOKIE_DOMAIN = '.example.ru';
	private $TABLE_PREFIX = 'brevno_';
	
	public $sessionid;
	public $referer;
	
	function __construct() {
	  if($this->init_session()) {
		 $this->log_event();
	  }
	}
	
	function init_session() {
		if(isset($_COOKIE[$this->COOKIE_NAME])) {
			$uuid = mysql_real_escape_string($_COOKIE[$this->COOKIE_NAME]);
			$sql = "SELECT id,referer FROM " . $this->TABLE_PREFIX
				. "sessions WHERE uuid='$uuid'";
			$result = mysql_q($sql);
			if($row = mysql_fetch_assoc($result)) {
				$this->referer = $row['referer'];
				return ($this->sessionid = $row['id']);
			}
			else {
				return $this->create_session();
			}
				
		}
		else {
			return $this->create_session();
		}
	}
	
	function create_session() {
		$uuid = $this->uuid();
		$ip = mysql_real_escape_string($this->ip());
		$useragent = mysql_real_escape_string(
			isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:'');
		$this->referer =
			isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:'';
		$referer = mysql_real_escape_string($this->referer);
		$sql = "INSERT INTO " . $this->TABLE_PREFIX . "sessions
			(uuid, ipnum, useragent, referer)	
			VALUES ('$uuid', INET_ATON('$ip'),		'$useragent', '$referer')";
		mysql_q($sql);
		if($this->sessionid = mysql_insert_id()) {
			$expires = time() + 3*365*24*3600;
			setcookie($this->COOKIE_NAME, $uuid,
			 	$expires, '/', $this->COOKIE_DOMAIN);
		}
		return $this->sessionid;		
	}
	
	function log_event() {
		$host = strtolower(isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:'');
		$host = preg_replace('/^www\./', '', $host);
		$uri = reset(explode('?', $_SERVER['REQUEST_URI']));
		$params = array();
		foreach($this->GET_PARAMS as $k) {
			if(isset($_GET[$k])) {
				$params[] = urlencode($k) . '=' . urlencode($_GET[$k]);
			}
		}
		if($params) {
			$uri .= "?" . implode('&', $params);
		}
		$uri = mysql_real_escape_string($uri);
		$host = mysql_real_escape_string($host);
		$method = mysql_real_escape_string( strtoupper(
			isset($_SERVER['REQUEST_METHOD'])?$_SERVER['REQUEST_METHOD']:''));
		$sql = "SELECT id FROM " . $this->TABLE_PREFIX . "pages
			WHERE uri='$uri' AND host='$host' AND method='$method'";
		$result = mysql_q($sql);
		if($row = mysql_fetch_assoc($result)) {
			$pageid = $row['id']; 
		}
		else {
			$sql = "INSERT INTO " . $this->TABLE_PREFIX . "pages
			(uri, host, method) VALUES ('$uri','$host','$method')";
			mysql_q($sql);
			$pageid = mysql_insert_id();
		}
		$ip = mysql_real_escape_string($this->ip());
		$sql = "INSERT INTO " . $this->TABLE_PREFIX . "access
			(sessionid, pageid, ipnum, userid) VALUES
			('" . $this->sessionid . "',
			'$pageid',INET_ATON('$ip'), @userid)";
		return mysql_q($sql);
	}
	
	function uuid() {
		$result = mysql_q('SELECT UUID()');
		return reset(mysql_fetch_row($result));
	}
	
	function ip() { 	// may be replaced with smth more sophisticated
		return isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:'';
	}
}

function mysql_q($sql)
{
  $result = mysql_query($sql) or die(mysql_error()."<br/><b>SQL=$sql</b>");
  return $result;
}

?>
