pkg/datasource/sql/xa_branch_xid.go (83 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sql
import (
"strconv"
"strings"
)
const (
branchIdPrefix = "-"
)
type XABranchXid struct {
xid string
branchId uint64
globalTransactionId []byte
branchQualifier []byte
}
type Option func(*XABranchXid)
func NewXABranchXid(opt ...Option) *XABranchXid {
xABranchXid := &XABranchXid{}
for _, fn := range opt {
fn(xABranchXid)
}
// encode
if (xABranchXid.xid != "" || xABranchXid.branchId != 0) &&
len(xABranchXid.globalTransactionId) == 0 &&
len(xABranchXid.branchQualifier) == 0 {
encode(xABranchXid)
}
// decode
if xABranchXid.xid == "" && xABranchXid.branchId == 0 &&
(len(xABranchXid.globalTransactionId) > 0 || len(xABranchXid.branchQualifier) > 0) {
decode(xABranchXid)
}
return xABranchXid
}
func (x *XABranchXid) GetGlobalXid() string {
return x.xid
}
func (x *XABranchXid) GetBranchId() uint64 {
return x.branchId
}
func (x *XABranchXid) GetGlobalTransactionId() []byte {
return x.globalTransactionId
}
func (x *XABranchXid) GetBranchQualifier() []byte {
return x.branchQualifier
}
func (x *XABranchXid) String() string {
return x.xid + branchIdPrefix + strconv.FormatUint(x.branchId, 10)
}
func WithXid(xid string) Option {
return func(x *XABranchXid) {
x.xid = xid
}
}
func WithBranchId(branchId uint64) Option {
return func(x *XABranchXid) {
x.branchId = branchId
}
}
func WithGlobalTransactionId(globalTransactionId []byte) Option {
return func(x *XABranchXid) {
x.globalTransactionId = globalTransactionId
}
}
func WithBranchQualifier(branchQualifier []byte) Option {
return func(x *XABranchXid) {
x.branchQualifier = branchQualifier
}
}
func encode(x *XABranchXid) {
if x.xid != "" {
x.globalTransactionId = []byte(x.xid)
}
if x.branchId != 0 {
x.branchQualifier = []byte(branchIdPrefix + strconv.FormatUint(x.branchId, 10))
}
}
func decode(x *XABranchXid) {
if len(x.globalTransactionId) > 0 {
x.xid = string(x.globalTransactionId)
}
if len(x.branchQualifier) > 0 {
branchId := strings.TrimLeft(string(x.branchQualifier), branchIdPrefix)
x.branchId, _ = strconv.ParseUint(branchId, 10, 64)
}
}