brain remembers latest events (note design-problem: does not distinguish between...
[svn42.git] / go / r3-eventbroker_zmq / smallbrain.go
1 // (c) Bernhard Tittelbach, 2013
2
3 package main
4
5 import (
6     zmq "github.com/vaughan0/go-zmq"
7     "./r3events"
8     "log"
9 )
10
11 type hippocampus map[string]interface{}
12
13 func BrainCenter( zmq_ctx *zmq.Context, listen_addr string, event_chan <- chan interface{} ) {
14     zbrain_chans, err := ZmqsBindNewReplySocket(zmq_ctx, listen_addr)
15     if err != nil { panic(err) }
16     defer zbrain_chans.Close()
17     h := make(hippocampus,5)
18
19     for { select {
20         case event, ec_still_open := <- event_chan:
21             if ! ec_still_open { return }
22             h[r3events.NameOfStruct(event)] = event
23             log.Printf("Brain: stored %s, %s", r3events.NameOfStruct(event), event)
24
25         case brain_request := <- zbrain_chans.In():
26             if len(brain_request) == 0 { continue }
27             requested_eventname := string(brain_request[0])
28             log.Printf("Brain: received request: %s", requested_eventname)
29             retr_event, is_in_map := h[requested_eventname]
30             if is_in_map {
31                 data, err := r3events.MarshalEvent2ByteByte(retr_event)
32                 if err == nil {
33                     zbrain_chans.Out() <- data
34                     continue
35                 } else {
36                     if Syslog_ != nil {Syslog_.Print("BrainCenter", err)}
37                 }
38             }
39             zbrain_chans.Out() <- [][]byte{[]byte("UNKNOWN")}
40     } }
41 }