dtmcli no gin dependency
This commit is contained in:
parent
3ddcee2878
commit
0270648c6c
@ -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{
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
18
dtmcli/xa.go
18
dtmcli/xa.go
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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")
|
||||||
|
|||||||
@ -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)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user