github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/state/sequence.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package state 5 6 import ( 7 "fmt" 8 9 "gopkg.in/mgo.v2" 10 "gopkg.in/mgo.v2/bson" 11 ) 12 13 type sequenceDoc struct { 14 DocID string `bson:"_id"` 15 Name string `bson:"name"` 16 ModelUUID string `bson:"model-uuid"` 17 Counter int 18 } 19 20 func (s *State) sequence(name string) (int, error) { 21 sequences, closer := s.getCollection(sequenceC) 22 defer closer() 23 query := sequences.FindId(name) 24 inc := mgo.Change{ 25 Update: bson.M{ 26 "$set": bson.M{ 27 "name": name, 28 "model-uuid": s.ModelUUID(), 29 }, 30 "$inc": bson.M{"counter": 1}, 31 }, 32 Upsert: true, 33 } 34 result := &sequenceDoc{} 35 _, err := query.Apply(inc, result) 36 if err != nil { 37 return -1, fmt.Errorf("cannot increment %q sequence number: %v", name, err) 38 } 39 return result.Counter, nil 40 }