57 lines
1.7 KiB
Go
57 lines
1.7 KiB
Go
package dtmsvr
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/yedf/dtm/dtmcli"
|
|
"gorm.io/gorm/clause"
|
|
)
|
|
|
|
func svcSubmit(t *TransGlobal, waitResult bool) (interface{}, error) {
|
|
db := dbGet()
|
|
dbt := TransFromDb(db, t.Gid)
|
|
if dbt != nil && dbt.Status != "prepared" && dbt.Status != "submitted" {
|
|
return M{"dtm_result": "FAILURE", "message": fmt.Sprintf("current status %s, cannot sumbmit", dbt.Status)}, nil
|
|
}
|
|
t.Status = "submitted"
|
|
t.saveNew(db)
|
|
return t.Process(db, waitResult), nil
|
|
|
|
}
|
|
|
|
func svcPrepare(t *TransGlobal) (interface{}, error) {
|
|
t.Status = "prepared"
|
|
t.saveNew(dbGet())
|
|
return dtmcli.ResultSuccess, nil
|
|
}
|
|
|
|
func svcAbort(t *TransGlobal, waitResult bool) (interface{}, error) {
|
|
db := dbGet()
|
|
dbt := TransFromDb(db, t.Gid)
|
|
if t.TransType != "xa" && t.TransType != "tcc" || dbt.Status != "prepared" && dbt.Status != "aborting" {
|
|
return M{"dtm_result": "FAILURE", "message": fmt.Sprintf("trans type: %s current status %s, cannot abort", dbt.TransType, dbt.Status)}, nil
|
|
}
|
|
return dbt.Process(db, waitResult), nil
|
|
}
|
|
|
|
func svcRegisterTccBranch(branch *TransBranch, data dtmcli.MS) (interface{}, error) {
|
|
db := dbGet()
|
|
dbt := TransFromDb(db, branch.Gid)
|
|
if dbt.Status != "prepared" {
|
|
return M{"dtm_result": "FAILURE", "message": fmt.Sprintf("current status: %s cannot register branch", dbt.Status)}, nil
|
|
}
|
|
|
|
branches := []TransBranch{*branch, *branch, *branch}
|
|
for i, b := range []string{"cancel", "confirm", "try"} {
|
|
branches[i].BranchType = b
|
|
branches[i].URL = data[b]
|
|
}
|
|
|
|
db.Must().Clauses(clause.OnConflict{
|
|
DoNothing: true,
|
|
}).Create(branches)
|
|
global := TransGlobal{Gid: branch.Gid}
|
|
global.touch(dbGet(), config.TransCronInterval)
|
|
return dtmcli.ResultSuccess, nil
|
|
}
|