<?php

/**
 * Description of Core
 *
 * @author Arkadiusz Rychlik <a.rychlik at eppe.com.pl>
 */
class Rtn_Mssql_Core {

	static $connection;
	static $db_type;
	static $dbc;
	protected $result;

	public function __construct(Zend_Config_Ini $dbc, $db_type) {
		if (!static::$connection || static::$db_type != $db_type) {
			static::$dbc = $dbc;
			$this->connect($db_type);
		}
	}

	public function connect($db_type) {
		static::$connection = mssql_connect(static::$dbc->host . ':' . static::$dbc->port, static::$dbc->username, static::$dbc->password);
		static::$db_type = $db_type;

		if (static::$connection && $this->connectDB(static::$dbc->{$db_type . 'dbname'})) {
			return true;
		}
	}

	public function connectDb($db_name) {
		return mssql_select_db($db_name, static::$connection);
	}

	/**
	 *
	 * @param type $query
	 * @param type $params
	 * @return \Rtn_Mssql
	 */
	public function query($query, $params = array()) {
		$_query = $this->_assembleQuery($query, $params);

		try {
			$result = mssql_query($_query);
		}
		catch (Exception $e) {
			throw new Rtn_Mssql_Exception($e->getMessage(), $e->getCode());
		}

		if (is_bool($result)) {
			return mssql_get_last_message();
		}

		return new Rtn_Mssql_Result($result);
	}

	/**
	 *
	 * @param type $string
	 * @return type
	 */
	public function escapeString($data) {
		$non_displayables = array(
			'/%0[0-8bcef]/', // url encoded 00-08, 11, 12, 14, 15
			'/%1[0-9a-f]/', // url encoded 16-31
			'/[\x00-\x08]/', // 00-08
			'/\x0b/', // 11
			'/\x0c/', // 12
			'/[\x0e-\x1f]/' // 14-31
		);

		foreach ($non_displayables as $regex) {
			$data = preg_replace($regex, '', $data);
		}

		$data = str_replace("'", "''", $data);

		return $data;
	}

	/**
	 * Zwraca ID ostatnio dodanego rekordu
	 * @return type
	 */
	public function lastId() {
		return $this->query('SELECT SCOPE_IDENTITY() AS ins_id')->current()->ins_id;
	}

	/**
	 * Składa w całość zapytanie SQL
	 * @param type $query
	 * @param type $params
	 * @return string
	 */
	protected function _assembleQuery($query, $params) {
		$_query = $query;
		foreach ($params as $search => $replace) {
			$_query = str_replace($search, $replace, $query);
		}
		return $_query;
	}

}
