-
Notifications
You must be signed in to change notification settings - Fork 6
/
operation_id.go
127 lines (114 loc) · 2.42 KB
/
operation_id.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package model
import (
"fmt"
"github.com/orda-io/orda/client/pkg/types"
"strings"
)
// NewOperationID creates a new OperationID.
func NewOperationID() *OperationID {
return &OperationID{
Era: 0,
Lamport: 0,
CUID: types.NewNilUID(),
Seq: 0,
}
}
// NewOperationIDWithCUID creates a new OperationID with CUID.
func NewOperationIDWithCUID(cuid string) *OperationID {
return &OperationID{
Era: 0,
Lamport: 0,
CUID: cuid,
Seq: 0,
}
}
// GetTimestamp returns Timestamp from OperationID
func (its *OperationID) GetTimestamp() *Timestamp {
return &Timestamp{
Era: its.Era,
Lamport: its.Lamport,
CUID: its.CUID,
Delimiter: 0,
}
}
// SetOperationID sets the values of OperationID.
func (its *OperationID) SetOperationID(other *OperationID) {
its.Era = other.Era
its.Lamport = other.Lamport
its.CUID = other.CUID
its.Seq = other.Seq
}
// Next increments an OperationID
func (its *OperationID) Next() *OperationID {
its.Lamport++
its.Seq++
return &OperationID{
Era: its.Era,
Lamport: its.Lamport,
CUID: its.CUID,
Seq: its.Seq,
}
}
// RollBack rollbacks the OperationID
func (its *OperationID) RollBack() {
its.Lamport--
its.Seq--
}
// SyncLamport synchronizes the value of Lamport.
func (its *OperationID) SyncLamport(other uint64) uint64 {
if its.Lamport < other {
its.Lamport = other
} else {
its.Lamport++
}
return its.Lamport
}
// Clone ...
func (its *OperationID) Clone() *OperationID {
return &OperationID{
Era: its.Era,
Lamport: its.Lamport,
CUID: its.CUID,
Seq: its.Seq,
}
}
// ToString returns customized string
func (its *OperationID) ToString() string {
if its == nil {
return ""
}
var b strings.Builder
_, _ = fmt.Fprintf(&b, "[%d:%d:%s:%d]",
its.Era, its.Lamport, its.CUID, its.Seq)
return b.String()
}
// ToJSON returns an OperationID as JSON
func (its *OperationID) ToJSON() interface{} {
return struct {
Era uint32
Lamport uint64
CUID string
Seq uint64
}{
Era: its.Era,
Lamport: its.Lamport,
CUID: its.CUID,
Seq: its.Seq,
}
}
// Compare compares two operationIDs.
func (its *OperationID) Compare(other *OperationID) int {
retEra := int32(its.Era - other.Era)
if retEra > 0 {
return 1
} else if retEra < 0 {
return -1
}
var diff = int64(its.Lamport - other.Lamport)
if diff > 0 {
return 1
} else if diff < 0 {
return -1
}
return strings.Compare(its.CUID, other.CUID)
}