28 lines
1.2 KiB
Go
28 lines
1.2 KiB
Go
package store
|
|
|
|
// ListCleanupCandidates snapshots one bounded, stable-key page. Pending and
|
|
// unknown executions are not candidates; missing confirmations stay protected
|
|
// by the same transactional qualification used for real-time cleanup.
|
|
func (s *Store) ListCleanupCandidates(dispatcherID, afterType, afterID string) ([]OutboxEvent, error) {
|
|
rows, err := s.db.Query(`SELECT event_type,event_id FROM (
|
|
SELECT 'call.execute' AS event_type,event_id FROM dispatcher_inbox
|
|
WHERE dispatcher_id=? AND status IN ('finished','rejected','suppressed')
|
|
UNION
|
|
SELECT event_type,event_id FROM dispatcher_outbox WHERE dispatcher_id=? AND confirmed=1
|
|
AND event_type IN ('call.execute','call.execute.result','task.control','sip.config')
|
|
) WHERE event_type>? OR (event_type=? AND event_id>?) ORDER BY event_type,event_id LIMIT ?`, dispatcherID, dispatcherID, afterType, afterType, afterID, cleanupBatchSize)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var candidates []OutboxEvent
|
|
for rows.Next() {
|
|
event := OutboxEvent{}
|
|
if err := rows.Scan(&event.EventType, &event.EventID); err != nil {
|
|
return nil, err
|
|
}
|
|
candidates = append(candidates, event)
|
|
}
|
|
return candidates, rows.Err()
|
|
}
|