Blame view

framework/class/slave.db.class.php 2.84 KB
4d84a934   曹明   初始代码提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?php
/**
 * [WeEngine System] Copyright (c) 2014 WE7.CC
 * WeEngine is NOT a free software, it under the license terms, visited http://www.we7.cc/ for more details.
 */
defined('IN_IA') or exit('Access Denied');
load()->classs('db');

class SlaveDb extends DB {
	private $weight;
	private $slavequery = 0;
	private $slaveid = null;

	public function prepare($sql) {
		$this->init_connect($sql);
		return parent::prepare($sql);
	}
	
	public function query($sql, $params = array()) {
		$starttime = microtime();
		if (!empty($params)) {
			return parent::query($sql, $params);
		}
		$this->init_connect($sql);
		$result = $this->pdo->exec($sql);
		if(PDO_DEBUG) {
			$info = array();
			$info['sql'] = $sql;
			$info['error'] = $this->pdo->errorInfo();
			$this->debug(false, $info);
		}
		return $result;
	}
	
	public function slave_connect() {
		$this->slave_choose();
		if($this->slaveid) {
			if(!isset($this->link[$this->slaveid])) {
				$this->connect($this->slaveid);
			}
			$this->slavequery ++;
			$this->pdo = $this->link[$this->slaveid];
		}
		return true;
	}

	protected function slave_choose(){
		if(!isset($this->weight)) {
			foreach ($this->cfg['slave'] as $key => $value) {
				$this->weight .= str_repeat($key, 1 + intval($value['weight']));
			}
		}
		$sid = $this->weight[mt_rand(0, strlen($this->weight) -1)];
		$this->slaveid = 'slave_' . $sid;
		if(!isset($this->cfg[$this->slaveid])) {
			$this->cfg[$this->slaveid] = $this->cfg['slave'][$sid];
		}
	}

	public function init_connect($sql) {
		if(!($this->cfg['slave_status'] == true && !empty($this->cfg['slave']))) {
			$this->master_connect();
		} else {
			$sql = trim($sql);
			$sql_lower = strtolower($sql);
			$slave_except = false;
			if(!strexists($sql_lower, 'where ')) {
				$tablename = substr($sql_lower, strpos($sql_lower, 'from ') + 5);
			} else {
				$tablename = substr($sql_lower, strpos($sql_lower, 'from ') + 5, strpos($sql_lower, ' where') - strpos($sql_lower, 'from ') - 5);
			}
			$tablename = trim($tablename, '`');
			$tablename = str_replace($this->tablepre, '', $tablename);
			if(!empty($this->cfg['common']['slave_except_table']) && in_array(strtolower($tablename), $this->cfg['common']['slave_except_table'])) {
				$slave_except = true;
			}
			if(!(!$slave_except && strtoupper(substr($sql, 0 , 6)) === 'SELECT' && $this->slave_connect())) {
				$this->master_connect();
			}
		}
		return true;
	}

	public function master_connect() {
		if(!isset($this->link['master'])) {
			$this->connect('master');
		}
		$this->pdo = $this->link['master'];
	}

	public function insertid() {
		$this->master_connect();
		return parent::insertid();
	}

	public function begin() {
		$this->master_connect();
		return parent::begin();
	}

	public function commit() {
		$this->master_connect();
		return parent::commit();
	}

	public function rollback() {
		$this->master_connect();
		return parent::rollback();
	}

}