z.go 1.6 KB

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