<?php

/*
 * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
 * Copyright (C) 2002-2009 The Nucleus Group
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * (see nucleus/documentation/index.html#license for more info)
 */
/**
 * @license http://nucleuscms.org/license.txt GNU General Public License
 * @copyright Copyright (C) 2002-2009 The Nucleus Group
 * @version $Id$
 */
 
/*
 * complete sql_* wrappers for mysql functions
 *
 * functions moved from globalfunctions.php: sql_connect, sql_disconnect, sql_query
 */
 

$MYSQL_CONN = 0;
global $SQL_DBH;
$SQL_DBH = NULL;

if (!function_exists('sql_fetch_assoc'))
{
	/**
	 * Errors before the database connection has been made
	 */
	function startUpError($msg, $title) {
		?>
		<html xmlns="http://www.w3.org/1999/xhtml">
			<head><title><?php echo htmlspecialchars($title)?></title></head>
			<body>
				<h1><?php echo htmlspecialchars($title)?></h1>
				<?php echo $msg?>
			</body>
		</html>
		<?php	exit;
	}
	
	/**
	  * Connects to mysql server
	  */
	function sql_connect_args($mysql_host = 'localhost', $mysql_user = '', $mysql_password = '', $mysql_database = '') {
		global $MYSQL_HANDLER;
		
		try {
			if (strpos($mysql_host,':') === false) {
				$host = $mysql_host;
				$port = '';
				$portnum = '';
			}
			else {
				list($host,$port) = explode(":",$mysql_host);
				if (isset($port)) {
					$portnum = $port;
					$port = ';port='.trim($port);
				}
				else {
					$port = '';
					$portnum = '';
				}
			}
			
			switch ($MYSQL_HANDLER[1]) {
				case 'sybase':
				case 'dblib':
					if (is_numeric($portnum)) $port = ':'.intval($portnum);
					else $port = '';
					$DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$mysql_database, $mysql_user, $mysql_password);
				break;
				case 'mssql':
					if (is_numeric($portnum)) $port = ','.intval($portnum);
					else $port = '';
					$DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$mysql_database, $mysql_user, $mysql_password);
				break;
				case 'oci':
					if (is_numeric($portnum)) $port = ':'.intval($portnum);
					else $port = '';
					$DBH = new PDO($MYSQL_HANDLER[1].':dbname=//'.$host.$port.'/'.$mysql_database, $mysql_user, $mysql_password);
				break;
				case 'odbc':
					if (is_numeric($portnum)) $port = ';PORT='.intval($portnum);
					else $port = '';
					$DBH = new PDO($MYSQL_HANDLER[1].':DRIVER={IBM DB2 ODBC DRIVER};HOSTNAME='.$host.$port.';DATABASE='.$mysql_database.';PROTOCOL=TCPIP;UID='.$mysql_user.';PWD='.$mysql_password);

				break;
				case 'pgsql':
					if (is_numeric($portnum)) $port = ';port='.intval($portnum);
					else $port = '';
					$DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$mysql_database, $mysql_user, $mysql_password);
				break;
				case 'sqlite':
				case 'sqlite2':
					if (is_numeric($portnum)) $port = ':'.intval($portnum);
					else $port = '';
					$DBH = new PDO($MYSQL_HANDLER[1].':'.$mysql_database, $mysql_user, $mysql_password);
				break;
				default:
					//mysql
					$DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$mysql_database, $mysql_user, $mysql_password);
				break;
			}
	
			
						
		} catch (PDOException $e) {
			$DBH =NULL;
			startUpError('<p>a1 Error!: ' . $e->getMessage() . '</p>', 'Connect Error');
		}
//echo '<hr />DBH: '.print_r($DBH,true).'<hr />';		
		return $DBH;
	}
	
	/**
	  * Connects to mysql server
	  */
	function sql_connect() {
		global $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD, $MYSQL_DATABASE, $MYSQL_CONN, $MYSQL_HANDLER, $SQL_DBH;
		$SQL_DBH = NULL;
		try {
			if (strpos($MYSQL_HOST,':') === false) {
				$host = $MYSQL_HOST;
				$port = '';
			}
			else {
				list($host,$port) = explode(":",$MYSQL_HOST);
				if (isset($port)) {
					$portnum = $port;
					$port = ';port='.trim($port);
				}
				else {
					$port = '';
					$portnum = '';
				}
			}
			
			switch ($MYSQL_HANDLER[1]) {
				case 'sybase':
				case 'dblib':
					if (is_numeric($portnum)) $port = ':'.intval($portnum);
					else $port = '';
					$SQL_DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$MYSQL_DATABASE, $MYSQL_USER, $MYSQL_PASSWORD);
				break;
				case 'mssql':
					if (is_numeric($portnum)) $port = ','.intval($portnum);
					else $port = '';
					$SQL_DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$MYSQL_DATABASE, $MYSQL_USER, $MYSQL_PASSWORD);
				break;
				case 'oci':
					if (is_numeric($portnum)) $port = ':'.intval($portnum);
					else $port = '';
					$SQL_DBH = new PDO($MYSQL_HANDLER[1].':dbname=//'.$host.$port.'/'.$MYSQL_DATABASE, $MYSQL_USER, $MYSQL_PASSWORD);
				break;
				case 'odbc':
					if (is_numeric($portnum)) $port = ';PORT='.intval($portnum);
					else $port = '';
					$SQL_DBH = new PDO($MYSQL_HANDLER[1].':DRIVER={IBM DB2 ODBC DRIVER};HOSTNAME='.$host.$port.';DATABASE='.$MYSQL_DATABASE.';PROTOCOL=TCPIP;UID='.$MYSQL_USER.';PWD='.$MYSQL_PASSWORD);

				break;
				case 'pgsql':
					if (is_numeric($portnum)) $port = ';port='.intval($portnum);
					else $port = '';
					$SQL_DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$MYSQL_DATABASE, $MYSQL_USER, $MYSQL_PASSWORD);
				break;
				case 'sqlite':
				case 'sqlite2':
					if (is_numeric($portnum)) $port = ':'.intval($portnum);
					else $port = '';
					$SQL_DBH = new PDO($MYSQL_HANDLER[1].':'.$MYSQL_DATABASE, $MYSQL_USER, $MYSQL_PASSWORD);
				break;
				default:
					//mysql
					$SQL_DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$MYSQL_DATABASE, $MYSQL_USER, $MYSQL_PASSWORD);
				break;
			}
			
			//$SQL_DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$MYSQL_DATABASE, $MYSQL_USER, $MYSQL_PASSWORD);
						
		} catch (PDOException $e) {
			$SQL_DBH = NULL;
			startUpError('<p>a2 Error!: ' . $e->getMessage() . '</p>', 'Connect Error');
		}
//		echo '<hr />DBH: '.print_r($SQL_DBH,true).'<hr />';		
		$MYSQL_CONN &= $SQL_DBH;
		return $SQL_DBH;

	}

	/**
	  * disconnects from SQL server
	  */
	function sql_disconnect(&$dbh=NULL) {
		global $SQL_DBH;
		if (is_null($dbh)) $SQL_DBH = NULL;
		else $dbh = NULL;
	}
	
	function sql_close(&$dbh=NULL) {
		global $SQL_DBH;
		if (is_null($dbh)) $SQL_DBH = NULL;
		else $dbh = NULL;
	}
	
	/**
	  * executes an SQL query
	  */
	function sql_query($query,$dbh=NULL) {
		global $SQLCount,$SQL_DBH;
		$SQLCount++;
//echo '<hr />SQL_DBH: ';
//print_r($SQL_DBH);
//echo '<hr />DBH: ';
//print_r($dbh);
//echo '<hr />';
//echo $query.'<hr />';
		if (is_null($dbh)) $res = $SQL_DBH->query($query);
		else $res = $dbh->query($query);
		if ($res->errorCode() != '00000') {
			$errors = $res->errorInfo();
			print("SQL error with query $query: " . $errors[0].'-'.$errors[1].' '.$errors[2] . '<p />');
		}
		
		return $res;
	}
	
	/**
	  * executes an SQL error
	  */
	function sql_error($dbh=NULL)
	{
		global $SQL_DBH;
		if (is_null($dbh)) $error = $SQL_DBH->errorInfo();
		else $error = $dbh->errorInfo();
		if ($error[0] != '00000') {
			return $error[0].'-'.$error[1].' '.$error[2];
		}
		else return '';
	}
	
	/**
	  * executes an SQL db select
	  */
	function sql_select_db($db,&$dbh=NULL)
	{
		global $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD, $MYSQL_DATABASE, $MYSQL_CONN, $MYSQL_HANDLER, $SQL_DBH;
//echo '<hr />'.print_r($dbh,true).'<hr />';
//exit;
		if (is_null($dbh)) { 
			try {
				$SQL_DBH = NULL;
				list($host,$port) = explode(":",$MYSQL_HOST);
				if (isset($port)) {
					$portnum = $port;
					$port = ';port='.trim($port);
				}
				else {
					$port = '';
					$portnum = '';
				}
				//$SQL_DBH = new PDO($MYSQL_HANDLER[1].':host='.trim($host).$port.';dbname='.$db, $MYSQL_USER, $MYSQL_PASSWORD);
				//$SQL_DBH = sql_connect();
				switch ($MYSQL_HANDLER[1]) {
					case 'sybase':
					case 'dblib':
						if (is_numeric($portnum)) $port = ':'.intval($portnum);
						else $port = '';
						$SQL_DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$db, $MYSQL_USER, $MYSQL_PASSWORD);
					break;
					case 'mssql':
						if (is_numeric($portnum)) $port = ','.intval($portnum);
						else $port = '';
						$SQL_DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$db, $MYSQL_USER, $MYSQL_PASSWORD);
					break;
					case 'oci':
						if (is_numeric($portnum)) $port = ':'.intval($portnum);
						else $port = '';
						$SQL_DBH = new PDO($MYSQL_HANDLER[1].':dbname=//'.$host.$port.'/'.$db, $MYSQL_USER, $MYSQL_PASSWORD);
					break;
					case 'odbc':
						if (is_numeric($portnum)) $port = ';PORT='.intval($portnum);
						else $port = '';
						$SQL_DBH = new PDO($MYSQL_HANDLER[1].':DRIVER={IBM DB2 ODBC DRIVER};HOSTNAME='.$host.$port.';DATABASE='.$db.';PROTOCOL=TCPIP;UID='.$MYSQL_USER.';PWD='.$MYSQL_PASSWORD);

					break;
					case 'pgsql':
						if (is_numeric($portnum)) $port = ';port='.intval($portnum);
						else $port = '';
						$SQL_DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$db, $MYSQL_USER, $MYSQL_PASSWORD);
					break;
					case 'sqlite':
					case 'sqlite2':
						if (is_numeric($portnum)) $port = ':'.intval($portnum);
						else $port = '';
						$SQL_DBH = new PDO($MYSQL_HANDLER[1].':'.$db, $MYSQL_USER, $MYSQL_PASSWORD);
					break;
					default:
						//mysql
						$SQL_DBH = new PDO($MYSQL_HANDLER[1].':host='.$host.$port.';dbname='.$db, $MYSQL_USER, $MYSQL_PASSWORD);
					break;
				}
				return 1;
			} catch (PDOException $e) {
				startUpError('<p>a3 Error!: ' . $e->getMessage() . '</p>', 'Connect Error');
				return 0;
			}
		}
		else {
			if ($dbh->exec("USE $db") !== false) return 1;
			else return 0;
		}
	}
	
	/**
	  * executes an SQL real escape 
	  */
	function sql_real_escape_string($val,$dbh=NULL)
	{
		return addslashes($val);
	}
	
	/**
	  * executes an PDO::quote() like escape, ie adds quotes arround the string and escapes chars as needed 
	  */
	function sql_quote_string($val,$dbh=NULL) {
		global $SQL_DBH;
		if (is_null($dbh))
			return $SQL_DBH->quote($val);
		else
			return $dbh->quote($val);
	}
	
	/**
	  * executes an SQL insert id
	  */
	function sql_insert_id($dbh=NULL)
	{	
		global $SQL_DBH;
		if (is_null($dbh))
			return $SQL_DBH->lastInsertId();
		else
			return $dbh->lastInsertId();
	}
	
	/**
	  * executes an SQL result request
	  */
	function sql_result($res, $row = 0, $col = 0)
	{
		$results = array();
		if (intval($row) < 1) {
			$results = $res->fetch(PDO::FETCH_BOTH);
			return $results[$col];
		}
		else {
			for ($i = 0; $i < intval($row); $i++) {
				$results = $res->fetch(PDO::FETCH_BOTH);
			}
			$results = $res->fetch(PDO::FETCH_BOTH);
			return $results[$col];
		}
	}
	
	/**
	  * frees sql result resources
	  */
	function sql_free_result($res)
	{
		$res = NULL;
		return true;
	}
	
	/**
	  * returns number of rows in SQL result
	  */
	function sql_num_rows($res)
	{
		return $res->rowCount();
	}
	
	/**
	  * returns number of rows affected by SQL query
	  */
	function sql_affected_rows($res)
	{
		return $res->rowCount();
	}
	
	/**
	  * Get number of fields in result
	  */
	function sql_num_fields($res)
	{
		return $res->columnCount();
	}
	
	/**
	  * fetches next row of SQL result as an associative array
	  */
	function sql_fetch_assoc($res)
	{
		$results = array();
		$results = $res->fetch(PDO::FETCH_ASSOC);	
		return $results;
	}
	
	/**
	  * Fetch a result row as an associative array, a numeric array, or both
	  */
	function sql_fetch_array($res)
	{
		$results = array();
		$results = $res->fetch(PDO::FETCH_BOTH);
		return $results;
	}
	
	/**
	  * fetches next row of SQL result as an object
	  */
	function sql_fetch_object($res)
	{
		$results = NULL;
		$results = $res->fetchObject();	
		return $results;
	}
	
	/**
	  * Get a result row as an enumerated array
	  */
	function sql_fetch_row($res)
	{
		$results = array();
		$results = $res->fetch(PDO::FETCH_NUM);	
		return $results;
	}
	
	/**
	  * Get column information from a result and return as an object
	  */
	function sql_fetch_field($res,$offset = 0)
	{
		$results = array();
		$obj = NULL;
		$results = $res->getColumnMeta($offset);
		foreach($results as $key=>$value) {
			$obj->$key = $value;
		}
		return $obj;
	}
	
	/**
	  * Get current system status (returns string)
	  */
	function sql_stat($dbh=NULL)
	{
		//not implemented
		global $SQL_DBH;
		if (is_null($dbh))
			return '';
		else
			return '';
	}
	
	/**
	  * Returns the name of the character set
	  */
	function sql_client_encoding($dbh=NULL)
	{
		//not implemented
		global $SQL_DBH;
		if (is_null($dbh))
			return '';
		else
			return '';
	}
	
	/**
	  * Get SQL client version
	  */
	function sql_get_client_info()
	{
		global $SQL_DBH;
		return $SQL_DBH->getAttribute(constant("PDO::ATTR_CLIENT_VERSION"));
	}
	
	/**
	  * Get SQL server version
	  */
	function sql_get_server_info($dbh=NULL)
	{
		global $SQL_DBH;
		if (is_null($dbh))
			return $SQL_DBH->getAttribute(constant("PDO::ATTR_SERVER_VERSION"));
		else
			return $dbh->getAttribute(constant("PDO::ATTR_SERVER_VERSION"));
	}
	
	/**
	  * Returns a string describing the type of SQL connection in use for the connection or FALSE on failure
	  */
	function sql_get_host_info($dbh=NULL)
	{
		global $SQL_DBH;
		if (is_null($dbh))
			return $SQL_DBH->getAttribute(constant("PDO::ATTR_SERVER_INFO"));
		else
			return $dbh->getAttribute(constant("PDO::ATTR_SERVER_INFO"));
	}
	
	/**
	  * Returns the SQL protocol on success, or FALSE on failure. 
	  */
	function sql_get_proto_info($dbh=NULL)
	{
		//not implemented
		global $SQL_DBH;
		if (is_null($dbh))
			return false;
		else
			return false;
	}

    /**
     * Get the name of the specified field in a result
     */
    function sql_field_name($res, $offset = 0)
    {
        $column = $res->getColumnMeta($offset);
        if ($column) {
            return $column['name'];
        }
        return false;
    }

/**************************************************************************
Unimplemented mysql_* functions

# mysql_ data_ seek (maybe useful)
# mysql_ errno (maybe useful)
# mysql_ fetch_ lengths (maybe useful)
# mysql_ field_ flags (maybe useful)
# mysql_ field_ len (maybe useful)
# mysql_ field_ seek (maybe useful)
# mysql_ field_ table (maybe useful)
# mysql_ field_ type (maybe useful)
# mysql_ info (maybe useful)
# mysql_ list_ processes (maybe useful)
# mysql_ ping (maybe useful)
# mysql_ set_ charset (maybe useful, requires php >=5.2.3 and mysql >=5.0.7)
# mysql_ thread_ id (maybe useful)

# mysql_ db_ name (useful only if working on multiple dbs which we do not do)
# mysql_ list_ dbs (useful only if working on multiple dbs which we do not do)

# mysql_ pconnect (probably not useful and could cause some unintended performance issues)
# mysql_ unbuffered_ query (possibly useful, but complicated and not supported by all database drivers (pdo))

# mysql_ change_ user (deprecated)
# mysql_ create_ db (deprecated)
# mysql_ db_ query (deprecated)
# mysql_ drop_ db (deprecated)
# mysql_ escape_ string (deprecated)
# mysql_ list_ fields (deprecated)
# mysql_ list_ tables (deprecated)
# mysql_ tablename (deprecated)

*******************************************************************/

}

?>