/source/class/db/db_driver_mysql_slave.php
PHP | 93 lines | 70 code | 17 blank | 6 comment | 14 complexity | 90d9143f6dd7c692b61163df2eaa3680 MD5 | raw file
Possible License(s): BSD-3-Clause
- <?php
- /**
- * [Discuz!] (C)2001-2099 Comsenz Inc.
- * This is NOT a freeware, use is subject to license terms
- *
- * $Id: db_driver_mysql_slave.php 31879 2012-10-18 09:27:24Z zhangguosheng $
- */
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- class db_driver_mysql_slave extends db_driver_mysql
- {
- public $slaveid = null;
- public $slavequery = 0;
- public $slaveexcept = false;
- public $excepttables = array();
- public $tablename = '';
- protected $_weighttable = array();
- public $serverid = null;
- function set_config($config) {
- parent::set_config($config);
- if($this->config['common']['slave_except_table']) {
- $this->excepttables = explode(',', str_replace(' ', '', $this->config['common']['slave_except_table']));
- }
- }
- public function table_name($tablename) {
- $this->tablename = $tablename;
- if(!$this->slaveexcept && $this->excepttables) {
- $this->slaveexcept = in_array($tablename, $this->excepttables, true);
- }
- $this->serverid = isset($this->map[$this->tablename]) ? $this->map[$this->tablename] : 1;
- return $this->tablepre.$tablename;
- }
- protected function _slave_connect() {
- if(!empty($this->config[$this->serverid]['slave'])) {
- $this->_choose_slave();
- if($this->slaveid) {
- if(!isset($this->link[$this->slaveid])) {
- $this->connect($this->slaveid);
- }
- $this->slavequery ++;
- $this->curlink = $this->link[$this->slaveid];
- }
- return true;
- } else {
- return false;
- }
- }
- protected function _choose_slave(){
- if(!isset($this->_weighttable[$this->serverid])) {
- foreach ($this->config[$this->serverid]['slave'] as $key => $value) {
- $this->_weighttable[$this->serverid] .= str_repeat($key, 1 + intval($value['weight']));
- }
- }
- $sid = $this->_weighttable[$this->serverid][mt_rand(0, strlen($this->_weighttable[$this->serverid]) -1)];
- $this->slaveid = $this->serverid.'_'.$sid;
- if(!isset($this->config[$this->slaveid])) {
- $this->config[$this->slaveid] = $this->config[$this->serverid]['slave'][$sid];
- }
- }
- protected function _master_connect() {
- if(!$this->link[$this->serverid]) {
- $this->connect($this->serverid);
- }
- $this->curlink = $this->link[$this->serverid];
- }
- public function query($sql, $silent = false, $unbuffered = false) {
- if(!(!$this->slaveexcept && strtoupper(substr($sql, 0 , 6)) === 'SELECT' && $this->_slave_connect())) {
- $this->_master_connect();
- }
- $this->tablename = '';
- $this->slaveexcept = false;
- return parent::query($sql, $silent, $unbuffered);
- }
- }
- ?>