| 26 | } |
| 27 | |
| 28 | func (fsm *fsmManager) getStateMachineInstance(objType string, objId int64, machineInstanceId daptinid.DaptinReferenceId) (StateMachineInstance, error) { |
| 29 | |
| 30 | s, v, err := statementbuilder.Squirrel. |
| 31 | Select("current_state", objType+"_smd", "is_state_of_"+objType, "id", "created_at", "permission").Prepared(true). |
| 32 | From(objType + "_state"). |
| 33 | Where(goqu.Ex{"reference_id": machineInstanceId[:]}). |
| 34 | Where(goqu.Ex{"is_state_of_" + objType: objId}).ToSQL() |
| 35 | |
| 36 | var res StateMachineInstance |
| 37 | if err != nil { |
| 38 | log.Errorf("Failed to create query for state select: %v", err) |
| 39 | return res, err |
| 40 | } |
| 41 | |
| 42 | responseMap := make(map[string]interface{}) |
| 43 | |
| 44 | stmt1, err := fsm.db.Preparex(s) |
| 45 | if err != nil { |
| 46 | log.Errorf("[42] failed to prepare statment: %v", err) |
| 47 | } |
| 48 | defer func(stmt1 *sqlx.Stmt) { |
| 49 | err := stmt1.Close() |
| 50 | if err != nil { |
| 51 | log.Errorf("failed to close prepared statement: %v", err) |
| 52 | } |
| 53 | }(stmt1) |
| 54 | |
| 55 | err = stmt1.QueryRowx(v...).MapScan(responseMap) |
| 56 | |
| 57 | if err != nil { |
| 58 | log.Errorf("Failed to map scan state row: %v", err) |
| 59 | return res, err |
| 60 | } |
| 61 | |
| 62 | currentStateString, ok := responseMap["current_state"].(string) |
| 63 | if !ok { |
| 64 | currentStateString = string(responseMap["current_state"].([]uint8)) |
| 65 | } |
| 66 | res.CurrestState = currentStateString |
| 67 | |
| 68 | res.StateMachineId = responseMap[objType+"_smd"].(int64) |
| 69 | res.ObjectId = responseMap["is_state_of_"+objType].(int64) |
| 70 | |
| 71 | return res, nil |
| 72 | } |
| 73 | |
| 74 | type LoopbackEventDesc struct { |
| 75 | // Name is the event name used when calling for a transition. |