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  }