| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 | 
							- <?php
 
- class LtDbHandle
 
- {
 
- 	public $configHandle;
 
- 	public $group;
 
- 	public $node;
 
- 	public $role = "master";
 
- 	public $connectionAdapter;
 
- 	public $connectionResource;
 
- 	public $sqlAdapter;
 
- 	protected $connectionManager;
 
- 	private $servers;
 
- 	public function __construct()
 
- 	{
 
- 	}
 
- 	public function init()
 
- 	{
 
- 		if(empty($this->servers))
 
- 		{
 
- 			$this->servers = $this->configHandle->get("db.servers");
 
- 		}
 
- 		$this->connectionManager = new LtDbConnectionManager;
 
- 		$this->connectionManager->configHandle = $this->configHandle;
 
- 		$this->sqlAdapter = $this->getCurrentSqlAdapter();
 
- 		$connectionInfo = $this->connectionManager->getConnection($this->group, $this->node, $this->role);
 
- 		$this->connectionAdapter = $connectionInfo["connectionAdapter"];
 
- 		$this->connectionResource = $connectionInfo["connectionResource"];
 
- 	}
 
- 	/**
 
- 	 * Trancaction methods
 
- 	 */
 
- 	public function beginTransaction()
 
- 	{
 
- 		return $this->connectionAdapter->exec($this->sqlAdapter->beginTransaction(), $this->connectionResource);
 
- 	}
 
- 	public function commit()
 
- 	{
 
- 		return $this->connectionAdapter->exec($this->sqlAdapter->commit(), $this->connectionResource);
 
- 	}
 
- 	public function rollBack()
 
- 	{
 
- 		return $this->connectionAdapter->exec($this->sqlAdapter->rollBack(), $this->connectionResource);
 
- 	}
 
- 	/**
 
- 	 * Execute an sql query
 
- 	 * 
 
- 	 * @param  $sql 
 
- 	 * @param  $bind 
 
- 	 * @param  $forceUseMaster 
 
- 	 * @return false on query failed
 
- 	 *           --sql type--                         --return value--
 
- 	 *           SELECT, SHOW, DESECRIBE, EXPLAIN     rowset or NULL when no record found
 
- 	 *           INSERT                               the ID generated for an AUTO_INCREMENT column
 
- 	 *           UPDATE, DELETE, REPLACE              affected count
 
- 	 *           USE, DROP, ALTER, CREATE, SET etc    true
 
- 	 * @notice 每次只能执行一条SQL
 
- 	 *           不要通过此接口执行USE DATABASE, SET NAMES这样的语句
 
- 	 */
 
- 	public function query($sql, $bind = null, $forceUseMaster = false)
 
- 	{
 
- 		$sql = trim($sql);
 
- 		if (empty($sql))
 
- 		{
 
- 			trigger_error('Empty the SQL statement');
 
- 		}
 
- 		$queryType = $this->sqlAdapter->detectQueryType($sql);
 
- 		switch ($queryType)
 
- 		{
 
- 			case "SELECT":
 
- 				if (!$forceUseMaster && isset($this->servers[$this->group][$this->node]["slave"]))
 
- 				{
 
- 					$this->role = "slave";
 
- 				}
 
- 				$queryMethod = "select";
 
- 				break;
 
- 			case "INSERT":
 
- 				$this->role = "master";
 
- 				$queryMethod = "insert";
 
- 				break;
 
- 			case "CHANGE_ROWS":
 
- 				$this->role = "master";
 
- 				$queryMethod = "changeRows";
 
- 				break;
 
- 			case "SET_SESSION_VAR":
 
- 				$queryMethod = "setSessionVar";
 
- 				break;
 
- 			case "OTHER":
 
- 			default:
 
- 				$this->role = "master";
 
- 				$queryMethod = "other";
 
- 				break;
 
- 		}
 
- 		$connectionInfo = $this->connectionManager->getConnection($this->group, $this->node, $this->role);
 
- 		$this->connectionAdapter = $connectionInfo["connectionAdapter"];
 
- 		$this->connectionResource = $connectionInfo["connectionResource"];
 
- 		if (is_array($bind) && 0 < count($bind))
 
- 		{
 
- 			$sql = $this->bindParameter($sql, $bind);
 
- 		}
 
- 		return $this->$queryMethod($sql, $this->connectionResource);
 
- 	}
 
- 	/**
 
- 	 * function posted by renlu
 
- 	 */
 
- 	public function escape($str)
 
- 	{
 
- 		return $this->connectionAdapter->escape($str, $this->connectionResource);
 
- 	}
 
- 	/**
 
- 	 * function posted by renlu
 
- 	 */
 
- 	public function insertid()
 
- 	{
 
- 		return $this->connectionAdapter->lastInsertId($this->connectionResource);
 
- 	}
 
- 	/**
 
- 	 * Generate complete sql from sql template (with placeholder) and parameter
 
- 	 * 
 
- 	 * @param  $sql 
 
- 	 * @param  $parameter 
 
- 	 * @return string 
 
- 	 * @todo 兼容pgsql等其它数据库,pgsql的某些数据类型不接受单引号引起来的值
 
- 	 */
 
- 	public function bindParameter($sql, $parameter)
 
- 	{ 
 
- 		// 注意替换结果尾部加一个空格
 
- 		$sql = preg_replace("/:([a-zA-Z0-9_\-\x7f-\xff][a-zA-Z0-9_\-\x7f-\xff]*)\s*([,\)]?)/", "\x01\x02\x03\\1\x01\x02\x03\\2 ", $sql);
 
- 		foreach($parameter as $key => $value)
 
- 		{
 
- 			$find[] = "\x01\x02\x03$key\x01\x02\x03";
 
- 			if ($value instanceof LtDbSqlExpression)
 
- 			{
 
- 				$replacement[] = $value->__toString();
 
- 			}
 
- 			else
 
- 			{
 
- 				$replacement[] = "'" . $this->connectionAdapter->escape($value, $this->connectionResource) . "'";
 
- 			}
 
- 		}
 
- 		$sql = str_replace($find, $replacement, $sql);
 
- 		return $sql;
 
- 	}
 
- 	protected function getCurrentSqlAdapter()
 
- 	{
 
- 		$factory = new LtDbAdapterFactory;
 
- 		$host = key($this->servers[$this->group][$this->node][$this->role]);
 
- 		return $factory->getSqlAdapter($this->servers[$this->group][$this->node][$this->role][$host]["sql_adapter"]);
 
- 	}
 
- 	protected function select($sql, $connResource)
 
- 	{
 
- 		$result = $this->connectionAdapter->query($sql, $connResource);
 
- 		if (empty($result))
 
- 		{
 
- 			return null;
 
- 		}
 
- 		else
 
- 		{
 
- 			return $result;
 
- 		}
 
- 	}
 
- 	protected function insert($sql, $connResource)
 
- 	{
 
- 		if ($result = $this->connectionAdapter->exec($sql, $connResource))
 
- 		{
 
- 			return $this->connectionAdapter->lastInsertId($connResource);
 
- 		}
 
- 		else
 
- 		{
 
- 			return $result;
 
- 		}
 
- 	}
 
- 	protected function changeRows($sql, $connResource)
 
- 	{
 
- 		return $this->connectionAdapter->exec($sql, $connResource);
 
- 	}
 
- 	/**
 
- 	 * 
 
- 	 * @todo 更新连接缓存
 
- 	 */
 
- 	protected function setSessionVar($sql, $connResource)
 
- 	{
 
- 		return false === $this->connectionAdapter->exec($sql, $connResource) ? false : true;
 
- 	}
 
- 	protected function other($sql, $connResource)
 
- 	{
 
- 		return false === $this->connectionAdapter->exec($sql, $connResource) ? false : true;
 
- 	}
 
- }
 
 
  |