<?php
class DB_Sql2 {
	var $Host     = "127.0.0.1";
	var $Database = "syshost";
	var $Port     = "5432";
	var $User     = "syshost";
	var $Password = "alfkzmf!?{}";

	var $Link_ID  = 0;
	var $Query_ID = 0;
	var $Record   = array();
	var $Row      = 0;
	
	var $Seq_Table     = "db_sequence";

	var $Errno    = 0;
	var $Error    = "";
	var $Debug    = 0;

	var $Auto_Free = 0; # Set this to 1 for automatic pg_freeresult on 
	# last record.
		var $PConnect  = 0; ## Set to 1 to use persistent database connections

		function ifadd($add, $me) {
			if("" != $add) return " ".$me.$add;
		}

	/* public: constructor */
	function DB_Sql($query = "") {
		$this->query($query);
	}

	function querySafe($string) {
		$string = str_replace("'", "\'", $string);
		$string = str_replace("\\", "\\\\", $string);
		return $string;
	}

	function connect() {
		if ( 0 == $this->Link_ID ) {
			$cstr = "dbname=".$this->Database.
				$this->ifadd($this->Host, "host=").
				$this->ifadd($this->Port, "port=").
				$this->ifadd($this->User, "user=").
				$this->ifadd($this->Password, "password=");
			if(!$this->PConnect) {
				$this->Link_ID = pg_connect($cstr);
			} else {
				$this->Link_ID = pg_pconnect($cstr);
			}
			if (!$this->Link_ID) {
				$this->halt("connect() failed.");
			}
		}
	}

	function close() {
		pg_close($this->Link_ID);
	}

	function query($Query_String) {
		/* No empty queries, please, since PHP4 chokes on them. */
		if ($Query_String == "")
			/* The empty query string is passed on from the constructor,
			 * when calling the class without a query, e.g. in situations
			 * like these: '$db = new DB_Sql_Subclass;'
			 */
			return 0;

		$this->connect();

		if ($this->Debug) 
			printf("<br>Debug: query = %s<br>\n", $Query_String);
		$this->Query_ID = pg_Exec($this->Link_ID, $Query_String);
		$this->Row   = 0;

		$this->Error = pg_ErrorMessage($this->Link_ID);
		$this->Errno = ($this->Error == "")?0:1;
		if (!$this->Query_ID) {
			$this->halt("Invalid SQL: ".$Query_String);
		}

		return $this->Query_ID;
	}

	function beginTrans() {
		return $this->query("begin");
	}
	
	function commitTrans() {
		return $this->query("commit");
	}
	
	function rollbackTrans() {
		return $this->query("rollback");
	}

	function next_record() {
		$this->Record = @pg_fetch_array($this->Query_ID, $this->Row++);

		$this->Error = pg_ErrorMessage($this->Link_ID);
		$this->Errno = ($this->Error == "")?0:1;

		$stat = is_array($this->Record);
		if (!$stat && $this->Auto_Free) {
			pg_freeresult($this->Query_ID);
			$this->Query_ID = 0;
		}
		return $stat;
	}

	function seek($pos) {
		$this->Row = $pos;
	}

	function lock($table, $mode = "write") {
		if ($mode == "write") {
			$result = pg_Exec($this->Link_ID, "lock table $table");
		} else {
			$result = 1;
		}
		return $result;
	}

	function unlock() {
		return pg_Exec($this->Link_ID, "commit");
	}


	/* public: sequence numbers */
	function nextid($seq_name) {
		$this->connect();

		if ($this->lock($this->Seq_Table)) {
			/* get sequence number (locked) and increment */
			$q  = sprintf("select nextid from %s where seq_name = '%s'",
					$this->Seq_Table,
					$seq_name);
			$id  = @pg_Exec($this->Link_ID, $q);
			$res = @pg_Fetch_Array($id, 0);

			/* No current value, make one */
			if (!is_array($res)) {
				$currentid = 0;
				$q = sprintf("insert into %s values('%s', %s)",
						$this->Seq_Table,
						$seq_name,
						$currentid);
				$id = @pg_Exec($this->Link_ID, $q);
			} else {
				$currentid = $res["nextid"];
			}
			$nextid = $currentid + 1;
			$q = sprintf("update %s set nextid = '%s' where seq_name = '%s'",
					$this->Seq_Table,
					$nextid,
					$seq_name);
			$id = @pg_Exec($this->Link_ID, $q);
			$this->unlock();
		} else {
			$this->halt("cannot lock ".$this->Seq_Table." - has it been created?");
			return 0;
		}
		return $nextid;
	}

	function metadata($table="") {
		$count = 0;
		$id    = 0;
		$res   = array();

		if ($table) {
			$this->connect();
			$id = pg_exec($this->Link_ID, "select * from $table");
			if ($id < 0) {
				$this->Error = pg_ErrorMessage($id);
				$this->Errno = 1;
				$this->halt("Metadata query failed.");
			}
		} else {
			$id = $this->Query_ID;
			if (!$id) {
				$this->halt("No query specified.");
			}
		}

		$count = pg_NumFields($id);
		for ($i=0; $i<$count; $i++) {
			$res[$i]["table"] = $table;
			$res[$i]["name"]  = pg_FieldName  ($id, $i);
			$res[$i]["type"]  = pg_FieldType  ($id, $i);
			$res[$i]["len"]   = pg_FieldSize  ($id, $i);
			$res[$i]["flags"] = "";
		}

		if ($table) {
			pg_FreeResult($id);
		}

		return $res;
	}

	function affected_rows() {
		return pg_cmdtuples($this->Query_ID);
	}

	function num_rows() {
		return pg_numrows($this->Query_ID);
	}

	function num_fields() {
		return pg_numfields($this->Query_ID);
	}

	function nf() {
		return $this->num_rows();
	}

	function np() {
		print $this->num_rows();
	}

	function tf($Name) {
		return $this->Record[$Name];
	}
	
	function f($Name) {
		if($this->Record[$Name] == "")
		{
			return;
			//return "&nbsp;";
		}
		else
		{
			return trim($this->Record[$Name]);
			//return $this->Record[$Name];			
		}
	}

	function p($Name) {
		print $this->Record[$Name];
	}

	function halt($msg) {
		printf("</td></tr></table><b>Database error:</b> %s<br>\n", $msg);
		printf("<b>PostgreSQL Error</b>: %s (%s)<br>\n",
				$this->Errno,
				$this->Error);
		die("Session halted.");
	}

	function table_names() {
		$this->query("select relname from pg_class where relkind = 'r' and not relname like 'pg_%'");
		$i=0;
		while ($this->next_record())
		{
			$return[$i]["table_name"]= $this->f(0);
			$return[$i]["tablespace_name"]=$this->Database;
			$return[$i]["database"]=$this->Database;
			$i++;
		}
		return $return;
	}
}

function _query_string($method)
{
	
	$params = $_SERVER['QUERY_STRING'];
	
	if( $method = "POST" )
	{
		if( getenv("REQUEST_METHOD") == "POST" )
		{
			$params = "$HTTP_POST_VARS";
			$params = str_replace("+", "%20", $params);
		}
	}
	return $params;
}

function param_remove($params, $key)  
{
	$str = split("&", $params);
	$str_cnt = sizeof($str);

	for( $i=0; $i < $str_cnt; $i++ )
	{
		$sub_str = split("=", $str[$i]);
		if( $sub_str[0] != $key )
		{
			$qstring .= $str[$i]. "&";
		}
	}		
	if( $qstring != "" )
	{
		$qstring = substr($qstring, 0, strlen($qstring)-1);
	}
	
	return $qstring;
}

function sub_page_navigate( $page, $pagecnt, $preimg, $nextimg, $params )
{	
	$blocknum = (integer)(($page - 1) / 10) + 1;

	$spage = ($blocknum-1) * 10 + 1;
	$epage = $blocknum * 10;
		
	if( $epage > $pagecnt)
	{
		 $epage = $pagecnt;
	}
	
	$cur_url = $_SERVER['PHP_SELF'];	
	
	if($params != "") $params = "&".$params;

	if($spage > 10)				//' ÀÌÀü 10°³
	{
		if($preimg == "")
		{
			printf("<a href='".$cur_url."?page=".($spage-10).$params.">¢¸</a>&nbsp;");
		}else
		{
			printf("<a href=".$cur_url."?page=".($spage-10).$params.">".$preimg."</a>&nbsp;");
		}
	}else
	{
		if($preimg == "")
		{
			printf("¢¸&nbsp;");
		}else
		{
			printf($preimg."&nbsp;");
		}
	}
	
	for($i = $spage; $i <= $epage; $i++)
	{
		if($i == $page)
		{
			printf("&nbsp;<b>".$i."</b>&nbsp;");
		}else
		{
			printf("&nbsp;<a href=".$cur_url."?page=".$i.$params.">".$i."</a>&nbsp;");
		}
	}
	
	if($epage < $pagecnt)
	{
		if($nextimg == "")
		{
			printf("&nbsp;<a href=".$cur_url."?page=".($epage+1).$params.">¢º</a>");
		}else
		{
			printf("&nbsp;<a href=".$cur_url."?page=".($epage+1).$params.">".$nextimg."</a>");
		}
	}else
	{
		if($nextimg == "")
		{
			printf("&nbsp;¢º");
		}else
		{
			printf("&nbsp;".$nextimg);
		}
	}
}
?>
