blob: 0366cadae3a0b2b3182e9e824658fe8193744492 [file] [log] [blame]
package codec
import (
"bytes"
"github.com/dk-lockdown/seata-golang/logging"
"github.com/dk-lockdown/seata-golang/protocal"
"vimagination.zapto.org/byteio"
)
type SerializerType byte
const (
SEATA = byte(0x1)
PROTOBUF = byte(0x2)
KRYO = byte(0x4)
FST = byte(0x8)
)
type Encoder func(in interface{}) []byte
type Decoder func(in []byte) (interface{},int)
func MessageEncoder(codecType byte,in interface{}) []byte {
switch codecType {
case SEATA:
return SeataEncoder(in)
default:
logging.Logger.Errorf("not support codecType, %s",codecType)
return nil
}
}
func MessageDecoder(codecType byte,in []byte) (interface{},int) {
switch codecType {
case SEATA:
return SeataDecoder(in)
default:
logging.Logger.Errorf("not support codecType, %s",codecType)
return nil,0
}
}
func SeataEncoder(in interface{}) []byte {
var result = make([]byte, 0)
msg := in.(protocal.MessageTypeAware)
typeCode := msg.GetTypeCode()
encoder := getMessageEncoder(typeCode)
typeC := uint16(typeCode)
if encoder != nil {
body := encoder(in)
result = append(result,[]byte{ byte(typeC >> 8), byte(typeC) }...)
result = append(result,body...)
}
return result
}
func SeataDecoder(in []byte) (interface{},int) {
r := byteio.BigEndianReader{Reader:bytes.NewReader(in)}
typeCode, _ ,_ := r.ReadInt16()
decoder := getMessageDecoder(typeCode)
if decoder != nil {
return decoder(in[2:])
}
return nil,0
}
func getMessageEncoder(typeCode int16) Encoder {
switch typeCode {
case protocal.TypeSeataMerge:
return MergedWarpMessageEncoder
case protocal.TypeSeataMergeResult:
return MergeResultMessageEncoder
case protocal.TypeRegClt:
return RegisterTMRequestEncoder
case protocal.TypeRegCltResult:
return RegisterTMResponseEncoder
case protocal.TypeRegRm:
return RegisterRMRequestEncoder
case protocal.TypeRegRmResult:
return RegisterRMResponseEncoder
case protocal.TypeBranchCommit:
return BranchCommitRequestEncoder
case protocal.TypeBranchRollback:
return BranchRollbackRequestEncoder
case protocal.TypeGlobalReport:
return GlobalReportRequestEncoder
default:
var encoder Encoder
encoder = getMergeRequestMessageEncoder(typeCode)
if encoder != nil {
return encoder
}
encoder = getMergeResponseMessageEncoder(typeCode)
if encoder != nil {
return encoder
}
logging.Logger.Errorf("not support typeCode, %d",typeCode)
return nil
}
}
func getMergeRequestMessageEncoder(typeCode int16) Encoder {
switch typeCode {
case protocal.TypeGlobalBegin:
return GlobalBeginRequestEncoder
case protocal.TypeGlobalCommit:
return GlobalCommitRequestEncoder
case protocal.TypeGlobalRollback:
return GlobalRollbackRequestEncoder
case protocal.TypeGlobalStatus:
return GlobalStatusRequestEncoder
case protocal.TypeGlobalLockQuery:
return GlobalLockQueryRequestEncoder
case protocal.TypeBranchRegister:
return BranchRegisterRequestEncoder
case protocal.TypeBranchStatusReport:
return BranchReportRequestEncoder
case protocal.TypeGlobalReport:
return GlobalReportRequestEncoder
default:
break
}
return nil
}
func getMergeResponseMessageEncoder(typeCode int16) Encoder {
switch typeCode {
case protocal.TypeGlobalBeginResult:
return GlobalBeginResponseEncoder
case protocal.TypeGlobalCommitResult:
return GlobalCommitResponseEncoder
case protocal.TypeGlobalRollbackResult:
return GlobalRollbackResponseEncoder
case protocal.TypeGlobalStatusResult:
return GlobalStatusResponseEncoder
case protocal.TypeGlobalLockQueryResult:
return GlobalLockQueryResponseEncoder
case protocal.TypeBranchRegisterResult:
return BranchRegisterResponseEncoder
case protocal.TypeBranchStatusReportResult:
return BranchReportResponseEncoder
case protocal.TypeBranchCommitResult:
return BranchCommitResponseEncoder
case protocal.TypeBranchRollbackResult:
return BranchRollbackResponseEncoder
case protocal.TypeGlobalReportResult:
return GlobalReportResponseEncoder
default:
break
}
return nil
}
func getMessageDecoder(typeCode int16) Decoder {
switch typeCode {
case protocal.TypeSeataMerge:
return MergedWarpMessageDecoder
case protocal.TypeSeataMergeResult:
return MergeResultMessageDecoder
case protocal.TypeRegClt:
return RegisterTMRequestDecoder
case protocal.TypeRegCltResult:
return RegisterTMResponseDecoder
case protocal.TypeRegRm:
return RegisterRMRequestDecoder
case protocal.TypeRegRmResult:
return RegisterRMResponseDecoder
case protocal.TypeBranchCommit:
return BranchCommitRequestDecoder
case protocal.TypeBranchRollback:
return BranchRollbackRequestDecoder
case protocal.TypeGlobalReport:
return GlobalReportRequestDecoder
default:
var Decoder Decoder
Decoder = getMergeRequestMessageDecoder(typeCode)
if Decoder != nil {
return Decoder
}
Decoder = getMergeResponseMessageDecoder(typeCode)
if Decoder != nil {
return Decoder
}
logging.Logger.Errorf("not support typeCode, %d",typeCode)
return nil
}
}
func getMergeRequestMessageDecoder(typeCode int16) Decoder {
switch typeCode {
case protocal.TypeGlobalBegin:
return GlobalBeginRequestDecoder
case protocal.TypeGlobalCommit:
return GlobalCommitRequestDecoder
case protocal.TypeGlobalRollback:
return GlobalRollbackRequestDecoder
case protocal.TypeGlobalStatus:
return GlobalStatusRequestDecoder
case protocal.TypeGlobalLockQuery:
return GlobalLockQueryRequestDecoder
case protocal.TypeBranchRegister:
return BranchRegisterRequestDecoder
case protocal.TypeBranchStatusReport:
return BranchReportRequestDecoder
case protocal.TypeGlobalReport:
return GlobalReportRequestDecoder
default:
break
}
return nil
}
func getMergeResponseMessageDecoder(typeCode int16) Decoder {
switch typeCode {
case protocal.TypeGlobalBeginResult:
return GlobalBeginResponseDecoder
case protocal.TypeGlobalCommitResult:
return GlobalCommitResponseDecoder
case protocal.TypeGlobalRollbackResult:
return GlobalRollbackResponseDecoder
case protocal.TypeGlobalStatusResult:
return GlobalStatusResponseDecoder
case protocal.TypeGlobalLockQueryResult:
return GlobalLockQueryResponseDecoder
case protocal.TypeBranchRegisterResult:
return BranchRegisterResponseDecoder
case protocal.TypeBranchStatusReportResult:
return BranchReportResponseDecoder
case protocal.TypeBranchCommitResult:
return BranchCommitResponseDecoder
case protocal.TypeBranchRollbackResult:
return BranchRollbackResponseDecoder
case protocal.TypeGlobalReportResult:
return GlobalReportResponseDecoder
default:
break
}
return nil
}