@@ -342,6 +342,7 @@ func ParseURL(url string) (*DialInfo, error) {
342342 var readPreferenceTagSets []bson.D
343343 minPoolSize := 0
344344 maxIdleTimeMS := 0
345+ safe := Safe {}
345346 for _ , opt := range uinfo .options {
346347 switch opt .key {
347348 case "authSource" :
@@ -352,6 +353,23 @@ func ParseURL(url string) (*DialInfo, error) {
352353 service = opt .value
353354 case "replicaSet" :
354355 setName = opt .value
356+ case "w" :
357+ safe .WMode = opt .value
358+ case "j" :
359+ journal , err := strconv .ParseBool (opt .value )
360+ if err != nil {
361+ return nil , errors .New ("bad value for j: " + opt .value )
362+ }
363+ safe .J = journal
364+ case "wtimeoutMS" :
365+ timeout , err := strconv .Atoi (opt .value )
366+ if err != nil {
367+ return nil , errors .New ("bad value for wtimeoutMS: " + opt .value )
368+ }
369+ if timeout < 0 {
370+ return nil , errors .New ("bad value (negative) for wtimeoutMS: " + opt .value )
371+ }
372+ safe .WTimeout = timeout
355373 case "maxPoolSize" :
356374 poolLimit , err = strconv .Atoi (opt .value )
357375 if err != nil {
@@ -394,15 +412,15 @@ func ParseURL(url string) (*DialInfo, error) {
394412 return nil , errors .New ("bad value for minPoolSize: " + opt .value )
395413 }
396414 if minPoolSize < 0 {
397- return nil , errors .New ("bad value (negtive ) for minPoolSize: " + opt .value )
415+ return nil , errors .New ("bad value (negative ) for minPoolSize: " + opt .value )
398416 }
399417 case "maxIdleTimeMS" :
400418 maxIdleTimeMS , err = strconv .Atoi (opt .value )
401419 if err != nil {
402420 return nil , errors .New ("bad value for maxIdleTimeMS: " + opt .value )
403421 }
404422 if maxIdleTimeMS < 0 {
405- return nil , errors .New ("bad value (negtive ) for maxIdleTimeMS: " + opt .value )
423+ return nil , errors .New ("bad value (negative ) for maxIdleTimeMS: " + opt .value )
406424 }
407425 case "connect" :
408426 if opt .value == "direct" {
@@ -437,6 +455,7 @@ func ParseURL(url string) (*DialInfo, error) {
437455 Mode : readPreferenceMode ,
438456 TagSets : readPreferenceTagSets ,
439457 },
458+ Safe : safe ,
440459 ReplicaSetName : setName ,
441460 MinPoolSize : minPoolSize ,
442461 MaxIdleTimeMS : maxIdleTimeMS ,
@@ -529,6 +548,9 @@ type DialInfo struct {
529548 // Session.SetMode and Session.SelectServers.
530549 ReadPreference * ReadPreference
531550
551+ // Safe mostly defines write options, though there is RMode. See Session.SetSafe
552+ Safe Safe
553+
532554 // FailFast will cause connection and query attempts to fail faster when
533555 // the server is unavailable, instead of retrying until the configured
534556 // timeout period. Note that an unavailable server may silently drop
@@ -715,6 +737,8 @@ func DialWithInfo(dialInfo *DialInfo) (*Session, error) {
715737 return nil , err
716738 }
717739
740+ session .SetSafe (& info .Safe )
741+
718742 if info .ReadPreference != nil {
719743 session .SelectServers (info .ReadPreference .TagSets ... )
720744 session .SetMode (info .ReadPreference .Mode , true )
0 commit comments