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  }