Skip to content

Commit 8daafec

Browse files
authored
Merge branch 'master' into GODRIVER-410
2 parents 7a758d4 + 2a25967 commit 8daafec

File tree

7 files changed

+79
-17
lines changed

7 files changed

+79
-17
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ debug
55
*.ipr
66
*.iws
77
.idea
8+
*.sublime-project
9+
*.sublime-workspace

core/command/create_indexes.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/mongodb/mongo-go-driver/bson"
1313
"github.com/mongodb/mongo-go-driver/core/description"
14+
"github.com/mongodb/mongo-go-driver/core/options"
1415
"github.com/mongodb/mongo-go-driver/core/result"
1516
"github.com/mongodb/mongo-go-driver/core/wiremessage"
1617
)
@@ -21,9 +22,9 @@ import (
2122
type CreateIndexes struct {
2223
NS Namespace
2324
Indexes *bson.Array
24-
25-
result result.CreateIndexes
26-
err error
25+
Opts []options.CreateIndexesOptioner
26+
result result.CreateIndexes
27+
err error
2728
}
2829

2930
// Encode will encode this command into a wire message for the given server description.
@@ -33,6 +34,16 @@ func (ci *CreateIndexes) Encode(desc description.SelectedServer) (wiremessage.Wi
3334
bson.EC.Array("indexes", ci.Indexes),
3435
)
3536

37+
for _, opt := range ci.Opts {
38+
if opt == nil {
39+
continue
40+
}
41+
err := opt.Option(cmd)
42+
if err != nil {
43+
return nil, err
44+
}
45+
}
46+
3647
return (&Command{DB: ci.NS.DB, Command: cmd, isWrite: true}).Encode(desc)
3748
}
3849

core/command/drop_indexes.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@ import (
1111

1212
"github.com/mongodb/mongo-go-driver/bson"
1313
"github.com/mongodb/mongo-go-driver/core/description"
14+
"github.com/mongodb/mongo-go-driver/core/options"
1415
"github.com/mongodb/mongo-go-driver/core/wiremessage"
1516
)
1617

1718
// DropIndexes represents the dropIndexes command.
1819
//
1920
// The dropIndexes command drops indexes for a namespace.
2021
type DropIndexes struct {
21-
NS Namespace
22-
Index string
23-
22+
NS Namespace
23+
Index string
24+
Opts []options.DropIndexesOptioner
2425
result bson.Reader
2526
err error
2627
}
@@ -32,6 +33,16 @@ func (di *DropIndexes) Encode(desc description.SelectedServer) (wiremessage.Wire
3233
bson.EC.String("index", di.Index),
3334
)
3435

36+
for _, opt := range di.Opts {
37+
if opt == nil {
38+
continue
39+
}
40+
err := opt.Option(cmd)
41+
if err != nil {
42+
return nil, err
43+
}
44+
}
45+
3546
return (&Command{DB: di.NS.DB, Command: cmd, isWrite: true}).Encode(desc)
3647
}
3748

core/command/list_indexes.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ import (
1919
//
2020
// The listIndexes command lists the indexes for a namespace.
2121
type ListIndexes struct {
22-
NS Namespace
23-
Opts []options.ListIndexesOptioner
24-
22+
NS Namespace
23+
Opts []options.ListIndexesOptioner
2524
result Cursor
2625
err error
2726
}

core/options/options.go

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,18 +137,32 @@ type ListDatabasesOptioner interface {
137137
listDatabasesOption()
138138
}
139139

140-
// ListIndexesOptioner is the interface implemented by types that can be used as
141-
// Options for ListIndexes operations.
140+
// CursorOptioner is the interface implemented by types that can be used as
141+
// Options for Cursor operations.
142+
type CursorOptioner interface {
143+
Optioner
144+
cursorOption()
145+
}
146+
147+
//ListIndexesOptioner is the interface implemented by types that can be used as
148+
// Options for list_indexes operations.
142149
type ListIndexesOptioner interface {
143150
Optioner
144151
listIndexesOption()
145152
}
146153

147-
// CursorOptioner is the interface implemented by types that can be used as
148-
// Options for Cursor operations.
149-
type CursorOptioner interface {
154+
//CreateIndexesOptioner is the interface implemented by types that can be used as
155+
// Options for create_indexes operations.
156+
type CreateIndexesOptioner interface {
150157
Optioner
151-
cursorOption()
158+
createIndexesOption()
159+
}
160+
161+
//DropIndexesOptioner is the interface implemented by types that can be used as
162+
// Options for drop_indexes operations.
163+
type DropIndexesOptioner interface {
164+
Optioner
165+
dropIndexesOption()
152166
}
153167

154168
var (
@@ -480,6 +494,9 @@ func (OptMaxTime) findOneOption() {}
480494
func (OptMaxTime) findOneAndDeleteOption() {}
481495
func (OptMaxTime) findOneAndReplaceOption() {}
482496
func (OptMaxTime) findOneAndUpdateOption() {}
497+
func (OptMaxTime) listIndexesOption() {}
498+
func (OptMaxTime) dropIndexesOption() {}
499+
func (OptMaxTime) createIndexesOption() {}
483500

484501
// OptMin is for internal use.
485502
type OptMin struct{ Min *bson.Document }
@@ -705,6 +722,8 @@ func (OptWriteConcern) insertManyOption() {}
705722
func (OptWriteConcern) insertOneOption() {}
706723
func (OptWriteConcern) replaceOption() {}
707724
func (OptWriteConcern) updateOption() {}
725+
func (OptWriteConcern) createIndexesOption() {}
726+
func (OptWriteConcern) dropIndexesOption() {}
708727

709728
// OptNameOnly is for internal use.
710729
type OptNameOnly bool

mongo/client.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,20 @@ func newClient(cs connstring.ConnString, opts *ClientOptions) (*Client, error) {
118118
if err != nil {
119119
return nil, err
120120
}
121-
122121
client.topology = topo
122+
123123
client.readConcern = readConcernFromConnString(&client.connString)
124124
client.writeConcern = writeConcernFromConnString(&client.connString)
125-
client.readPreference, err = readPreferenceFromConnString(&client.connString)
125+
126+
rp, err := readPreferenceFromConnString(&client.connString)
126127
if err != nil {
127128
return nil, err
128129
}
130+
if rp != nil {
131+
client.readPreference = rp
132+
} else {
133+
client.readPreference = readpref.Primary()
134+
}
129135

130136
return client, nil
131137
}
@@ -190,6 +196,7 @@ func readPreferenceFromConnString(cs *connstring.ConnString) (*readpref.ReadPref
190196
if cs.MaxStaleness != 0 {
191197
options = append(options, readpref.WithMaxStaleness(cs.MaxStaleness))
192198
}
199+
193200
if len(cs.ReadPreference) > 0 {
194201
if rp == nil {
195202
mode, _ := readpref.ModeFromString(cs.ReadPreference)
@@ -199,6 +206,7 @@ func readPreferenceFromConnString(cs *connstring.ConnString) (*readpref.ReadPref
199206
}
200207
}
201208
}
209+
202210
return rp, nil
203211
}
204212

mongo/client_internal_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,5 +331,17 @@ func TestClient_ReadPreference(t *testing.T) {
331331
d, flag := c.readPreference.MaxStaleness()
332332
require.True(t, flag)
333333
require.Equal(t, time.Duration(5)*time.Second, d)
334+
}
335+
336+
func TestClient_ReadPreferenceAbsent(t *testing.T) {
337+
t.Parallel()
334338

339+
cs := testutil.ConnString(t)
340+
c, err := NewClient(cs.String())
341+
require.NoError(t, err)
342+
require.NotNil(t, c)
343+
require.Equal(t, readpref.PrimaryMode, c.readPreference.Mode())
344+
require.Empty(t, c.readPreference.TagSets())
345+
_, flag := c.readPreference.MaxStaleness()
346+
require.False(t, flag)
335347
}

0 commit comments

Comments
 (0)