コード例 #1
0
ファイル: repl.go プロジェクト: CowLeo/qdb
// ROLE
func RoleCmd(s Session, args [][]byte) (redis.Resp, error) {
	if len(args) != 0 {
		return toRespErrorf("len(args) = %d, expect = 0", len(args))
	}

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

	ay := redis.NewArray()
	if masterAddr := c.h.masterAddr.Get(); masterAddr == "" {
		// master
		ay.Append(redis.NewBulkBytesWithString("master"))
		c.h.repl.RLock()
		defer c.h.repl.RUnlock()

		ay.Append(redis.NewInt(c.h.repl.masterOffset))
		slaves := redis.NewArray()
		for slave, _ := range c.h.repl.slaves {
			a := redis.NewArray()
			if addr := slave.nc.RemoteAddr(); addr == nil {
				continue
			} else {
				a.Append(redis.NewBulkBytesWithString(strings.Split(addr.String(), ":")[0]))
			}
			a.Append(redis.NewBulkBytesWithString(fmt.Sprintf("%d", slave.listeningPort.Get())))
			a.Append(redis.NewBulkBytesWithString(fmt.Sprintf("%d", slave.syncOffset.Get())))
			slaves.Append(a)
		}

		ay.Append(slaves)
	} else {
		// slave
		ay.Append(redis.NewBulkBytesWithString("slave"))
		seps := strings.Split(masterAddr, ":")
		if len(seps) == 2 {
			port, err := strconv.ParseInt(seps[1], 10, 16)
			if err != nil {
				return toRespError(err)
			}
			ay.Append(redis.NewBulkBytesWithString(seps[0]))
			ay.Append(redis.NewInt(int64(port)))
		} else {
			return toRespErrorf("invalid master addr, must ip:port, but %s", masterAddr)
		}
		ay.Append(redis.NewBulkBytesWithString(c.h.masterConnState.Get()))
		ay.Append(redis.NewInt(c.h.syncOffset.Get()))
	}
	return ay, nil
}
コード例 #2
0
ファイル: slots.go プロジェクト: cuiwm/reborn
// SLOTSMGRTTAGONE host port timeout key
func SlotsMgrtTagOneCmd(s Session, args [][]byte) (redis.Resp, error) {
	if n, err := s.Store().SlotsMgrtTagOne(s.DB(), args); err != nil {
		return toRespError(err)
	} else {
		return redis.NewInt(n), nil
	}
}
コード例 #3
0
ファイル: hash.go プロジェクト: cuiwm/reborn
// HINCRBY key field delta
func HIncrByCmd(s Session, args [][]byte) (redis.Resp, error) {
	if v, err := s.Store().HIncrBy(s.DB(), args); err != nil {
		return toRespError(err)
	} else {
		return redis.NewInt(v), nil
	}
}
コード例 #4
0
ファイル: hash.go プロジェクト: cuiwm/reborn
// HLEN key
func HLenCmd(s Session, args [][]byte) (redis.Resp, error) {
	if n, err := s.Store().HLen(s.DB(), args); err != nil {
		return toRespError(err)
	} else {
		return redis.NewInt(n), nil
	}
}
コード例 #5
0
ファイル: hash.go プロジェクト: cuiwm/reborn
// HEXISTS key field
func HExistsCmd(s Session, args [][]byte) (redis.Resp, error) {
	if x, err := s.Store().HExists(s.DB(), args); err != nil {
		return toRespError(err)
	} else {
		return redis.NewInt(x), nil
	}
}
コード例 #6
0
ファイル: zset.go プロジェクト: CowLeo/qdb
// ZREMRANGEBYSCORE key min max
func ZRemRangeByScoreCmd(s Session, args [][]byte) (redis.Resp, error) {
	if v, err := s.Store().ZRemRangeByScore(s.DB(), args); err != nil {
		return toRespError(err)
	} else {
		return redis.NewInt(v), nil
	}
}
コード例 #7
0
ファイル: zset.go プロジェクト: CowLeo/qdb
// 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
	}
}
コード例 #8
0
ファイル: command.go プロジェクト: CowLeo/qdb
func RegisterIntReply(name string, f CommandIntFunc, flag CommandFlag) {
	v := func(s Session, args [][]byte) (redis.Resp, error) {
		r, err := f(s, args)
		if err != nil {
			return toRespError(err)
		}
		return redis.NewInt(r), nil
	}

	register(name, v, flag)
}
コード例 #9
0
ファイル: main_test.go プロジェクト: CowLeo/qdb
func (pc *testPoolConn) checkInt(c *C, expect int64, cmd string, args ...interface{}) {
	resp := pc.doCmd(c, cmd, args...)
	c.Assert(resp, DeepEquals, redis.NewInt(expect))
}