| 94 | } |
| 95 | |
| 96 | func (fsm *fsmManager) stateMachineRunnerFor(currentState string, typeName string, machineId int64) (*loopfsm.FSM, error) { |
| 97 | |
| 98 | s, v, err := statementbuilder.Squirrel. |
| 99 | Select("initial_state", "events").From("smd").Prepared(true). |
| 100 | Where(goqu.Ex{"id": machineId}).ToSQL() |
| 101 | if err != nil { |
| 102 | return nil, err |
| 103 | } |
| 104 | |
| 105 | var jsonValue string |
| 106 | var initialState string |
| 107 | |
| 108 | stmt1, err := fsm.db.Preparex(s) |
| 109 | if err != nil { |
| 110 | log.Errorf("[104] failed to prepare statment: %v", err) |
| 111 | } |
| 112 | defer func(stmt1 *sqlx.Stmt) { |
| 113 | err := stmt1.Close() |
| 114 | if err != nil { |
| 115 | log.Errorf("failed to close prepared statement: %v", err) |
| 116 | } |
| 117 | }(stmt1) |
| 118 | |
| 119 | err = stmt1.QueryRowx(v...).Scan(&initialState, &jsonValue) |
| 120 | |
| 121 | if currentState == "" { |
| 122 | |
| 123 | if err != nil { |
| 124 | return nil, err |
| 125 | } |
| 126 | currentState = initialState |
| 127 | } |
| 128 | |
| 129 | var events []LoopbackEventDesc |
| 130 | err = json.Unmarshal([]byte(jsonValue), &events) |
| 131 | if err != nil { |
| 132 | return nil, err |
| 133 | } |
| 134 | |
| 135 | listOfEvents := make([]loopfsm.EventDesc, 0) |
| 136 | for _, e := range events { |
| 137 | e1 := loopfsm.EventDesc{ |
| 138 | Name: e.Name, |
| 139 | Src: e.Src, |
| 140 | Dst: e.Dst, |
| 141 | } |
| 142 | listOfEvents = append(listOfEvents, e1) |
| 143 | } |
| 144 | |
| 145 | fsmI := loopfsm.NewFSM(currentState, listOfEvents, map[string]loopfsm.Callback{}) |
| 146 | return fsmI, nil |
| 147 | } |
| 148 | |
| 149 | func (fsm *fsmManager) ApplyEvent(subject map[string]interface{}, stateMachineEvent StateMachineEvent) (string, error) { |
| 150 | |