<?php defined('SYSPATH') or die('No direct access allowed.');

/**
 * TSM database connection.
 *
 * @package    PTA
 * @subpackage TSM
 * @category   Drivers
 * @author     Deon George
 * @copyright  (c) 2010 phpTSMadmin Development Team
 * @license    http://phptsmadmin.sf.net/license.html
 */
abstract class Database_TSM extends Database {
	// Database in use by each connection
	protected static $_current_databases = array();

	// Use SET NAMES to set the character set
	protected static $_set_names;

	// Identifier for this connection within the PHP driver
	protected $_connection_id;

	// TSM does not use a backtick for identifiers
	protected $_identifier = '';

	// Our TSM Message Format
	protected $msg_format = '[A-Z]{3}[0-9]{4}[I|E|W|S]';

	// Our Message Codes stored in the last query
	protected $_query_msg_codes = array();

	// Our return code error messages we can ignore
	protected $ignore_codes = array(
		'ANS8001I', // Return code %s.
	);
	// Our return code error messages we can ignore
	protected $nodata_codes = array(
		'ANR2034E', // SELECT: No match found using this criteria.
	);

	protected $execute_stdout = '';
	protected $execute_stderr = '';
	protected $execute_rc = NULL;

	// Our required abstract methods
	public function begin($mode = NULL) {}
	public function commit() {}
	public function rollback() {}
	public function set_charset($charset) {}
	public function list_tables($like = NULL) {}

	// Required methods
	abstract protected function execute($sql);

	/**
	 * Return the caching defined in the current configuration.
	 *
	 *     $cache_time = $db->caching("table");
	 *
	 * @return  string
	 */
	public function caching($table) {
		return ($this->_config['caching'] AND isset($this->_config['cache'][$table])) ? $this->_config['cache'][$table] : FALSE;
	}

	private function clear() {
		$this->_query_msg_codes = array();
	}

	public function query($type, $sql, $as_object = FALSE, array $params = NULL) {
		// Make sure the database is connected
		if (! $this->_connection && ! $this->connect())
			return new Database_TSM_Result(array(),'',$as_object,$params);

		$this->clear();

		if ( ! empty($this->_config['profiling']))
			// Benchmark this query for the current instance
			$benchmark = Profiler::start("Database ({$this->_instance})", $sql);

		// Execute the query
		$result = $this->execute($sql);

		if ($this->execute_stderr AND $this->execute_rc) {
			// This benchmark is worthless
			if (isset($benchmark))
				Profiler::delete($benchmark);

			SystemMessage::TSM('error',sprintf('%s (%s)',$this->execute_stdout,$this->execute_stderr),$sql);
		}

		if (isset($benchmark))
			Profiler::stop($benchmark);

		// Set the last query
		$this->last_query = $sql;

		if ($type === Database::SELECT)
			// Return an iterator of results
			return new Database_TSM_Result($result, $sql, $as_object, $params);
		elseif ($type === Database::INSERT)
			throw new Kohana_Exception('Database INSERTS are not supported');
		elseif ($type === Database::SHOW)
			return new Database_TSM_Show($result, $sql, $as_object, $params);
		elseif ($type === Database::SET)
			return new Database_TSM_Set($result, $sql, $as_object, $params);
	}

	public function escape($value) {
		// SQL standard is to use single-quotes for all values
		return "'$value'";
	}
}
?>
