123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- <?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();
- }
- }
|