...
1
2
3
4
5
6
7
8 package readpref
9
10 import (
11 "bytes"
12 "errors"
13 "fmt"
14 "time"
15
16 "go.mongodb.org/mongo-driver/tag"
17 )
18
19 var (
20 errInvalidReadPreference = errors.New("can not specify tags, max staleness, or hedge with mode primary")
21 )
22
23
24 func Primary() *ReadPref {
25 return &ReadPref{mode: PrimaryMode}
26 }
27
28
29 func PrimaryPreferred(opts ...Option) *ReadPref {
30
31 rp, _ := New(PrimaryPreferredMode, opts...)
32 return rp
33 }
34
35
36 func SecondaryPreferred(opts ...Option) *ReadPref {
37
38 rp, _ := New(SecondaryPreferredMode, opts...)
39 return rp
40 }
41
42
43 func Secondary(opts ...Option) *ReadPref {
44
45 rp, _ := New(SecondaryMode, opts...)
46 return rp
47 }
48
49
50 func Nearest(opts ...Option) *ReadPref {
51
52 rp, _ := New(NearestMode, opts...)
53 return rp
54 }
55
56
57 func New(mode Mode, opts ...Option) (*ReadPref, error) {
58 rp := &ReadPref{
59 mode: mode,
60 }
61
62 if mode == PrimaryMode && len(opts) != 0 {
63 return nil, errInvalidReadPreference
64 }
65
66 for _, opt := range opts {
67 if opt == nil {
68 continue
69 }
70 err := opt(rp)
71 if err != nil {
72 return nil, err
73 }
74 }
75
76 return rp, nil
77 }
78
79
80 type ReadPref struct {
81 maxStaleness time.Duration
82 maxStalenessSet bool
83 mode Mode
84 tagSets []tag.Set
85 hedgeEnabled *bool
86 }
87
88
89
90
91 func (r *ReadPref) MaxStaleness() (time.Duration, bool) {
92 return r.maxStaleness, r.maxStalenessSet
93 }
94
95
96 func (r *ReadPref) Mode() Mode {
97 return r.mode
98 }
99
100
101
102 func (r *ReadPref) TagSets() []tag.Set {
103 return r.tagSets
104 }
105
106
107
108 func (r *ReadPref) HedgeEnabled() *bool {
109 return r.hedgeEnabled
110 }
111
112
113 func (r *ReadPref) String() string {
114 var b bytes.Buffer
115 b.WriteString(r.mode.String())
116 delim := "("
117 if r.maxStalenessSet {
118 fmt.Fprintf(&b, "%smaxStaleness=%v", delim, r.maxStaleness)
119 delim = " "
120 }
121 for _, tagSet := range r.tagSets {
122 fmt.Fprintf(&b, "%stagSet=%s", delim, tagSet.String())
123 delim = " "
124 }
125 if r.hedgeEnabled != nil {
126 fmt.Fprintf(&b, "%shedgeEnabled=%v", delim, *r.hedgeEnabled)
127 delim = " "
128 }
129 if delim != "(" {
130 b.WriteString(")")
131 }
132 return b.String()
133 }
134
View as plain text