<?
	//
	// Second Generation Database Library
	//
	// 
	
	class DB {
		var $con = false;
		
		function DB($source_title = "") {
			global $db_sources;
			
			if ($this->con)
				return $this->con;
			
			$source = false;
			
			if (empty($source_title)) {
				foreach ($db_sources as $s) 
					if ($s["is_default"]) 
						$source = $s;
			} else {
				foreach ($db_sources as $s) 
					if ($s["title"] == $source_title) 
						$source = $s;
			}
			
			if (! $source)
				$this->error("Source not found.");

			$c = mysql_pconnect($source["host"], $source["name"],
				$source[""]);
			if ($c == false) {
				$code = mysql_errno();
				$error = mysql_error();
				$this->error("Error connecting: #$code: $error");
				return false;
			}
			mysql_select_db($source["database"], $c);
			$this->con = $c;
			return $c;
		}
		
		function error($txt) {
			die("DB error: " . $txt);
		}
		
		function autoerror($qs) {
			$code = mysql_errno();
			$error = mysql_error($this->con);
			if ($error == "") {
				$this->error("<b>No error message available.</b> (source: $qs)");
			}
			$this->error("<b>Error in query:</b> #$code: $error (source: $qs)");
		}
		
		function debug($txt) {
			return;
		}
		
		function prep() {
			$n = func_num_args();
			if ($n == 0) 
				return;
			$qs = func_get_arg(0);
			if ($n == 1) 
				return $qs;
			$first = func_get_arg(1);
			if (is_array($first)) {
				foreach ($first as $k=>$v) {
					$qs = str_replace("{" . $k . "}", mysql_escape_string($v),
						$qs);
				}
			}
			for ($i = 1; $i <= 9; $i++) {
				if ($i >= $n)
					return $qs;
				
				$v = func_get_arg($i);
				$qs = str_replace("{" . $i . "}", mysql_escape_string($v), $qs);
			}
			return $qs;
		}
		
		function q($qs) {
			$qs = eregi_replace("\/\*autoid:([A-Za-z0-9_]+)\*\/", "null", $qs);
			$qs = str_replace("'{now}'", "now()", $qs);
			$qs = str_replace("{now}", "now()", $qs);
			$this->debug("<b>xquery('$qs', \$c)</b><p>");
			$res = @mysql_query($qs, $this->con);
			if (!$res) {
				$this->autoerror($qs);
			} else {
				return $res;
			}
		}

		function n_results($res) {
			return mysql_num_rows($res);
		}
		
		function n_affected($res) {
			return mysql_affected_rows($this->con);
		}
		
		function one($qs) {
			$res = $this->q($qs);
			if (gettype($res) == "resource") {
				return mysql_fetch_array($res);
			} else {
				return false;
			}
		}
		
		function all($qs, $key_col = false, $val_col = false) {
			$res = $this->q($qs);
			if (gettype($res) == "resource") {
				$rows = array();
				
				while ($a = mysql_fetch_array($res)) {
					// if we specified a key column, we need to
					// key this entry in $rows with the value of 
					// that column. if not, just append it.
					if (! $key_col) {
						$rows[] = $a;
					} else {
						// save the value.
						$key_val = $a[$key_col];
						
						// if we only want a particular column as the value,
						// instead of the entire result, do so.
						if (! $val_col) 
							$rows[$key_val] = $a;
						else
							$rows[$key_val] = $a[$val_col];
					}
				}
				return $rows;
			} else {
				return false;
			}		
		}
		
		function column($qs, $col) {
			$res = $this->q($qs);
			if (gettype($res) == "resource") {
				$row = mysql_fetch_array($res);
				return $row[$col];
			} else {
				return false;
			}			
		}
		
		function insert($qs) {
			$res = $this->q($qs);
			return mysql_insert_id($this->con);
		}
		
		function update($qs) {
			$res = $this->q($qs);
			return mysql_affected_rows($this->con);
		}
	}
?>
