1// Copyright (C) MongoDB, Inc. 2017-present.
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may
4// not use this file except in compliance with the License. You may obtain
5// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
7package options
8
9import (
10	"go.mongodb.org/mongo-driver/mongo/readconcern"
11	"go.mongodb.org/mongo-driver/mongo/readpref"
12	"go.mongodb.org/mongo-driver/mongo/writeconcern"
13)
14
15// DefaultCausalConsistency is the default value for the CausalConsistency option.
16var DefaultCausalConsistency = true
17
18// SessionOptions represents all possible options for creating a new session.
19type SessionOptions struct {
20	CausalConsistency     *bool                      // Specifies if reads should be causally consistent. Defaults to true.
21	DefaultReadConcern    *readconcern.ReadConcern   // The default read concern for transactions started in the session.
22	DefaultReadPreference *readpref.ReadPref         // The default read preference for transactions started in the session.
23	DefaultWriteConcern   *writeconcern.WriteConcern // The default write concern for transactions started in the session.
24}
25
26// Session creates a new *SessionOptions
27func Session() *SessionOptions {
28	return &SessionOptions{
29		CausalConsistency: &DefaultCausalConsistency,
30	}
31}
32
33// SetCausalConsistency specifies if a session should be causally consistent. Defaults to true.
34func (s *SessionOptions) SetCausalConsistency(b bool) *SessionOptions {
35	s.CausalConsistency = &b
36	return s
37}
38
39// SetDefaultReadConcern sets the default read concern for transactions started in a session.
40func (s *SessionOptions) SetDefaultReadConcern(rc *readconcern.ReadConcern) *SessionOptions {
41	s.DefaultReadConcern = rc
42	return s
43}
44
45// SetDefaultReadPreference sets the default read preference for transactions started in a session.
46func (s *SessionOptions) SetDefaultReadPreference(rp *readpref.ReadPref) *SessionOptions {
47	s.DefaultReadPreference = rp
48	return s
49}
50
51// SetDefaultWriteConcern sets the default write concern for transactions started in a session.
52func (s *SessionOptions) SetDefaultWriteConcern(wc *writeconcern.WriteConcern) *SessionOptions {
53	s.DefaultWriteConcern = wc
54	return s
55}
56
57// MergeSessionOptions combines the given *SessionOptions into a single *SessionOptions in a last one wins fashion.
58func MergeSessionOptions(opts ...*SessionOptions) *SessionOptions {
59	s := Session()
60	for _, opt := range opts {
61		if opt == nil {
62			continue
63		}
64		if opt.CausalConsistency != nil {
65			s.CausalConsistency = opt.CausalConsistency
66		}
67		if opt.DefaultReadConcern != nil {
68			s.DefaultReadConcern = opt.DefaultReadConcern
69		}
70		if opt.DefaultReadPreference != nil {
71			s.DefaultReadPreference = opt.DefaultReadPreference
72		}
73		if opt.DefaultWriteConcern != nil {
74			s.DefaultWriteConcern = opt.DefaultWriteConcern
75		}
76	}
77
78	return s
79}
80