forked from vitessio/vitess
/
mariadb_gtid.go
142 lines (121 loc) · 3.51 KB
/
mariadb_gtid.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// Copyright 2014, Google Inc. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package replication
import (
"fmt"
"strconv"
"strings"
)
const mariadbFlavorID = "MariaDB"
// parseMariadbGTID is registered as a GTID parser.
func parseMariadbGTID(s string) (GTID, error) {
// Split into parts.
parts := strings.Split(s, "-")
if len(parts) != 3 {
return nil, fmt.Errorf("invalid MariaDB GTID (%v): expecting Domain-Server-Sequence", s)
}
// Parse Domain ID.
Domain, err := strconv.ParseUint(parts[0], 10, 32)
if err != nil {
return nil, fmt.Errorf("invalid MariaDB GTID Domain ID (%v): %v", parts[0], err)
}
// Parse Server ID.
Server, err := strconv.ParseUint(parts[1], 10, 32)
if err != nil {
return nil, fmt.Errorf("invalid MariaDB GTID Server ID (%v): %v", parts[1], err)
}
// Parse Sequence number.
Sequence, err := strconv.ParseUint(parts[2], 10, 64)
if err != nil {
return nil, fmt.Errorf("invalid MariaDB GTID Sequence number (%v): %v", parts[2], err)
}
return MariadbGTID{
Domain: uint32(Domain),
Server: uint32(Server),
Sequence: Sequence,
}, nil
}
// parseMariadbGTIDSet is registered as a GTIDSet parser.
func parseMariadbGTIDSet(s string) (GTIDSet, error) {
gtid, err := parseMariadbGTID(s)
if err != nil {
return nil, err
}
return gtid.(MariadbGTID), err
}
// MariadbGTID implements GTID.
type MariadbGTID struct {
// Domain is the ID number of the domain within which sequence numbers apply.
Domain uint32
// Server is the ID of the server that generated the transaction.
Server uint32
// Sequence is the sequence number of the transaction within the domain.
Sequence uint64
}
// String implements GTID.String().
func (gtid MariadbGTID) String() string {
return fmt.Sprintf("%d-%d-%d", gtid.Domain, gtid.Server, gtid.Sequence)
}
// Flavor implements GTID.Flavor().
func (gtid MariadbGTID) Flavor() string {
return mariadbFlavorID
}
// SequenceDomain implements GTID.SequenceDomain().
func (gtid MariadbGTID) SequenceDomain() interface{} {
return gtid.Domain
}
// SourceServer implements GTID.SourceServer().
func (gtid MariadbGTID) SourceServer() interface{} {
return gtid.Server
}
// SequenceNumber implements GTID.SequenceNumber().
func (gtid MariadbGTID) SequenceNumber() interface{} {
return gtid.Sequence
}
// GTIDSet implements GTID.GTIDSet().
func (gtid MariadbGTID) GTIDSet() GTIDSet {
return gtid
}
// ContainsGTID implements GTIDSet.ContainsGTID().
func (gtid MariadbGTID) ContainsGTID(other GTID) bool {
if other == nil {
return true
}
mdbOther, ok := other.(MariadbGTID)
if !ok || gtid.Domain != mdbOther.Domain {
return false
}
return gtid.Sequence >= mdbOther.Sequence
}
// Contains implements GTIDSet.Contains().
func (gtid MariadbGTID) Contains(other GTIDSet) bool {
if other == nil {
return true
}
mdbOther, ok := other.(MariadbGTID)
if !ok || gtid.Domain != mdbOther.Domain {
return false
}
return gtid.Sequence >= mdbOther.Sequence
}
// Equal implements GTIDSet.Equal().
func (gtid MariadbGTID) Equal(other GTIDSet) bool {
mdbOther, ok := other.(MariadbGTID)
if !ok {
return false
}
return gtid == mdbOther
}
// AddGTID implements GTIDSet.AddGTID().
func (gtid MariadbGTID) AddGTID(other GTID) GTIDSet {
mdbOther, ok := other.(MariadbGTID)
if !ok || gtid.Domain != mdbOther.Domain || gtid.Sequence >= mdbOther.Sequence {
return gtid
}
return mdbOther
}
func init() {
gtidParsers[mariadbFlavorID] = parseMariadbGTID
gtidSetParsers[mariadbFlavorID] = parseMariadbGTIDSet
}