github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/mergeCode/libnetwork/networkdb/watch.go (about) 1 package networkdb 2 3 import "github.com/docker/go-events" 4 5 type opType uint8 6 7 const ( 8 opCreate opType = 1 + iota 9 opUpdate 10 opDelete 11 ) 12 13 type event struct { 14 Table string 15 NetworkID string 16 Key string 17 Value []byte 18 } 19 20 // CreateEvent generates a table entry create event to the watchers 21 type CreateEvent event 22 23 // UpdateEvent generates a table entry update event to the watchers 24 type UpdateEvent event 25 26 // DeleteEvent generates a table entry delete event to the watchers 27 type DeleteEvent event 28 29 // Watch creates a watcher with filters for a particular table or 30 // network or key or any combination of the tuple. If any of the 31 // filter is an empty string it acts as a wildcard for that 32 // field. Watch returns a channel of events, where the events will be 33 // sent. 34 func (nDB *NetworkDB) Watch(tname, nid, key string) (chan events.Event, func()) { 35 var matcher events.Matcher 36 37 if tname != "" || nid != "" || key != "" { 38 matcher = events.MatcherFunc(func(ev events.Event) bool { 39 var evt event 40 switch ev := ev.(type) { 41 case CreateEvent: 42 evt = event(ev) 43 case UpdateEvent: 44 evt = event(ev) 45 case DeleteEvent: 46 evt = event(ev) 47 } 48 49 if tname != "" && evt.Table != tname { 50 return false 51 } 52 53 if nid != "" && evt.NetworkID != nid { 54 return false 55 } 56 57 if key != "" && evt.Key != key { 58 return false 59 } 60 61 return true 62 }) 63 } 64 65 ch := events.NewChannel(0) 66 sink := events.Sink(events.NewQueue(ch)) 67 68 if matcher != nil { 69 sink = events.NewFilter(sink, matcher) 70 } 71 72 nDB.broadcaster.Add(sink) 73 return ch.C, func() { 74 nDB.broadcaster.Remove(sink) 75 ch.Close() 76 sink.Close() 77 } 78 } 79 80 func makeEvent(op opType, tname, nid, key string, value []byte) events.Event { 81 ev := event{ 82 Table: tname, 83 NetworkID: nid, 84 Key: key, 85 Value: value, 86 } 87 88 switch op { 89 case opCreate: 90 return CreateEvent(ev) 91 case opUpdate: 92 return UpdateEvent(ev) 93 case opDelete: 94 return DeleteEvent(ev) 95 } 96 97 return nil 98 }