| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- /*
- * Copyright (c) 2000-2018, 达梦数据库有限公司.
- * All rights reserved.
- */
- package dm
- import "sort"
- const (
- TYPE_WELL_DISTRIBUTE = 0
- TYPE_HEAD_FIRST = 1
- )
- type epSelector struct {
- dbs []*ep
- }
- func newEPSelector(dbs []*ep) *epSelector {
- return &epSelector{dbs}
- }
- func (s *epSelector) sortDBList(first bool) []*ep {
- if !first {
- // 按sort从大到小排序,相同sort值顺序不变
- sort.Slice(s.dbs, func(i, j int) bool {
- return s.dbs[i].getSort(first) > s.dbs[j].getSort(first)
- })
- }
- return s.dbs
- }
- func (s *epSelector) checkServerMode(conn *DmConnection, last bool) (bool, error) {
- // 只连dsc control节点
- if conn.dmConnector.loginDscCtrl && !conn.dscControl {
- conn.close()
- return false, ECGO_INVALID_SERVER_MODE.throw()
- }
- // 模式不匹配, 这里使用的是连接之前的sort,连接之后server的状态可能发生改变sort也可能改变
- if conn.dmConnector.loginStatus > 0 && int(conn.SvrStat) != conn.dmConnector.loginStatus {
- conn.close()
- return false, ECGO_INVALID_SERVER_MODE.throw()
- }
- if last {
- switch conn.dmConnector.loginMode {
- case LOGIN_MODE_PRIMARY_ONLY:
- return conn.SvrMode == SERVER_MODE_PRIMARY, nil
- case LOGIN_MODE_STANDBY_ONLY:
- return conn.SvrMode == SERVER_MODE_STANDBY, nil
- default:
- return true, nil
- }
- }
- switch conn.dmConnector.loginMode {
- case LOGIN_MODE_NORMAL_FIRST:
- return conn.SvrMode == SERVER_MODE_NORMAL, nil
- case LOGIN_MODE_PRIMARY_FIRST, LOGIN_MODE_PRIMARY_ONLY:
- return conn.SvrMode == SERVER_MODE_PRIMARY, nil
- case LOGIN_MODE_STANDBY_FIRST, LOGIN_MODE_STANDBY_ONLY:
- return conn.SvrMode == SERVER_MODE_STANDBY, nil
- default:
- break
- }
- return false, nil
- }
|