pkg/tm/context.go (163 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package tm
import (
"context"
"seata.apache.org/seata-go/pkg/protocol/message"
"seata.apache.org/seata-go/pkg/rm/tcc/fence/enum"
)
type ContextParam string
const (
seataContextVariable = ContextParam("seataContextVariable")
)
type GlobalTransaction struct {
Xid string
XidCopy string
TxName string
// TxStatus Identify a global transaction in a certain status
TxStatus message.GlobalStatus
// TxRole Roles in the transaction propagation behavior
TxRole GlobalTransactionRole
}
type BusinessActionContext struct {
Xid string
BranchId int64
ActionName string
IsDelayReport bool
IsUpdated bool
ActionContext map[string]interface{}
}
type ContextVariable struct {
FencePhase enum.FencePhase
FenceTxBegined bool
BusinessActionContext *BusinessActionContext
// GlobalTransaction Represent seata ctx is a global transaction
GlobalTransaction
}
func InitSeataContext(ctx context.Context) context.Context {
return context.WithValue(ctx, seataContextVariable, &ContextVariable{})
}
func GetTxStatus(ctx context.Context) *message.GlobalStatus {
variable := ctx.Value(seataContextVariable)
if variable == nil {
return nil
}
return &variable.(*ContextVariable).TxStatus
}
func SetTxStatus(ctx context.Context, status message.GlobalStatus) {
variable := ctx.Value(seataContextVariable)
if variable != nil {
variable.(*ContextVariable).TxStatus = status
}
}
func GetTxName(ctx context.Context) string {
variable := ctx.Value(seataContextVariable)
if variable == nil {
return ""
}
return variable.(*ContextVariable).TxName
}
func SetTxName(ctx context.Context, name string) {
variable := ctx.Value(seataContextVariable)
if variable != nil {
variable.(*ContextVariable).TxName = name
}
}
func IsSeataContext(ctx context.Context) bool {
return ctx.Value(seataContextVariable) != nil
}
func GetBusinessActionContext(ctx context.Context) *BusinessActionContext {
variable := ctx.Value(seataContextVariable)
if variable == nil {
return nil
}
return variable.(*ContextVariable).BusinessActionContext
}
func SetBusinessActionContext(ctx context.Context, businessActionContext *BusinessActionContext) {
variable := ctx.Value(seataContextVariable)
if variable != nil {
variable.(*ContextVariable).BusinessActionContext = businessActionContext
}
}
func GetTxRole(ctx context.Context) *GlobalTransactionRole {
variable := ctx.Value(seataContextVariable)
if variable == nil {
return nil
}
return &variable.(*ContextVariable).TxRole
}
func SetTxRole(ctx context.Context, role GlobalTransactionRole) {
variable := ctx.Value(seataContextVariable)
if variable != nil {
variable.(*ContextVariable).TxRole = role
}
}
func IsGlobalTx(ctx context.Context) bool {
variable := ctx.Value(seataContextVariable)
if variable == nil {
return false
}
return variable.(*ContextVariable).Xid != ""
}
func GetXID(ctx context.Context) string {
variable := ctx.Value(seataContextVariable)
if variable == nil {
return ""
}
xid := variable.(*ContextVariable).Xid
if xid == "" {
xid = variable.(*ContextVariable).XidCopy
}
return xid
}
func SetXID(ctx context.Context, xid string) {
variable := ctx.Value(seataContextVariable)
if variable != nil {
variable.(*ContextVariable).Xid = xid
}
}
func SetXIDCopy(ctx context.Context, xid string) {
variable := ctx.Value(seataContextVariable)
if variable != nil {
variable.(*ContextVariable).XidCopy = xid
}
}
func UnbindXid(ctx context.Context) {
variable := ctx.Value(seataContextVariable)
if variable != nil {
variable.(*ContextVariable).Xid = ""
variable.(*ContextVariable).XidCopy = ""
}
}
func SetTx(ctx context.Context, tx *GlobalTransaction) {
variable := ctx.Value(seataContextVariable)
if variable != nil {
variable.(*ContextVariable).GlobalTransaction = *tx
}
}
func GetTx(ctx context.Context) (tx *GlobalTransaction) {
variable := ctx.Value(seataContextVariable)
if variable != nil {
tx = &variable.(*ContextVariable).GlobalTransaction
}
return
}
func SetFencePhase(ctx context.Context, phase enum.FencePhase) {
variable := ctx.Value(seataContextVariable)
if variable != nil {
variable.(*ContextVariable).FencePhase = phase
}
}
func GetFencePhase(ctx context.Context) enum.FencePhase {
variable := ctx.Value(seataContextVariable)
if variable != nil {
return variable.(*ContextVariable).FencePhase
}
return enum.FencePhaseNotExist
}
func SetFenceTxBeginedFlag(ctx context.Context, fenceTxBegined bool) {
if variable := ctx.Value(seataContextVariable); variable != nil {
variable.(*ContextVariable).FenceTxBegined = fenceTxBegined
}
}
func IsFenceTxBegin(ctx context.Context) bool {
if variable := ctx.Value(seataContextVariable); variable != nil {
return variable.(*ContextVariable).FenceTxBegined
}
return false
}