dtmcli no gin dependency

This commit is contained in:
yedf2 2021-08-04 11:58:25 +08:00
parent 3ddcee2878
commit 0270648c6c
9 changed files with 43 additions and 39 deletions

View File

@ -6,8 +6,6 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/url" "net/url"
"github.com/gin-gonic/gin"
) )
// BusiFunc type for busi func // 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) 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 // TransInfoFromQuery construct transaction info from request
func TransInfoFromQuery(qs url.Values) (*TransInfo, error) { func TransInfoFromQuery(qs url.Values) (*TransInfo, error) {
ti := &TransInfo{ ti := &TransInfo{

View File

@ -2,8 +2,8 @@ package dtmcli
import ( import (
"fmt" "fmt"
"net/url"
"github.com/gin-gonic/gin"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
) )
@ -47,14 +47,14 @@ func TccGlobalTransaction(dtm string, gid string, tccFunc TccGlobalFunc) (rerr e
return return
} }
// TccFromReq tcc from request info // TccFromQuery tcc from request info
func TccFromReq(c *gin.Context) (*Tcc, error) { func TccFromQuery(qs url.Values) (*Tcc, error) {
tcc := &Tcc{ tcc := &Tcc{
TransBase: *TransBaseFromReq(c), TransBase: *TransBaseFromQuery(qs),
Gid: c.Query("gid"), Gid: qs.Get("gid"),
} }
if tcc.Dtm == "" || tcc.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 return tcc, nil
} }

View File

@ -4,9 +4,9 @@ import (
"database/sql" "database/sql"
"errors" "errors"
"fmt" "fmt"
"net/url"
"strings" "strings"
"github.com/gin-gonic/gin"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
) )
@ -146,11 +146,11 @@ type TransBase struct {
WaitResult bool WaitResult bool
} }
// TransBaseFromReq construct xa info from request // TransBaseFromQuery construct transaction info from request
func TransBaseFromReq(c *gin.Context) *TransBase { func TransBaseFromQuery(qs url.Values) *TransBase {
return &TransBase{ return &TransBase{
IDGenerator: IDGenerator{parentID: c.Query("branch_id")}, IDGenerator: IDGenerator{parentID: qs.Get("branch_id")},
Dtm: c.Query("dtm"), Dtm: qs.Get("dtm"),
} }
} }

View File

@ -5,7 +5,6 @@ import (
"fmt" "fmt"
"net/url" "net/url"
"github.com/gin-gonic/gin"
"github.com/go-resty/resty/v2" "github.com/go-resty/resty/v2"
) )
@ -33,9 +32,13 @@ type Xa struct {
TransBase TransBase
} }
// XaFromReq construct xa info from request // XaFromQuery construct xa info from request
func XaFromReq(c *gin.Context) *Xa { func XaFromQuery(qs url.Values) (*Xa, error) {
return &Xa{TransBase: *TransBaseFromReq(c), Gid: c.Query("gid")} 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 // 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 // XaLocalTransaction start a xa local transaction
func (xc *XaClient) XaLocalTransaction(c *gin.Context, xaFunc XaLocalFunc) (ret interface{}, rerr error) { func (xc *XaClient) XaLocalTransaction(qs url.Values, xaFunc XaLocalFunc) (ret interface{}, rerr error) {
xa := XaFromReq(c) xa, rerr := XaFromQuery(qs)
if rerr != nil {
return
}
xa.Dtm = xc.Server xa.Dtm = xc.Server
branchID := xa.NewBranchID() branchID := xa.NewBranchID()
xaBranch := xa.Gid + "-" + branchID xaBranch := xa.Gid + "-" + branchID

View File

@ -41,13 +41,13 @@ func sagaBarrierTransIn(c *gin.Context) (interface{}, error) {
if req.TransInResult != "" { if req.TransInResult != "" {
return req.TransInResult, nil 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) return sagaBarrierAdjustBalance(sdb, 1, req.Amount)
}) })
} }
func sagaBarrierTransInCompensate(c *gin.Context) (interface{}, error) { 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) return sagaBarrierAdjustBalance(sdb, 1, -reqFrom(c).Amount)
}) })
} }
@ -57,13 +57,13 @@ func sagaBarrierTransOut(c *gin.Context) (interface{}, error) {
if req.TransInResult != "" { if req.TransInResult != "" {
return req.TransInResult, nil 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) return sagaBarrierAdjustBalance(sdb, 2, -req.Amount)
}) })
} }
func sagaBarrierTransOutCompensate(c *gin.Context) (interface{}, error) { 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) return sagaBarrierAdjustBalance(sdb, 2, reqFrom(c).Amount)
}) })
} }

View File

@ -10,7 +10,7 @@ import (
// TccSetup 1 // TccSetup 1
func TccSetup(app *gin.Engine) { func TccSetup(app *gin.Engine) {
app.POST(BusiAPI+"/TransInTccParent", common.WrapHandler(func(c *gin.Context) (interface{}, error) { 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) e2p(err)
dtmcli.Logf("TransInTccParent ") dtmcli.Logf("TransInTccParent ")
return tcc.CallBranch(&TransReq{Amount: reqFrom(c).Amount}, Busi+"/TransIn", Busi+"/TransInConfirm", Busi+"/TransInRevert") return tcc.CallBranch(&TransReq{Amount: reqFrom(c).Amount}, Busi+"/TransIn", Busi+"/TransInConfirm", Busi+"/TransInRevert")

View File

@ -64,19 +64,19 @@ func tccBarrierTransInTry(c *gin.Context) (interface{}, error) {
if req.TransInResult != "" { if req.TransInResult != "" {
return req.TransInResult, nil 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) return adjustTrading(sdb, transInUID, req.Amount)
}) })
} }
func tccBarrierTransInConfirm(c *gin.Context) (interface{}, error) { 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) return adjustBalance(sdb, transInUID, reqFrom(c).Amount)
}) })
} }
func tccBarrierTransInCancel(c *gin.Context) (interface{}, error) { 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) return adjustTrading(sdb, transInUID, -reqFrom(c).Amount)
}) })
} }
@ -86,20 +86,20 @@ func tccBarrierTransOutTry(c *gin.Context) (interface{}, error) {
if req.TransInResult != "" { if req.TransInResult != "" {
return req.TransInResult, nil 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) return adjustTrading(sdb, transOutUID, -req.Amount)
}) })
} }
func tccBarrierTransOutConfirm(c *gin.Context) (interface{}, error) { 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) return adjustBalance(sdb, transOutUID, -reqFrom(c).Amount)
}) })
} }
// TccBarrierTransOutCancel will be use in test // TccBarrierTransOutCancel will be use in test
func TccBarrierTransOutCancel(c *gin.Context) (interface{}, error) { 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) return adjustTrading(sdb, transOutUID, reqFrom(c).Amount)
}) })
} }

View File

@ -40,7 +40,7 @@ func XaFireRequest() string {
} }
func xaTransIn(c *gin.Context) (interface{}, error) { 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" { if reqFrom(c).TransInResult == "FAILURE" {
return dtmcli.ResultFailure, nil return dtmcli.ResultFailure, nil
} }
@ -50,7 +50,7 @@ func xaTransIn(c *gin.Context) (interface{}, error) {
} }
func xaTransOut(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" { if reqFrom(c).TransOutResult == "FAILURE" {
return dtmcli.ResultFailure, nil return dtmcli.ResultFailure, nil
} }

View File

@ -66,3 +66,10 @@ func dbGet() *common.DB {
func sdbGet() *sql.DB { func sdbGet() *sql.DB {
return dtmcli.SdbGet(config.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
}