Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 68 additions & 19 deletions go/mysql/mariadb_gtid.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,16 @@ func parseMariadbGTID(s string) (GTID, error) {

// parseMariadbGTIDSet is registered as a GTIDSet parser.
func parseMariadbGTIDSet(s string) (GTIDSet, error) {
gtid, err := parseMariadbGTID(s)
if err != nil {
return nil, err
gtidStrings := strings.Split(s, ",")
gtidSet := make(MariadbGTIDSet, len(gtidStrings))
for i, gtidString := range gtidStrings {
gtid, err := parseMariadbGTID(gtidString)
if err != nil {
return nil, err
}
gtidSet[i] = gtid.(MariadbGTID)
}
return gtid.(MariadbGTID), err
return gtidSet, nil
}

// MariadbGTID implements GTID.
Expand All @@ -76,6 +81,9 @@ type MariadbGTID struct {
Sequence uint64
}

// MariadbGTIDSet implements GTIDSet
type MariadbGTIDSet []MariadbGTID

// String implements GTID.String().
func (gtid MariadbGTID) String() string {
return fmt.Sprintf("%d-%d-%d", gtid.Domain, gtid.Server, gtid.Sequence)
Expand Down Expand Up @@ -103,49 +111,90 @@ func (gtid MariadbGTID) SequenceNumber() interface{} {

// GTIDSet implements GTID.GTIDSet().
func (gtid MariadbGTID) GTIDSet() GTIDSet {
return gtid
return MariadbGTIDSet{gtid}
}

// String implements GTIDSet.String()
func (gtidSet MariadbGTIDSet) String() string {
s := make([]string, len(gtidSet))
for i, gtid := range gtidSet {
s[i] = gtid.String()
}
return strings.Join(s, ",")
}

// Flavor implements GTIDSet.Flavor()
func (gtidSet MariadbGTIDSet) Flavor() string {
return mariadbFlavorID
}

// ContainsGTID implements GTIDSet.ContainsGTID().
func (gtid MariadbGTID) ContainsGTID(other GTID) bool {
func (gtidSet MariadbGTIDSet) ContainsGTID(other GTID) bool {
if other == nil {
return true
}
mdbOther, ok := other.(MariadbGTID)
if !ok || gtid.Domain != mdbOther.Domain {
if !ok {
return false
}
return gtid.Sequence >= mdbOther.Sequence
for _, gtid := range gtidSet {
if gtid.Domain != mdbOther.Domain {
continue
}
return gtid.Sequence >= mdbOther.Sequence
}
return false
}

// Contains implements GTIDSet.Contains().
func (gtid MariadbGTID) Contains(other GTIDSet) bool {
func (gtidSet MariadbGTIDSet) Contains(other GTIDSet) bool {
if other == nil {
return true
}
mdbOther, ok := other.(MariadbGTID)
if !ok || gtid.Domain != mdbOther.Domain {
mdbOther, ok := other.(MariadbGTIDSet)
if !ok {
return false
}
return gtid.Sequence >= mdbOther.Sequence
for _, gtid := range mdbOther {
if !gtidSet.ContainsGTID(gtid) {
return false
}
}
return true
}

// Equal implements GTIDSet.Equal().
func (gtid MariadbGTID) Equal(other GTIDSet) bool {
mdbOther, ok := other.(MariadbGTID)
func (gtidSet MariadbGTIDSet) Equal(other GTIDSet) bool {
mdbOther, ok := other.(MariadbGTIDSet)
if !ok {
return false
}
return gtid == mdbOther
if len(gtidSet) != len(mdbOther) {
return false
}
for i, gtid := range gtidSet {
if gtid != mdbOther[i] {
return false
}
}
return true
}

// AddGTID implements GTIDSet.AddGTID().
func (gtid MariadbGTID) AddGTID(other GTID) GTIDSet {
func (gtidSet MariadbGTIDSet) AddGTID(other GTID) GTIDSet {
mdbOther, ok := other.(MariadbGTID)
if !ok || gtid.Domain != mdbOther.Domain || gtid.Sequence >= mdbOther.Sequence {
return gtid
if !ok || other == nil {
return gtidSet
}
for i, gtid := range gtidSet {
if mdbOther.Domain == gtid.Domain {
if mdbOther.Sequence > gtid.Sequence {
gtidSet[i] = mdbOther
}
return gtidSet
}
}
return mdbOther
return append(gtidSet, mdbOther)
}

func init() {
Expand Down
Loading