brain remembers latest events (note design-problem: does not distinguish between...
[svn42.git] / go / r3-eventbroker_zmq / smallbrain.go
diff --git a/go/r3-eventbroker_zmq/smallbrain.go b/go/r3-eventbroker_zmq/smallbrain.go
new file mode 100644 (file)
index 0000000..0996d78
--- /dev/null
@@ -0,0 +1,41 @@
+// (c) Bernhard Tittelbach, 2013
+
+package main
+
+import (
+    zmq "github.com/vaughan0/go-zmq"
+    "./r3events"
+    "log"
+)
+
+type hippocampus map[string]interface{}
+
+func BrainCenter( zmq_ctx *zmq.Context, listen_addr string, event_chan <- chan interface{} ) {
+    zbrain_chans, err := ZmqsBindNewReplySocket(zmq_ctx, listen_addr)
+    if err != nil { panic(err) }
+    defer zbrain_chans.Close()
+    h := make(hippocampus,5)
+
+    for { select {
+        case event, ec_still_open := <- event_chan:
+            if ! ec_still_open { return }
+            h[r3events.NameOfStruct(event)] = event
+            log.Printf("Brain: stored %s, %s", r3events.NameOfStruct(event), event)
+
+        case brain_request := <- zbrain_chans.In():
+            if len(brain_request) == 0 { continue }
+            requested_eventname := string(brain_request[0])
+            log.Printf("Brain: received request: %s", requested_eventname)
+            retr_event, is_in_map := h[requested_eventname]
+            if is_in_map {
+                data, err := r3events.MarshalEvent2ByteByte(retr_event)
+                if err == nil {
+                    zbrain_chans.Out() <- data
+                    continue
+                } else {
+                    if Syslog_ != nil {Syslog_.Print("BrainCenter", err)}
+                }
+            }
+            zbrain_chans.Out() <- [][]byte{[]byte("UNKNOWN")}
+    } }
+}