forked from yuxh/gearman-go
Remove depenance on external libs for unique id
This commit is contained in:
parent
f3b4013e2b
commit
5e215b9257
@ -20,7 +20,7 @@ var (
|
||||
)
|
||||
|
||||
func init() {
|
||||
IdGen = NewObjectId()
|
||||
IdGen = NewAutoIncId()
|
||||
}
|
||||
|
||||
// Status handler
|
||||
|
34
client/id.go
34
client/id.go
@ -1,37 +1,29 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"labix.org/v2/mgo/bson"
|
||||
"github.com/mikespook/golib/autoinc"
|
||||
"strconv"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
)
|
||||
|
||||
type IdGenerator interface {
|
||||
Id() string
|
||||
}
|
||||
|
||||
// ObjectId
|
||||
type objectId struct {
|
||||
bson.ObjectId
|
||||
}
|
||||
|
||||
func (id *objectId) Id() string {
|
||||
return id.Hex()
|
||||
}
|
||||
|
||||
func NewObjectId() IdGenerator {
|
||||
return &objectId{bson.NewObjectId()}
|
||||
Id() string
|
||||
}
|
||||
|
||||
// AutoIncId
|
||||
type autoincId struct {
|
||||
*autoinc.AutoInc
|
||||
value int64
|
||||
}
|
||||
|
||||
func (id *autoincId) Id() string {
|
||||
return strconv.Itoa(id.AutoInc.Id())
|
||||
func (ai *autoincId) Id() string {
|
||||
next := atomic.AddInt64(&ai.value, 1)
|
||||
return strconv.FormatInt(next, 10)
|
||||
}
|
||||
|
||||
func NewAutoIncId() IdGenerator {
|
||||
return &autoincId{autoinc.New(1, 1)}
|
||||
// we'll consider the nano fraction of a second at startup unique
|
||||
// and count up from there.
|
||||
return &autoincId{
|
||||
value: int64(time.Now().Nanosecond()) << 32,
|
||||
}
|
||||
}
|
||||
|
18
client/id_test.go
Normal file
18
client/id_test.go
Normal file
@ -0,0 +1,18 @@
|
||||
package client
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestAutoInc(t *testing.T) {
|
||||
ai := NewAutoIncId()
|
||||
|
||||
previous := ai.Id()
|
||||
for i := 0; i < 10; i++ {
|
||||
id := ai.Id()
|
||||
if id == previous {
|
||||
t.Errorf("Id not unique, previous and current %s", id)
|
||||
}
|
||||
previous = id
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user