Пример #1
0
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
	}
}