mariadb_gtid.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package mysql
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "github.com/juju/errors"
  7. )
  8. type MariadbGTID struct {
  9. DomainID uint32
  10. ServerID uint32
  11. SequenceNumber uint64
  12. }
  13. // We don't support multi source replication, so the mariadb gtid set may have only domain-server-sequence
  14. func ParseMariadbGTIDSet(str string) (GTIDSet, error) {
  15. if len(str) == 0 {
  16. return &MariadbGTID{0, 0, 0}, nil
  17. }
  18. seps := strings.Split(str, "-")
  19. gtid := new(MariadbGTID)
  20. if len(seps) != 3 {
  21. return gtid, errors.Errorf("invalid Mariadb GTID %v, must domain-server-sequence", str)
  22. }
  23. domainID, err := strconv.ParseUint(seps[0], 10, 32)
  24. if err != nil {
  25. return gtid, errors.Errorf("invalid MariaDB GTID Domain ID (%v): %v", seps[0], err)
  26. }
  27. serverID, err := strconv.ParseUint(seps[1], 10, 32)
  28. if err != nil {
  29. return gtid, errors.Errorf("invalid MariaDB GTID Server ID (%v): %v", seps[1], err)
  30. }
  31. sequenceID, err := strconv.ParseUint(seps[2], 10, 64)
  32. if err != nil {
  33. return gtid, errors.Errorf("invalid MariaDB GTID Sequence number (%v): %v", seps[2], err)
  34. }
  35. return &MariadbGTID{
  36. DomainID: uint32(domainID),
  37. ServerID: uint32(serverID),
  38. SequenceNumber: sequenceID}, nil
  39. }
  40. func (gtid *MariadbGTID) String() string {
  41. if gtid.DomainID == 0 && gtid.ServerID == 0 && gtid.SequenceNumber == 0 {
  42. return ""
  43. }
  44. return fmt.Sprintf("%d-%d-%d", gtid.DomainID, gtid.ServerID, gtid.SequenceNumber)
  45. }
  46. func (gtid *MariadbGTID) Encode() []byte {
  47. return []byte(gtid.String())
  48. }
  49. func (gtid *MariadbGTID) Equal(o GTIDSet) bool {
  50. other, ok := o.(*MariadbGTID)
  51. if !ok {
  52. return false
  53. }
  54. return *gtid == *other
  55. }
  56. func (gtid *MariadbGTID) Contain(o GTIDSet) bool {
  57. other, ok := o.(*MariadbGTID)
  58. if !ok {
  59. return false
  60. }
  61. return gtid.DomainID == other.DomainID && gtid.SequenceNumber >= other.SequenceNumber
  62. }
  63. func (gtid *MariadbGTID) Update(GTIDStr string) error {
  64. newGTID, err := ParseMariadbGTIDSet(GTIDStr)
  65. if err != nil {
  66. return err
  67. }
  68. *gtid = *(newGTID.(*MariadbGTID))
  69. return nil
  70. }