(ctx context.Context, jobId string, updateBlock bool)
| 1455 | } |
| 1456 | |
| 1457 | func DetachJobFromBlock(ctx context.Context, jobId string, updateBlock bool) error { |
| 1458 | var blockId string |
| 1459 | var blockUpdated bool |
| 1460 | err := wstore.WithTx(ctx, func(tx *wstore.TxWrap) error { |
| 1461 | job, err := wstore.DBMustGet[*waveobj.Job](tx.Context(), jobId) |
| 1462 | if err != nil { |
| 1463 | return fmt.Errorf("failed to get job: %w", err) |
| 1464 | } |
| 1465 | |
| 1466 | blockId = job.AttachedBlockId |
| 1467 | if blockId == "" { |
| 1468 | return nil |
| 1469 | } |
| 1470 | |
| 1471 | if updateBlock { |
| 1472 | block, err := wstore.DBGet[*waveobj.Block](tx.Context(), blockId) |
| 1473 | if err == nil && block != nil { |
| 1474 | err = wstore.DBUpdateFn(tx.Context(), blockId, func(block *waveobj.Block) { |
| 1475 | block.JobId = "" |
| 1476 | }) |
| 1477 | if err != nil { |
| 1478 | log.Printf("[job:%s] warning: failed to clear JobId from block:%s: %v", jobId, blockId, err) |
| 1479 | } else { |
| 1480 | blockUpdated = true |
| 1481 | } |
| 1482 | } |
| 1483 | } |
| 1484 | |
| 1485 | err = wstore.DBUpdateFn(tx.Context(), jobId, func(job *waveobj.Job) { |
| 1486 | job.AttachedBlockId = "" |
| 1487 | }) |
| 1488 | if err != nil { |
| 1489 | return fmt.Errorf("failed to update job: %w", err) |
| 1490 | } |
| 1491 | |
| 1492 | log.Printf("[job:%s] detached from block:%s", jobId, blockId) |
| 1493 | return nil |
| 1494 | }) |
| 1495 | if err != nil { |
| 1496 | return err |
| 1497 | } |
| 1498 | |
| 1499 | if blockId != "" { |
| 1500 | SendBlockJobStatusEvent(ctx, blockId) |
| 1501 | if blockUpdated { |
| 1502 | wcore.SendWaveObjUpdate(waveobj.MakeORef(waveobj.OType_Block, blockId)) |
| 1503 | } |
| 1504 | } |
| 1505 | |
| 1506 | return nil |
| 1507 | } |
| 1508 | |
| 1509 | func SendInput(ctx context.Context, data wshrpc.CommandJobInputData) error { |
| 1510 | jobId := data.JobId |
no test coverage detected