<?php
require_once 'lib/core/lib/TikiDb.php';

class TikiDb_MasterSlaveDispatch extends TikiDb
{
	private $master;
	private $slave;

	private $lastUsed;

	function __construct( TikiDb $master, TikiDb $slave ) {
		$this->master = $master;
		$this->slave = $slave;
		$this->lastUsed = $slave;
	}

	function startTimer() // {{{
	{
		$this->getApplicable()->startTimer();
	} // }}}

	function stopTimer($starttime) // {{{
	{
		$this->getApplicable()->stopTimer($starttime);
	} // }}}

	function qstr( $str ) // {{{
	{
		return $this->getApplicable()->qstr( $str );
	} // }}}

	function query( $query = null, $values = null, $numrows = -1, $offset = -1, $reporterrors = true ) // {{{
	{
		return $this->getApplicable( $query )->query( $query, $values, $numrows, $offset, $reporterrors );
	} // }}}

	function queryError( $query, &$error, $values = null, $numrows = -1, $offset = -1 ) // {{{
	{
		return $this->getApplicable( $query )->queryError( $query, $error, $values, $numrows, $offset );
	} // }}}

	function getOne( $query, $values = null, $reporterrors = true, $offset = 0 ) // {{{
	{
		return $this->getApplicable( $query )->getOne( $query, $values, $reporterrors, $offset );
	} // }}}

	function setErrorHandler( TikiDb_ErrorHandler $handler ) // {{{
	{
		$this->getApplicable()->setErrorHandler( $handler );
	} // }}}

	function setTablePrefix( $prefix ) // {{{
	{
		$this->getApplicable()->setTablePrefix( $prefix );
	} // }}}

	function setUsersTablePrefix( $prefix ) // {{{
	{
		$this->getApplicable()->setUsersTablePrefix( $prefix );
	} // }}}

	function getServerType() // {{{
	{
		return $this->getApplicable()->getServerType();
	} // }}}

	function setServerType( $type ) // {{{
	{
		$this->getApplicable()->setServerType( $type );
	} // }}}

	function getErrorMessage() // {{{
	{
		return $this->lastUsed->getErrorMessage();
	} // }}}

	protected function setErrorMessage( $message ) // {{{
	{
		$this->getApplicable()->setErrorMessage( $message );
	} // }}}

	protected function handleQueryError( $query, $values, $result ) // {{{
	{
		$this->getApplicable()->handleQueryError( $query, $values, $result );
	} // }}}

	protected function convertQuery( &$query ) // {{{
	{
		$this->getApplicable( $query )->convertQuery( $query );
	} // }}}

	protected function convertQueryTablePrefixes( &$query ) // {{{
	{
		$this->getApplicable( $query )->convertQueryTablePrefixes( $query );
	} // }}}

	function convertSortMode( $sort_mode ) // {{{
	{
		return $this->getApplicable()->convertSortMode( $sort_mode );
	} // }}}

	function convertBinary() // {{{
	{
		return $this->getApplicable()->convertBinary();
	} // }}}
	
	function cast( $var,$type ) // {{{
	{
		return $this->getApplicable()->cast( $var, $type );
	} // }}}

	function getQuery() // {{{
	{
		return $this->getApplicable()->getQuery();
	} // }}}

	function setQuery( $sql ) // {{{
	{
		return $this->getApplicable()->setQuery( $sql );
	} // }}}

	function ifNull( $field, $ifNull ) // {{{
	{
		return $this->getApplicable()->ifNull( $field, $ifNull );
	} // }}}

	function in( $field, $values, &$bindvars ) // {{{
	{
		return $this->getApplicable()->in( $field, $values, $bindvars );
	} // }}}

	function concat() // {{{
	{
		$arr = func_get_args();
		return call_user_func_array( array( $this->getApplicable(), 'concat' ), $arr );
	} // }}}

	private function getApplicable( $query = '' ) {
		if( empty( $query ) ) {
			return $this->lastUsed = $this->slave;
		}

		// If it's a write
		// regex is for things starting with select in any case with potential
		// whitespace in front of it
		if (!preg_match('/^\s*select/i', $query)) {
			return $this->lastUsed = $this->master;
		}

		return $this->lastUsed = $this->slave;
	}
}
