Exemple #1
0
// ZSCORE key member
func ZScoreCmd(s Session, args [][]byte) (redis.Resp, error) {
	if v, ok, err := s.Store().ZScore(s.DB(), args); err != nil {
		return toRespError(err)
	} else if !ok {
		return redis.NewBulkBytes(nil), nil
	} else {
		return redis.NewBulkBytes(store.FormatFloat(v)), nil
	}
}
Exemple #2
0
// HGET key field
func HGetCmd(s Session, args [][]byte) (redis.Resp, error) {
	if b, err := s.Store().HGet(s.DB(), args); err != nil {
		return toRespError(err)
	} else {
		return redis.NewBulkBytes(b), nil
	}
}
Exemple #3
0
// ECHO text
func EchoCmd(s Session, args [][]byte) (redis.Resp, error) {
	if len(args) != 1 {
		return toRespErrorf("len(args) = %d, expect = 1", len(args))
	}

	return redis.NewBulkBytes(args[0]), nil
}
Exemple #4
0
// INFO [section]
func InfoCmd(s Session, args [][]byte) (redis.Resp, error) {
	if len(args) != 0 && len(args) != 1 {
		return toRespErrorf("len(args) = %d, expect = 0|1", len(args))
	}

	c, _ := s.(*conn)
	if c == nil {
		return nil, errors.New("invalid connection")
	}

	section := "all"
	if len(args) == 1 {
		section = strings.ToLower(string(args[0]))
	}

	var b bytes.Buffer

	switch section {
	case "database":
		c.h.infoDataBase(&b)
	case "config":
		c.h.infoConfig(&b)
	case "clients":
		c.h.infoClients(&b)
	case "replication":
		c.h.infoReplication(&b)
	default:
		// all
		c.h.infoAll(&b)
	}

	fmt.Fprintf(&b, "\r\n")

	return redis.NewBulkBytes(b.Bytes()), nil
}
Exemple #5
0
// ZINCRBY key delta member
func ZIncrByCmd(s Session, args [][]byte) (redis.Resp, error) {
	if v, err := s.Store().ZIncrBy(s.DB(), args); err != nil {
		return toRespError(err)
	} else {
		return redis.NewBulkBytes(store.FormatFloat(v)), nil
	}
}
Exemple #6
0
// LINDEX key index
func LIndexCmd(s Session, args [][]byte) (redis.Resp, error) {
	if v, err := s.Store().LIndex(s.DB(), args); err != nil {
		return toRespError(err)
	} else {
		return redis.NewBulkBytes(v), nil
	}
}
Exemple #7
0
// SET key value [EX seconds] [PX milliseconds] [NX|XX]
func SetCmd(s Session, args [][]byte) (redis.Resp, error) {
	if err := s.Store().Set(s.DB(), args); err != nil && errors2.ErrorNotEqual(err, store.ErrSetAborted) {
		return toRespError(err)
	} else if errors2.ErrorEqual(err, store.ErrSetAborted) {
		return redis.NewBulkBytes(nil), nil
	} else {
		return redis.NewString("OK"), nil
	}
}
Exemple #8
0
// ZREVRANK key member
func ZRevRankCmd(s Session, args [][]byte) (redis.Resp, error) {
	if v, err := s.Store().ZRevRank(s.DB(), args); err != nil {
		return toRespError(err)
	} else if v >= 0 {
		return redis.NewInt(v), nil
	} else {
		return redis.NewBulkBytes(nil), nil
	}
}
Exemple #9
0
// DUMP key
func DumpCmd(s Session, args [][]byte) (redis.Resp, error) {
	if x, err := s.Store().Dump(s.DB(), args); err != nil {
		return toRespError(err)
	} else if dump, err := rdb.EncodeDump(x); err != nil {
		return toRespError(err)
	} else {
		return redis.NewBulkBytes(dump), nil
	}
}
Exemple #10
0
func RegisterBulkReply(name string, f CommandBulkStringFunc, flag CommandFlag) {
	v := func(s Session, args [][]byte) (redis.Resp, error) {
		r, err := f(s, args)
		if err != nil {
			return toRespError(err)
		}
		return redis.NewBulkBytes(r), nil
	}

	register(name, v, flag)
}
Exemple #11
0
func (s *testReplSuite) testReplication(c *C, master testReplNode, slave testReplNode) {
	// first let both stop replication
	s.doCmdMustOK(c, master.Port(), "SLAVEOF", "NO", "ONE")
	s.doCmdMustOK(c, slave.Port(), "SLAVEOF", "NO", "ONE")

	s.doCmdMustOK(c, master.Port(), "SET", "a", "100")

	offset := int64(-1)
	// slaveof, will do full sync first, must support psync
	nc := slave.Slaveof(c, master.Port())
	defer nc.Close(c)

	s.waitAndCheckSyncOffset(c, slave, offset)

	resp := s.doCmd(c, slave.Port(), "GET", "a")
	c.Assert(slave.SyncOffset(c), Not(Equals), int64(-1))
	c.Assert(resp, DeepEquals, redis.NewBulkBytesWithString("100"))

	// write to a slave, must error
	resp = s.doCmd(c, slave.Port(), "SET", "e", "1")
	c.Assert(resp, FitsTypeOf, (*redis.Error)(nil))
	c.Assert(resp.(*redis.Error).Value, Matches, "READONLY.*")

	s.doCmdMustOK(c, master.Port(), "SET", "b", "100")

	time.Sleep(500 * time.Millisecond)
	resp = s.doCmd(c, slave.Port(), "GET", "b")
	c.Assert(resp, DeepEquals, redis.NewBulkBytesWithString("100"))

	s.doCmdMustOK(c, master.Port(), "SET", "c", "")

	// set another value with TTL
	s.doCmdMustOK(c, master.Port(), "SET", "ttl_key", "1", "PX", 100)

	time.Sleep(500 * time.Millisecond)
	resp = s.doCmd(c, slave.Port(), "GET", "c")
	c.Assert(resp, DeepEquals, redis.NewBulkBytesWithString(""))

	// get expired key to let master force delete it
	resp = s.doCmd(c, master.Port(), "GET", "ttl_key")
	c.Assert(resp, DeepEquals, redis.NewBulkBytes(nil))

	time.Sleep(500 * time.Millisecond)

	// the key must be deleted from master repliction
	resp = s.doCmd(c, slave.Port(), "GET", "ttl_key")
	c.Assert(resp, DeepEquals, redis.NewBulkBytes(nil))

	offset = slave.SyncOffset(c)
	// now close replication connection
	nc.Close(c)
	s.doCmdMustOK(c, master.Port(), "SET", "b", "1000")

	s.doCmdMustOK(c, master.Port(), "SET", "c", "123")

	s.waitAndCheckSyncOffset(c, slave, offset)

	resp = s.doCmd(c, slave.Port(), "GET", "b")
	c.Assert(resp, DeepEquals, redis.NewBulkBytesWithString("1000"))

	resp = s.doCmd(c, slave.Port(), "GET", "c")
	c.Assert(resp, DeepEquals, redis.NewBulkBytesWithString("123"))

	s.checkRole(c, master.Port(), "master")
	s.checkRole(c, slave.Port(), "slave")

	s.doCmdMustOK(c, slave.Port(), "SLAVEOF", "NO", "ONE")
	s.doCmdMustOK(c, master.Port(), "SLAVEOF", "NO", "ONE")

	s.checkRole(c, master.Port(), "master")
	s.checkRole(c, slave.Port(), "master")
}