safing-portbase/database/subscription.go
2020-10-15 11:01:15 +02:00

35 lines
758 B
Go

package database
import (
"github.com/safing/portbase/database/query"
"github.com/safing/portbase/database/record"
)
// Subscription is a database subscription for updates.
type Subscription struct {
q *query.Query
local bool
internal bool
Feed chan record.Record
}
// Cancel cancels the subscription.
func (s *Subscription) Cancel() error {
c, err := getController(s.q.DatabaseName())
if err != nil {
return err
}
c.subscriptionLock.Lock()
defer c.subscriptionLock.Unlock()
for key, sub := range c.subscriptions {
if sub.q == s.q {
c.subscriptions = append(c.subscriptions[:key], c.subscriptions[key+1:]...)
close(s.Feed) // this close is guarded by the controllers subscriptionLock.
return nil
}
}
return nil
}