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  }