From 0270648c6c4469d78187efc34429c1bbb6aa66f6 Mon Sep 17 00:00:00 2001 From: yedf2 <120050102@qq.com> Date: Wed, 4 Aug 2021 11:58:25 +0800 Subject: [PATCH] dtmcli no gin dependency --- dtmcli/barrier.go | 9 --------- dtmcli/tcc.go | 12 ++++++------ dtmcli/types.go | 10 +++++----- dtmcli/xa.go | 18 ++++++++++++------ examples/main_saga_barrier.go | 8 ++++---- examples/main_tcc.go | 2 +- examples/main_tcc_barrier.go | 12 ++++++------ examples/main_xa.go | 4 ++-- examples/types.go | 7 +++++++ 9 files changed, 43 insertions(+), 39 deletions(-) diff --git a/dtmcli/barrier.go b/dtmcli/barrier.go index d278a5f..9872078 100644 --- a/dtmcli/barrier.go +++ b/dtmcli/barrier.go @@ -6,8 +6,6 @@ import ( "encoding/json" "fmt" "net/url" - - "github.com/gin-gonic/gin" ) // BusiFunc type for busi func @@ -25,13 +23,6 @@ func (t *TransInfo) String() string { return fmt.Sprintf("transInfo: %s %s %s %s", t.TransType, t.Gid, t.BranchID, t.BranchType) } -// MustGetTrans construct transaction info from request -func MustGetTrans(c *gin.Context) *TransInfo { - ti, err := TransInfoFromQuery(c.Request.URL.Query()) - e2p(err) - return ti -} - // TransInfoFromQuery construct transaction info from request func TransInfoFromQuery(qs url.Values) (*TransInfo, error) { ti := &TransInfo{ diff --git a/dtmcli/tcc.go b/dtmcli/tcc.go index 35afc00..2cfbefe 100644 --- a/dtmcli/tcc.go +++ b/dtmcli/tcc.go @@ -2,8 +2,8 @@ package dtmcli import ( "fmt" + "net/url" - "github.com/gin-gonic/gin" "github.com/go-resty/resty/v2" ) @@ -47,14 +47,14 @@ func TccGlobalTransaction(dtm string, gid string, tccFunc TccGlobalFunc) (rerr e return } -// TccFromReq tcc from request info -func TccFromReq(c *gin.Context) (*Tcc, error) { +// TccFromQuery tcc from request info +func TccFromQuery(qs url.Values) (*Tcc, error) { tcc := &Tcc{ - TransBase: *TransBaseFromReq(c), - Gid: c.Query("gid"), + TransBase: *TransBaseFromQuery(qs), + Gid: qs.Get("gid"), } if tcc.Dtm == "" || tcc.Gid == "" { - return nil, fmt.Errorf("bad tcc info. dtm: %s, gid: %s", tcc.Dtm, tcc.Gid) + return nil, fmt.Errorf("bad tcc info. dtm: %s, gid: %s parentID: %s", tcc.Dtm, tcc.Gid, tcc.parentID) } return tcc, nil } diff --git a/dtmcli/types.go b/dtmcli/types.go index 8b97770..a8dc62e 100644 --- a/dtmcli/types.go +++ b/dtmcli/types.go @@ -4,9 +4,9 @@ import ( "database/sql" "errors" "fmt" + "net/url" "strings" - "github.com/gin-gonic/gin" "github.com/go-resty/resty/v2" ) @@ -146,11 +146,11 @@ type TransBase struct { WaitResult bool } -// TransBaseFromReq construct xa info from request -func TransBaseFromReq(c *gin.Context) *TransBase { +// TransBaseFromQuery construct transaction info from request +func TransBaseFromQuery(qs url.Values) *TransBase { return &TransBase{ - IDGenerator: IDGenerator{parentID: c.Query("branch_id")}, - Dtm: c.Query("dtm"), + IDGenerator: IDGenerator{parentID: qs.Get("branch_id")}, + Dtm: qs.Get("dtm"), } } diff --git a/dtmcli/xa.go b/dtmcli/xa.go index aed9cb8..35928da 100644 --- a/dtmcli/xa.go +++ b/dtmcli/xa.go @@ -5,7 +5,6 @@ import ( "fmt" "net/url" - "github.com/gin-gonic/gin" "github.com/go-resty/resty/v2" ) @@ -33,9 +32,13 @@ type Xa struct { TransBase } -// XaFromReq construct xa info from request -func XaFromReq(c *gin.Context) *Xa { - return &Xa{TransBase: *TransBaseFromReq(c), Gid: c.Query("gid")} +// XaFromQuery construct xa info from request +func XaFromQuery(qs url.Values) (*Xa, error) { + xa := &Xa{TransBase: *TransBaseFromQuery(qs), Gid: qs.Get("gid")} + if xa.Gid == "" || xa.parentID == "" { + return nil, fmt.Errorf("bad xa info: gid: %s parentid: %s", xa.Gid, xa.parentID) + } + return xa, nil } // NewXaClient construct a xa client @@ -64,8 +67,11 @@ func (xc *XaClient) HandleCallback(gid string, branchID string, action string) ( } // XaLocalTransaction start a xa local transaction -func (xc *XaClient) XaLocalTransaction(c *gin.Context, xaFunc XaLocalFunc) (ret interface{}, rerr error) { - xa := XaFromReq(c) +func (xc *XaClient) XaLocalTransaction(qs url.Values, xaFunc XaLocalFunc) (ret interface{}, rerr error) { + xa, rerr := XaFromQuery(qs) + if rerr != nil { + return + } xa.Dtm = xc.Server branchID := xa.NewBranchID() xaBranch := xa.Gid + "-" + branchID diff --git a/examples/main_saga_barrier.go b/examples/main_saga_barrier.go index b35ccf3..133d7f8 100644 --- a/examples/main_saga_barrier.go +++ b/examples/main_saga_barrier.go @@ -41,13 +41,13 @@ func sagaBarrierTransIn(c *gin.Context) (interface{}, error) { if req.TransInResult != "" { return req.TransInResult, nil } - return dtmcli.ThroughBarrierCall(sdbGet(), dtmcli.MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { + return dtmcli.ThroughBarrierCall(sdbGet(), MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { return sagaBarrierAdjustBalance(sdb, 1, req.Amount) }) } func sagaBarrierTransInCompensate(c *gin.Context) (interface{}, error) { - return dtmcli.ThroughBarrierCall(sdbGet(), dtmcli.MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { + return dtmcli.ThroughBarrierCall(sdbGet(), MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { return sagaBarrierAdjustBalance(sdb, 1, -reqFrom(c).Amount) }) } @@ -57,13 +57,13 @@ func sagaBarrierTransOut(c *gin.Context) (interface{}, error) { if req.TransInResult != "" { return req.TransInResult, nil } - return dtmcli.ThroughBarrierCall(sdbGet(), dtmcli.MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { + return dtmcli.ThroughBarrierCall(sdbGet(), MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { return sagaBarrierAdjustBalance(sdb, 2, -req.Amount) }) } func sagaBarrierTransOutCompensate(c *gin.Context) (interface{}, error) { - return dtmcli.ThroughBarrierCall(sdbGet(), dtmcli.MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { + return dtmcli.ThroughBarrierCall(sdbGet(), MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { return sagaBarrierAdjustBalance(sdb, 2, reqFrom(c).Amount) }) } diff --git a/examples/main_tcc.go b/examples/main_tcc.go index 3f7ef09..ad574c1 100644 --- a/examples/main_tcc.go +++ b/examples/main_tcc.go @@ -10,7 +10,7 @@ import ( // TccSetup 1 func TccSetup(app *gin.Engine) { app.POST(BusiAPI+"/TransInTccParent", common.WrapHandler(func(c *gin.Context) (interface{}, error) { - tcc, err := dtmcli.TccFromReq(c) + tcc, err := dtmcli.TccFromQuery(c.Request.URL.Query()) e2p(err) dtmcli.Logf("TransInTccParent ") return tcc.CallBranch(&TransReq{Amount: reqFrom(c).Amount}, Busi+"/TransIn", Busi+"/TransInConfirm", Busi+"/TransInRevert") diff --git a/examples/main_tcc_barrier.go b/examples/main_tcc_barrier.go index 4c52a09..c5e8eba 100644 --- a/examples/main_tcc_barrier.go +++ b/examples/main_tcc_barrier.go @@ -64,19 +64,19 @@ func tccBarrierTransInTry(c *gin.Context) (interface{}, error) { if req.TransInResult != "" { return req.TransInResult, nil } - return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), dtmcli.MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { + return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { return adjustTrading(sdb, transInUID, req.Amount) }) } func tccBarrierTransInConfirm(c *gin.Context) (interface{}, error) { - return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), dtmcli.MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { + return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { return adjustBalance(sdb, transInUID, reqFrom(c).Amount) }) } func tccBarrierTransInCancel(c *gin.Context) (interface{}, error) { - return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), dtmcli.MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { + return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { return adjustTrading(sdb, transInUID, -reqFrom(c).Amount) }) } @@ -86,20 +86,20 @@ func tccBarrierTransOutTry(c *gin.Context) (interface{}, error) { if req.TransInResult != "" { return req.TransInResult, nil } - return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), dtmcli.MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { + return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { return adjustTrading(sdb, transOutUID, -req.Amount) }) } func tccBarrierTransOutConfirm(c *gin.Context) (interface{}, error) { - return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), dtmcli.MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { + return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { return adjustBalance(sdb, transOutUID, -reqFrom(c).Amount) }) } // TccBarrierTransOutCancel will be use in test func TccBarrierTransOutCancel(c *gin.Context) (interface{}, error) { - return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), dtmcli.MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { + return dtmcli.ThroughBarrierCall(dbGet().ToSQLDB(), MustGetTrans(c), func(sdb *sql.Tx) (interface{}, error) { return adjustTrading(sdb, transOutUID, reqFrom(c).Amount) }) } diff --git a/examples/main_xa.go b/examples/main_xa.go index c7890da..ebd2994 100644 --- a/examples/main_xa.go +++ b/examples/main_xa.go @@ -40,7 +40,7 @@ func XaFireRequest() string { } func xaTransIn(c *gin.Context) (interface{}, error) { - return XaClient.XaLocalTransaction(c, func(db *sql.DB, xa *dtmcli.Xa) (interface{}, error) { + return XaClient.XaLocalTransaction(c.Request.URL.Query(), func(db *sql.DB, xa *dtmcli.Xa) (interface{}, error) { if reqFrom(c).TransInResult == "FAILURE" { return dtmcli.ResultFailure, nil } @@ -50,7 +50,7 @@ func xaTransIn(c *gin.Context) (interface{}, error) { } func xaTransOut(c *gin.Context) (interface{}, error) { - return XaClient.XaLocalTransaction(c, func(db *sql.DB, xa *dtmcli.Xa) (interface{}, error) { + return XaClient.XaLocalTransaction(c.Request.URL.Query(), func(db *sql.DB, xa *dtmcli.Xa) (interface{}, error) { if reqFrom(c).TransOutResult == "FAILURE" { return dtmcli.ResultFailure, nil } diff --git a/examples/types.go b/examples/types.go index 44192b0..f3cd218 100644 --- a/examples/types.go +++ b/examples/types.go @@ -66,3 +66,10 @@ func dbGet() *common.DB { func sdbGet() *sql.DB { return dtmcli.SdbGet(config.DB) } + +// MustGetTrans construct transaction info from request +func MustGetTrans(c *gin.Context) *dtmcli.TransInfo { + ti, err := dtmcli.TransInfoFromQuery(c.Request.URL.Query()) + e2p(err) + return ti +}