func handleConnection(c net.Conn, dbase *metastore.MetaStore) { defer closeConnection(c) fromAddr := c.RemoteAddr() log.Printf("[%s] new connection\n", fromAddr) buf := make([]byte, 1024) bucketIndex := dbase.GetHasher() NEXTMESSAGE: _, err := c.Read(buf) if err != nil { return } msg, err := Parse(buf) if err != nil { return } i := bucketIndex(msg.key) switch msg.cmd { case GET: if value, ok := (*dbase).Bucket[i].Get(string(msg.key)); ok { b := []byte(value) b = append(b, EOM) _, err = c.Write(b) } else { _, err = c.Write([]byte{EOM}) } if err != nil { return } goto NEXTMESSAGE case SET: (*dbase).Bucket[i].Set(string(msg.key), string(msg.arg)) _, err = c.Write([]byte{SUCCESS}) if err != nil { return } goto NEXTMESSAGE case DEL: (*dbase).Bucket[i].Delete(string(msg.key)) _, err = c.Write([]byte{SUCCESS}) if err != nil { return } goto NEXTMESSAGE case PUB: (*dbase).Bucket[i].Publish(string(msg.key), string(msg.arg)) _, err = c.Write([]byte{SUCCESS}) if err != nil { return } goto NEXTMESSAGE case SUB: outgoing := make(chan string) (*dbase).Bucket[i].Subscribe(string(msg.key), outgoing) for value := range outgoing { b := []byte(value) b = append(b, EOM) _, err := c.Write(b) if err != nil { close(outgoing) return } } default: return } }