Skip to content

Commit 6ae1285

Browse files
committed
Have Update() and Remove() return ChangeInfo
1 parent eeefdec commit 6ae1285

File tree

4 files changed

+45
-39
lines changed

4 files changed

+45
-39
lines changed

gridfs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ func (gfs *GridFS) Find(query interface{}) *Query {
336336

337337
// RemoveId deletes the file with the provided id from the GridFS.
338338
func (gfs *GridFS) RemoveId(id interface{}) error {
339-
err := gfs.Files.Remove(bson.M{"_id": id})
339+
_, err := gfs.Files.Remove(bson.M{"_id": id})
340340
if err != nil {
341341
return err
342342
}

session.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,7 +1293,7 @@ func (db *Database) UpsertUser(user *User) error {
12931293
}
12941294
}
12951295
users := db.C("system.users")
1296-
err = users.Update(bson.D{{Name: "user", Value: user.Username}}, bson.D{{Name: "$unset", Value: unset}, {Name: "$set", Value: set}})
1296+
_, err = users.Update(bson.D{{Name: "user", Value: user.Username}}, bson.D{{Name: "$unset", Value: unset}, {Name: "$set", Value: set}})
12971297
if err == ErrNotFound {
12981298
set = append(set, bson.DocElem{Name: "user", Value: user.Username})
12991299
if user.Roles == nil && user.OtherDBRoles == nil {
@@ -1394,7 +1394,8 @@ func (db *Database) RemoveUser(user string) error {
13941394
err := db.Run(bson.D{{Name: "dropUser", Value: user}}, nil)
13951395
if isNoCmd(err) {
13961396
users := db.C("system.users")
1397-
return users.Remove(bson.M{"user": user})
1397+
_, err := users.Remove(bson.M{"user": user})
1398+
return err
13981399
}
13991400
if isNotFound(err) {
14001401
return ErrNotFound
@@ -2912,7 +2913,6 @@ func (p *Pipe) SetMaxTime(d time.Duration) *Pipe {
29122913
return p
29132914
}
29142915

2915-
29162916
// Collation allows to specify language-specific rules for string comparison,
29172917
// such as rules for lettercase and accent marks.
29182918
// When specifying collation, the locale field is mandatory; all other collation
@@ -3013,7 +3013,7 @@ func (c *Collection) Insert(docs ...interface{}) error {
30133013
// http://www.mongodb.org/display/DOCS/Updating
30143014
// http://www.mongodb.org/display/DOCS/Atomic+Operations
30153015
//
3016-
func (c *Collection) Update(selector interface{}, update interface{}) error {
3016+
func (c *Collection) Update(selector interface{}, update interface{}) (info *ChangeInfo, err error) {
30173017
if selector == nil {
30183018
selector = bson.D{}
30193019
}
@@ -3024,17 +3024,20 @@ func (c *Collection) Update(selector interface{}, update interface{}) error {
30243024
}
30253025
lerr, err := c.writeOp(&op, true)
30263026
if err == nil && lerr != nil && !lerr.UpdatedExisting {
3027-
return ErrNotFound
3027+
return &ChangeInfo{}, ErrNotFound
30283028
}
3029-
return err
3029+
if err == nil && lerr != nil {
3030+
info = &ChangeInfo{Updated: lerr.modified, Matched: lerr.N}
3031+
}
3032+
return info, err
30303033
}
30313034

30323035
// UpdateId is a convenience helper equivalent to:
30333036
//
3034-
// err := collection.Update(bson.M{"_id": id}, update)
3037+
// changeInfo, err := collection.Update(bson.M{"_id": id}, update)
30353038
//
30363039
// See the Update method for more details.
3037-
func (c *Collection) UpdateId(id interface{}, update interface{}) error {
3040+
func (c *Collection) UpdateId(id interface{}, update interface{}) (*ChangeInfo, error) {
30383041
return c.Update(bson.D{{Name: "_id", Value: id}}, update)
30393042
}
30403043

@@ -3143,23 +3146,26 @@ func (c *Collection) UpsertId(id interface{}, update interface{}) (info *ChangeI
31433146
//
31443147
// http://www.mongodb.org/display/DOCS/Removing
31453148
//
3146-
func (c *Collection) Remove(selector interface{}) error {
3149+
func (c *Collection) Remove(selector interface{}) (info *ChangeInfo, err error) {
31473150
if selector == nil {
31483151
selector = bson.D{}
31493152
}
31503153
lerr, err := c.writeOp(&deleteOp{c.FullName, selector, 1, 1}, true)
31513154
if err == nil && lerr != nil && lerr.N == 0 {
3152-
return ErrNotFound
3155+
return &ChangeInfo{}, ErrNotFound
31533156
}
3154-
return err
3157+
if err == nil && lerr != nil {
3158+
info = &ChangeInfo{Updated: lerr.modified, Matched: lerr.N}
3159+
}
3160+
return info, err
31553161
}
31563162

31573163
// RemoveId is a convenience helper equivalent to:
31583164
//
3159-
// err := collection.Remove(bson.M{"_id": id})
3165+
// changeInfo, err := collection.Remove(bson.M{"_id": id})
31603166
//
31613167
// See the Remove method for more details.
3162-
func (c *Collection) RemoveId(id interface{}) error {
3168+
func (c *Collection) RemoveId(id interface{}) (*ChangeInfo, error) {
31633169
return c.Remove(bson.D{{Name: "_id", Value: id}})
31643170
}
31653171

session_test.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -644,18 +644,18 @@ func (s *S) TestUpdate(c *C) {
644644
}
645645

646646
// No changes is a no-op and shouldn't return an error.
647-
err = coll.Update(M{"k": 42}, M{"$set": M{"n": 42}})
647+
_, err = coll.Update(M{"k": 42}, M{"$set": M{"n": 42}})
648648
c.Assert(err, IsNil)
649649

650-
err = coll.Update(M{"k": 42}, M{"$inc": M{"n": 1}})
650+
_, err = coll.Update(M{"k": 42}, M{"$inc": M{"n": 1}})
651651
c.Assert(err, IsNil)
652652

653653
result := make(M)
654654
err = coll.Find(M{"k": 42}).One(result)
655655
c.Assert(err, IsNil)
656656
c.Assert(result["n"], Equals, 43)
657657

658-
err = coll.Update(M{"k": 47}, M{"k": 47, "n": 47})
658+
_, err = coll.Update(M{"k": 47}, M{"k": 47, "n": 47})
659659
c.Assert(err, Equals, mgo.ErrNotFound)
660660

661661
err = coll.Find(M{"k": 47}).One(result)
@@ -675,15 +675,15 @@ func (s *S) TestUpdateId(c *C) {
675675
c.Assert(err, IsNil)
676676
}
677677

678-
err = coll.UpdateId(42, M{"$inc": M{"n": 1}})
678+
_, err = coll.UpdateId(42, M{"$inc": M{"n": 1}})
679679
c.Assert(err, IsNil)
680680

681681
result := make(M)
682682
err = coll.FindId(42).One(result)
683683
c.Assert(err, IsNil)
684684
c.Assert(result["n"], Equals, 43)
685685

686-
err = coll.UpdateId(47, M{"k": 47, "n": 47})
686+
_, err = coll.UpdateId(47, M{"k": 47, "n": 47})
687687
c.Assert(err, Equals, mgo.ErrNotFound)
688688

689689
err = coll.FindId(47).One(result)
@@ -699,7 +699,7 @@ func (s *S) TestUpdateNil(c *C) {
699699

700700
err = coll.Insert(M{"k": 42, "n": 42})
701701
c.Assert(err, IsNil)
702-
err = coll.Update(nil, M{"$inc": M{"n": 1}})
702+
_, err = coll.Update(nil, M{"$inc": M{"n": 1}})
703703
c.Assert(err, IsNil)
704704

705705
result := make(M)
@@ -709,7 +709,7 @@ func (s *S) TestUpdateNil(c *C) {
709709

710710
err = coll.Insert(M{"k": 45, "n": 45})
711711
c.Assert(err, IsNil)
712-
_, err = coll.UpdateAll(nil, M{"$inc": M{"n": 1}})
712+
_, _, err = coll.UpdateAll(nil, M{"$inc": M{"n": 1}})
713713
c.Assert(err, IsNil)
714714

715715
err = coll.Find(M{"k": 42}).One(result)
@@ -843,7 +843,7 @@ func (s *S) TestUpdateAll(c *C) {
843843
c.Assert(info.Matched, Equals, 4)
844844
}
845845

846-
info, err = coll.UpdateAll(M{"k": M{"$gt": 42}}, M{"$inc": M{"n": 1}})
846+
info, _, err = coll.UpdateAll(M{"k": M{"$gt": 42}}, M{"$inc": M{"n": 1}})
847847
c.Assert(err, IsNil)
848848
c.Assert(info.Updated, Equals, 4)
849849
c.Assert(info.Matched, Equals, 4)
@@ -863,7 +863,7 @@ func (s *S) TestUpdateAll(c *C) {
863863

864864
if !s.versionAtLeast(2, 6) {
865865
// 2.6 made this invalid.
866-
info, err = coll.UpdateAll(M{"k": 47}, M{"k": 47, "n": 47})
866+
info, _, err = coll.UpdateAll(M{"k": 47}, M{"k": 47, "n": 47})
867867
c.Assert(err, Equals, nil)
868868
c.Assert(info.Updated, Equals, 0)
869869
}
@@ -882,7 +882,7 @@ func (s *S) TestRemove(c *C) {
882882
c.Assert(err, IsNil)
883883
}
884884

885-
err = coll.Remove(M{"n": M{"$gt": 42}})
885+
_, err = coll.Remove(M{"n": M{"$gt": 42}})
886886
c.Assert(err, IsNil)
887887

888888
result := &struct{ N int }{}
@@ -1160,7 +1160,7 @@ func (s *S) TestCreateCollectionValidator(c *C) {
11601160
c.Assert(err, IsNil)
11611161
err = coll.Insert(M{"a": 2})
11621162
c.Assert(err, ErrorMatches, "Document failed validation")
1163-
err = coll.Update(M{"a": 1}, M{"c": 1})
1163+
_, err = coll.Update(M{"a": 1}, M{"c": 1})
11641164
c.Assert(err, IsNil)
11651165
err = coll.DropCollection()
11661166
c.Assert(err, IsNil)
@@ -1556,10 +1556,10 @@ func (s *S) TestView(c *C) {
15561556
err = view.Insert(bson.M{"_id": 5, "nm": "b"})
15571557
c.Assert(err, NotNil)
15581558

1559-
err = view.Remove(bson.M{"_id": 2})
1559+
_, err = view.Remove(bson.M{"_id": 2})
15601560
c.Assert(err, NotNil)
15611561

1562-
err = view.Update(bson.M{"_id": 2}, bson.M{"$set": bson.M{"d": true}})
1562+
_, err = view.Update(bson.M{"_id": 2}, bson.M{"$set": bson.M{"d": true}})
15631563
c.Assert(err, NotNil)
15641564

15651565
err = db.C("myview").DropCollection()
@@ -5018,19 +5018,19 @@ func (s *S) TestBypassValidation(c *C) {
50185018
err = coll.Insert(M{"n": 2})
50195019
c.Assert(err, ErrorMatches, "Document failed validation")
50205020

5021-
err = coll.Update(M{"n": 1}, M{"n": 10})
5021+
_, err = coll.Update(M{"n": 1}, M{"n": 10})
50225022
c.Assert(err, ErrorMatches, "Document failed validation")
50235023

50245024
session.SetBypassValidation(true)
50255025

50265026
err = coll.Insert(M{"n": 3})
50275027
c.Assert(err, IsNil)
50285028

5029-
err = coll.Update(M{"n": 3}, M{"n": 4})
5029+
_, err = coll.Update(M{"n": 3}, M{"n": 4})
50305030
c.Assert(err, IsNil)
50315031

50325032
// Ensure this still works. Shouldn't be affected.
5033-
err = coll.Remove(M{"n": 1})
5033+
_, err = coll.Remove(M{"n": 1})
50345034
c.Assert(err, IsNil)
50355035

50365036
var result struct{ N int }

txn/flusher.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ NextDoc:
391391
qdoc := bson.D{{Name: "_id", Value: t.Id}, {Name: "s", Value: tpreparing}}
392392
udoc := bson.D{{Name: "$set", Value: bson.D{{Name: "s", Value: tprepared}, {Name: "n", Value: nonce}}}}
393393
chaos("set-prepared")
394-
err = f.tc.Update(qdoc, udoc)
394+
_, err = f.tc.Update(qdoc, udoc)
395395
if err == nil {
396396
t.State = tprepared
397397
t.Nonce = nonce
@@ -430,9 +430,9 @@ func (f *flusher) unstashToken(tt token, dkey docKey) error {
430430
qdoc := bson.D{{Name: "_id", Value: dkey}, {Name: "txn-queue", Value: tt}}
431431
udoc := bson.D{{Name: "$pull", Value: bson.D{{Name: "txn-queue", Value: tt}}}}
432432
chaos("")
433-
if err := f.sc.Update(qdoc, udoc); err == nil {
433+
if _, err := f.sc.Update(qdoc, udoc); err == nil {
434434
chaos("")
435-
err = f.sc.Remove(bson.D{{Name: "_id", Value: dkey}, {Name: "txn-queue", Value: bson.D{}}})
435+
_, err = f.sc.Remove(bson.D{{Name: "_id", Value: dkey}, {Name: "txn-queue", Value: bson.D{}}})
436436
} else if err != mgo.ErrNotFound {
437437
return err
438438
}
@@ -682,7 +682,7 @@ func (f *flusher) abortOrReload(t *transaction, revnos []int64, pull map[bson.Ob
682682
qdoc := bson.D{{Name: "_id", Value: t.Id}, {Name: "s", Value: tprepared}}
683683
udoc := bson.D{{Name: "$set", Value: bson.D{{Name: "s", Value: taborting}}}}
684684
chaos("set-aborting")
685-
if err = f.tc.Update(qdoc, udoc); err == nil {
685+
if _, err = f.tc.Update(qdoc, udoc); err == nil {
686686
t.State = taborting
687687
} else if err == mgo.ErrNotFound {
688688
if err = f.reload(t); err != nil || t.State != taborting {
@@ -750,7 +750,7 @@ func (f *flusher) checkpoint(t *transaction, revnos []int64) error {
750750
qdoc := bson.D{{Name: "_id", Value: t.Id}, {Name: "s", Value: tprepared}}
751751
udoc := bson.D{{Name: "$set", Value: bson.D{{Name: "s", Value: tapplying}, {Name: "r", Value: revnos}}}}
752752
chaos("set-applying")
753-
err := f.tc.Update(qdoc, udoc)
753+
_, err := f.tc.Update(qdoc, udoc)
754754
if err == nil {
755755
t.State = tapplying
756756
t.Revnos = revnos
@@ -826,7 +826,7 @@ func (f *flusher) apply(t *transaction, pull map[bson.ObjectId]*transaction) err
826826
return err
827827
}
828828
chaos("")
829-
err = c.Update(qdoc, d)
829+
_, err = c.Update(qdoc, d)
830830
}
831831
case op.Remove:
832832
if revno < 0 {
@@ -867,7 +867,7 @@ func (f *flusher) apply(t *transaction, pull map[bson.ObjectId]*transaction) err
867867
}
868868
qdoc := bson.D{{Name: "_id", Value: dkey}, {Name: "n", Value: nonce}}
869869
udoc := bson.D{{Name: "$set", Value: set}, {Name: "$unset", Value: unset}}
870-
if err = f.sc.Update(qdoc, udoc); err == nil {
870+
if _, err = f.sc.Update(qdoc, udoc); err == nil {
871871
updated = true
872872
} else if err != mgo.ErrNotFound {
873873
return err
@@ -878,7 +878,7 @@ func (f *flusher) apply(t *transaction, pull map[bson.ObjectId]*transaction) err
878878
} else {
879879
f.debugf("Stash for document %v was up-to-date", dkey)
880880
}
881-
err = c.Remove(qdoc)
881+
_, err = c.Remove(qdoc)
882882
}
883883
}
884884
case op.Insert != nil:
@@ -913,7 +913,7 @@ func (f *flusher) apply(t *transaction, pull map[bson.ObjectId]*transaction) err
913913
f.debugf("Document %v already existed", dkey)
914914
}
915915
chaos("")
916-
if err = f.sc.Remove(qdoc); err == nil {
916+
if _, err = f.sc.Remove(qdoc); err == nil {
917917
f.debugf("Stash for document %v removed", dkey)
918918
}
919919
}

0 commit comments

Comments
 (0)