diff --git a/dtmcli/message.go b/dtmcli/message.go index 61c962a..0809def 100644 --- a/dtmcli/message.go +++ b/dtmcli/message.go @@ -8,8 +8,7 @@ type Msg struct { // MsgData msg data type MsgData struct { - Gid string `json:"gid"` - TransType string `json:"trans_type"` + TransData Steps []MsgStep `json:"steps"` QueryPrepared string `json:"query_prepared"` } @@ -23,10 +22,10 @@ type MsgStep struct { // NewMsg create new msg func NewMsg(server string, gid string) *Msg { return &Msg{ - MsgData: MsgData{ + MsgData: MsgData{TransData: TransData{ Gid: gid, TransType: "msg", - }, + }}, TransBase: TransBase{ Dtm: server, }, diff --git a/dtmcli/saga.go b/dtmcli/saga.go index f92c4c6..d94e8f4 100644 --- a/dtmcli/saga.go +++ b/dtmcli/saga.go @@ -8,9 +8,8 @@ type Saga struct { // SagaData sage data type SagaData struct { - Gid string `json:"gid"` - TransType string `json:"trans_type"` - Steps []SagaStep `json:"steps"` + TransData + Steps []SagaStep `json:"steps"` } // SagaStep one step of saga @@ -23,10 +22,10 @@ type SagaStep struct { // NewSaga create a saga func NewSaga(server string, gid string) *Saga { return &Saga{ - SagaData: SagaData{ + SagaData: SagaData{TransData: TransData{ Gid: gid, TransType: "saga", - }, + }}, TransBase: TransBase{ Dtm: server, }, diff --git a/dtmcli/tcc.go b/dtmcli/tcc.go index 2cfbefe..692c818 100644 --- a/dtmcli/tcc.go +++ b/dtmcli/tcc.go @@ -9,7 +9,7 @@ import ( // Tcc struct of tcc type Tcc struct { - Gid string + TransData TransBase } @@ -21,12 +21,8 @@ type TccGlobalFunc func(tcc *Tcc) (*resty.Response, error) // gid 全局事务id // tccFunc tcc事务函数,里面会定义全局事务的分支 func TccGlobalTransaction(dtm string, gid string, tccFunc TccGlobalFunc) (rerr error) { - data := &M{ - "gid": gid, - "trans_type": "tcc", - } - tcc := &Tcc{TransBase: TransBase{Dtm: dtm}, Gid: gid} - rerr = tcc.CallDtm(data, "prepare") + tcc := &Tcc{TransBase: TransBase{Dtm: dtm}, TransData: TransData{Gid: gid, TransType: "tcc"}} + rerr = tcc.CallDtm(&tcc.TransData, "prepare") if rerr != nil { return rerr } @@ -34,7 +30,7 @@ func TccGlobalTransaction(dtm string, gid string, tccFunc TccGlobalFunc) (rerr e defer func() { x := recover() operation := If(x == nil && rerr == nil, "submit", "abort").(string) - err := tcc.CallDtm(data, operation) + err := tcc.CallDtm(&tcc.TransData, operation) if rerr == nil { rerr = err } @@ -51,7 +47,7 @@ func TccGlobalTransaction(dtm string, gid string, tccFunc TccGlobalFunc) (rerr e func TccFromQuery(qs url.Values) (*Tcc, error) { tcc := &Tcc{ TransBase: *TransBaseFromQuery(qs), - Gid: qs.Get("gid"), + TransData: TransData{Gid: qs.Get("gid"), TransType: "tcc"}, } if tcc.Dtm == "" || tcc.Gid == "" { return nil, fmt.Errorf("bad tcc info. dtm: %s, gid: %s parentID: %s", tcc.Dtm, tcc.Gid, tcc.parentID) diff --git a/dtmcli/types.go b/dtmcli/types.go index 1d95054..2b61c19 100644 --- a/dtmcli/types.go +++ b/dtmcli/types.go @@ -46,6 +46,12 @@ type TransResult struct { Message string } +// TransData 每个全局事务都有的数据 +type TransData struct { + Gid string `json:"gid"` + TransType string `json:"trans_type"` +} + // TransBase 事务的基础类 type TransBase struct { IDGenerator diff --git a/dtmcli/xa.go b/dtmcli/xa.go index e590368..1d4ecfc 100644 --- a/dtmcli/xa.go +++ b/dtmcli/xa.go @@ -26,13 +26,13 @@ type XaClient struct { // Xa xa transaction type Xa struct { - Gid string + TransData TransBase } // XaFromQuery construct xa info from request func XaFromQuery(qs url.Values) (*Xa, error) { - xa := &Xa{TransBase: *TransBaseFromQuery(qs), Gid: qs.Get("gid")} + xa := &Xa{TransBase: *TransBaseFromQuery(qs), TransData: TransData{Gid: qs.Get("gid"), TransType: "xa"}} if xa.Gid == "" || xa.parentID == "" { return nil, fmt.Errorf("bad xa info: gid: %s parentid: %s", xa.Gid, xa.parentID) } @@ -109,12 +109,8 @@ func (xc *XaClient) XaLocalTransaction(qs url.Values, xaFunc XaLocalFunc) (ret i // XaGlobalTransaction start a xa global transaction func (xc *XaClient) XaGlobalTransaction(gid string, xaFunc XaGlobalFunc) (rerr error) { - xa := Xa{TransBase: TransBase{IDGenerator: IDGenerator{}, Dtm: xc.Server}, Gid: gid} - data := &M{ - "gid": gid, - "trans_type": "xa", - } - rerr = xa.CallDtm(data, "prepare") + xa := Xa{TransBase: TransBase{IDGenerator: IDGenerator{}, Dtm: xc.Server}, TransData: TransData{Gid: gid, TransType: "xa"}} + rerr = xa.CallDtm(&xa.TransData, "prepare") if rerr != nil { return } @@ -123,7 +119,7 @@ func (xc *XaClient) XaGlobalTransaction(gid string, xaFunc XaGlobalFunc) (rerr e defer func() { x := recover() operation := If(x != nil || rerr != nil, "abort", "submit").(string) - err := xa.CallDtm(data, operation) + err := xa.CallDtm(&xa.TransData, operation) if rerr == nil { // 如果用户函数没有返回错误,那么返回dtm的 rerr = err }