gitee.com/curryzheng/dm@v0.0.1/za.go (about) 1 /* 2 * Copyright (c) 2000-2018, 达梦数据库有限公司. 3 * All rights reserved. 4 */ 5 6 package dm 7 8 import "sort" 9 10 const ( 11 TYPE_WELL_DISTRIBUTE = 0 12 TYPE_HEAD_FIRST = 1 13 ) 14 15 type epSelector struct { 16 dbs []*ep 17 } 18 19 func newEPSelector(dbs []*ep) *epSelector { 20 return &epSelector{dbs} 21 } 22 23 func (s *epSelector) sortDBList(first bool) []*ep { 24 if !first { 25 // 按sort从大到小排序,相同sort值顺序不变 26 sort.Slice(s.dbs, func(i, j int) bool { 27 return s.dbs[i].getSort(first) > s.dbs[j].getSort(first) 28 }) 29 } 30 return s.dbs 31 } 32 33 func (s *epSelector) checkServerMode(conn *DmConnection, last bool) (bool, error) { 34 // 只连dsc control节点 35 if conn.dmConnector.loginDscCtrl && !conn.dscControl { 36 conn.close() 37 return false, ECGO_INVALID_SERVER_MODE.throw() 38 } 39 // 模式不匹配, 这里使用的是连接之前的sort,连接之后server的状态可能发生改变sort也可能改变 40 if conn.dmConnector.loginStatus > 0 && int(conn.SvrStat) != conn.dmConnector.loginStatus { 41 conn.close() 42 return false, ECGO_INVALID_SERVER_MODE.throw() 43 } 44 if last { 45 switch conn.dmConnector.loginMode { 46 case LOGIN_MODE_PRIMARY_ONLY: 47 return conn.SvrMode == SERVER_MODE_PRIMARY, nil 48 case LOGIN_MODE_STANDBY_ONLY: 49 return conn.SvrMode == SERVER_MODE_STANDBY, nil 50 default: 51 return true, nil 52 } 53 } 54 switch conn.dmConnector.loginMode { 55 case LOGIN_MODE_NORMAL_FIRST: 56 return conn.SvrMode == SERVER_MODE_NORMAL, nil 57 case LOGIN_MODE_PRIMARY_FIRST, LOGIN_MODE_PRIMARY_ONLY: 58 return conn.SvrMode == SERVER_MODE_PRIMARY, nil 59 case LOGIN_MODE_STANDBY_FIRST, LOGIN_MODE_STANDBY_ONLY: 60 return conn.SvrMode == SERVER_MODE_STANDBY, nil 61 default: 62 break 63 } 64 return false, nil 65 }