<?php

	if (!function_exists("mysql_connect")) {
		// probably php 7, load shim for it
		require_once("lib/mysql_compat.php");
	}

	class mysql {
		// a 'backport' of my 'static' class in not-as-static form
		// the statistics remain static so they're global just in case this gets used for >1 connection
		static $queries   = 0;
		static $cachehits = 0;
		static $rowsf     = 0;
		static $rowst     = 0;
		static $time      = 0;

		// Query debugging functions for admins
		static $connection_count = 0;
		static $debug_on   = false;
		static $debug_list = array();

		var $cache = array();
		var $connection = NULL;
		var $id = 0;

		public function connect($host,$user,$pass,$persist=false) {
			$start=microtime(true);
			$this->connection = (($persist) ? mysql_pconnect($host,$user,$pass) : mysql_connect($host,$user,$pass));
			$t = microtime(true)-$start;
			$this->id = ++self::$connection_count;
			$this->set_character_encoding("utf8mb4");

			if (self::$debug_on) {
				$b = self::getbacktrace();
				self::$debug_list[] = array($this->id, $b['pfunc'], "$b[file]:$b[line]", "<i>".(($persist)?"Persistent c":"C")."onnection established to mySQL server ($host, $user, using password: ".(($pass!=="") ? "YES" : "NO").")</i>", sprintf("%01.6fs",$t));
			}

			self::$time += $t;
			return $this->connection;
		}

		public function selectdb($dbname)	{
			$start=microtime(true);
			$r = mysql_select_db($dbname, $this->connection);
			self::$time += microtime(true)-$start;
			return $r;
		}

		public function query($query, $usecache = false) {
			if ($usecache && array_key_exists($hash = md5($query), $this->cache)) {
				$start=microtime(true);
				++self::$cachehits;
				@mysql_data_seek($this->cache[$hash], 0);
				$t = microtime(true)-$start;
				if (self::$debug_on) {
					$b = self::getbacktrace();
					self::$debug_list[] = array($this->id, $b['pfunc'], "$b[file]:$b[line]", "<font color=#00dd00>$query</font>", "<font color=#00dd00>".sprintf("%01.6fs",$t)."</font>");
				}
				return $this->cache[$hash];
			}

			$start=microtime(true);
			if($res = mysql_query($query, $this->connection)) {
				++self::$queries;
				if (!is_bool($res))
					self::$rowst += @mysql_num_rows($res);

				if ($usecache) {
					$this->cache[md5($query)] = &$res;
				}
			}
			else {
				// the huge SQL warning text sucks
				$err = str_replace("You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use", "SQL syntax error", mysql_error());
				trigger_error("MySQL error: $err", E_USER_ERROR);
			}

			$t = microtime(true)-$start;
			self::$time += $t;

			if (self::$debug_on) {
				$b = self::getbacktrace();
				$tx = ((!$err) ? $query : "<span style=\"color:#FF0000;border-bottom:1px dotted red;\" title=\"$err\">$query</span>");
				self::$debug_list[] = array($this->id, $b['pfunc'], "$b[file]:$b[line]", $tx, sprintf("%01.6fs",$t));
			}

			return $res;
		}

		public function fetch($result, $flag = MYSQL_BOTH){
			$start=microtime(true);

			if($result && $res=mysql_fetch_array($result, $flag))
					++self::$rowsf;

			self::$time += microtime(true)-$start;
			return $res;
		}

		public function result($result,$row=0,$col=0){
			$start=microtime(true);

			if($result) {
				if (mysql_num_rows($result) < $row+1)
					$res = NULL;
				elseif ($res=@mysql_result($result,$row,$col))
					++self::$rowsf;
			}

			self::$time += microtime(true)-$start;
			return $res;
		}

		public function fetchq($query, $flag = MYSQL_BOTH, $cache = false){
			$res = $this->query($query, $cache);
			$res = $this->fetch($res, $flag);
			return $res;
		}

		public function resultq($query,$row=0,$col=0, $cache = false){
			$res = $this->query($query, $cache);
			$res = $this->result($res,$row,$col);
			return $res;
		}

		public function getmultiresults($query, $key, $wanted, $cache = false) {
			$q = $this->query($query, $cache);
			$ret = array();
			$tmp = array();

			while ($res = @$this->fetch($q, MYSQL_ASSOC))
				$tmp[$res[$key]][] = $res[$wanted];
			foreach ($tmp as $keys => $values)
				$ret[$keys] = implode(",", $values);
			return $ret;
		}

		public function getresultsbykey($query, $key, $wanted, $cache = false) {
			$q = $this->query($query, $cache);
			$ret = array();
			while ($res = @$this->fetch($q, MYSQL_ASSOC))
				$ret[$res[$key]] = $res[$wanted];
			return $ret;
		}

		public function getresults($query, $wanted, $cache = false) {
			$q = $this->query($query, $cache);
			$ret = array();
			while ($res = @$this->fetch($q, MYSQL_ASSOC))
				$ret[] = $res[$wanted];
			return $ret;
		}

		public function getarraybykey($query, $key, $cache = false) {
			$q = $this->query($query, $cache);
			$ret = array();
			while ($res = @$this->fetch($q, MYSQL_ASSOC))
				$ret[$res[$key]] = $res;
			return $ret;
		}

		public function getarray($query, $cache = false) {
			$q = $this->query($query, $cache);
			$ret = array();
			while ($res = @$this->fetch($q, MYSQL_ASSOC))
				$ret[] = $res;
			return $ret;
		}

		public function escape($s) {
			return mysql_real_escape_string($s);
		}


		public function set_character_encoding($s) {
			return mysql_set_charset($s, $this->connection);
		}

		//private function __construct() {}

		// Debugging shit for admins
		public static function debugprinter() {
			global $tccellh, $tccellc, $tccell1, $tccell2, $tblstart, $smallfont, $tblend;
			if (!self::$debug_on) return "";
			$out  = "";
			$out .= "<br>$tblstart<tr>$tccellh colspan=5><b>SQL Debug</b></td><tr>
				$tccellh width=20>&nbsp</td>
				$tccellh width=20>ID</td>
				$tccellh width=300>Function</td>
				$tccellh width=*>Query</td>
				$tccellh width=90>Time</td></tr>";
			foreach(self::$debug_list as $i => $d) {
				$altcell = "tccell" . (($i & 1)+1);
				$cell = $$altcell;
				if ($oldid && $oldid != $d[0])
					$out .= "<tr>$tccellc colspan=5><img src='images/_.gif' height='4' width='1'></td></tr>";
				$oldid = $d[0];
				$out .= "<tr>
					$cell>$i</td>
					$cell>$d[0]</td>
					$cell>$d[1]$smallfont<br>$d[2]</font></td>
					$cell style='white-space: pre-wrap; text-align: left'>$d[3]</td>
					$cell>$d[4]</td></tr>";
			}
			$out .= "$tblend";
			return $out;
		}

		private static function getbacktrace() {
			$backtrace = debug_backtrace();
			for ($i = 1; isset($backtrace[$i]); ++$i) {
				if (substr($backtrace[$i]['file'], -9) !== "mysql.php") {
					if (!($backtrace[$i]['pfunc'] = $backtrace[$i+1]['function']))
						$backtrace[$i]['pfunc'] = "<i>(main)</i>";
					$backtrace[$i]['file'] = str_replace($_SERVER['DOCUMENT_ROOT'], "", $backtrace[$i]['file']);
					return $backtrace[$i];
				}
			}
			return $backtrace[$i-1];
		}
	}
?>
