81 lines
1.8 KiB
Go
81 lines
1.8 KiB
Go
package mysql
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/juju/errors"
|
|
)
|
|
|
|
type MariadbGTID struct {
|
|
DomainID uint32
|
|
ServerID uint32
|
|
SequenceNumber uint64
|
|
}
|
|
|
|
// We don't support multi source replication, so the mariadb gtid set may have only domain-server-sequence
|
|
func ParseMariadbGTIDSet(str string) (GTIDSet, error) {
|
|
if len(str) == 0 {
|
|
return MariadbGTID{0, 0, 0}, nil
|
|
}
|
|
|
|
seps := strings.Split(str, "-")
|
|
|
|
var gtid MariadbGTID
|
|
|
|
if len(seps) != 3 {
|
|
return gtid, errors.Errorf("invalid Mariadb GTID %v, must domain-server-sequence", str)
|
|
}
|
|
|
|
domainID, err := strconv.ParseUint(seps[0], 10, 32)
|
|
if err != nil {
|
|
return gtid, errors.Errorf("invalid MariaDB GTID Domain ID (%v): %v", seps[0], err)
|
|
}
|
|
|
|
serverID, err := strconv.ParseUint(seps[1], 10, 32)
|
|
if err != nil {
|
|
return gtid, errors.Errorf("invalid MariaDB GTID Server ID (%v): %v", seps[1], err)
|
|
}
|
|
|
|
sequenceID, err := strconv.ParseUint(seps[2], 10, 64)
|
|
if err != nil {
|
|
return gtid, errors.Errorf("invalid MariaDB GTID Sequence number (%v): %v", seps[2], err)
|
|
}
|
|
|
|
return MariadbGTID{
|
|
DomainID: uint32(domainID),
|
|
ServerID: uint32(serverID),
|
|
SequenceNumber: sequenceID}, nil
|
|
}
|
|
|
|
func (gtid MariadbGTID) String() string {
|
|
if gtid.DomainID == 0 && gtid.ServerID == 0 && gtid.SequenceNumber == 0 {
|
|
return ""
|
|
}
|
|
|
|
return fmt.Sprintf("%d-%d-%d", gtid.DomainID, gtid.ServerID, gtid.SequenceNumber)
|
|
}
|
|
|
|
func (gtid MariadbGTID) Encode() []byte {
|
|
return []byte(gtid.String())
|
|
}
|
|
|
|
func (gtid MariadbGTID) Equal(o GTIDSet) bool {
|
|
other, ok := o.(MariadbGTID)
|
|
if !ok {
|
|
return false
|
|
}
|
|
|
|
return gtid == other
|
|
}
|
|
|
|
func (gtid MariadbGTID) Contain(o GTIDSet) bool {
|
|
other, ok := o.(MariadbGTID)
|
|
if !ok {
|
|
return false
|
|
}
|
|
|
|
return gtid.DomainID == other.DomainID && gtid.SequenceNumber >= other.SequenceNumber
|
|
}
|