bool xRedisClient::strlen(const RedisDBIdx& dbi,const string& key, int& length) {
    int64_t intval = 0;
    SETDEFAULTIOTYPE(SLAVE);
    bool bRet = command_integer(dbi, intval, "STRLEN %s", key.c_str());
    length = (int)intval;
    return bRet;
}
bool xRedisClient::setrange(const RedisDBIdx& dbi,const string& key,  int offset, const string& value, int& length) {
    int64_t intval = 0;
    SETDEFAULTIOTYPE(MASTER);
    bool bRet = command_integer(dbi, intval, "setrange %s %d %s", key.c_str(), offset, value.c_str());
    length = (int)intval;
    return bRet;
}
bool xRedisClient::bitpos(const RedisDBIdx& dbi, const string& key, int bit, int64_t& pos, int start, int end) {
    SETDEFAULTIOTYPE(SLAVE);
    if ( (start!=0)||(end!=0) ) {
        return command_integer(dbi, pos, "BITPOS %s %d %d %d", key.c_str(), bit, start, end);
    } 
    return command_integer(dbi, pos, "BITPOS %s %d", key.c_str(), bit);
}
bool xRedisClient::spop(const RedisDBIdx& dbi,  const KEY& key, VALUE& member) {
	if (0 == key.length()) {
		return false;
	}
	SETDEFAULTIOTYPE(MASTER);
	return command_string(dbi, member, "SPOP %s", key.c_str());
}
bool xRedisClient::rpushx(const RedisDBIdx& dbi,   const string& key, const string& value, int64_t& length) {
	if (0 == key.length()) {
		return false;
	}
	SETDEFAULTIOTYPE(MASTER);
	return command_integer(dbi, length, "RPUSHX %s %s", key.c_str(), value.c_str());
}
 bool xRedisClient::zscore(const RedisDBIdx& dbi,  const string& key, const string &member, string& score ){
     if (0==key.length()) {
         return false;
     }
     SETDEFAULTIOTYPE(SLAVE);
     return command_string(dbi, score, "ZSCORE %s %s", key.c_str(), member.c_str());
 }
bool xRedisClient::mget(const DBIArray &vdbi,   const KEYS &  keys, ReplyData& vDdata) {
    bool bRet = false;
    size_t n = vdbi.size();
    if (n!=keys.size()) {
        return bRet;
    }
    
    DataItem item;
    DBIArray::const_iterator iter_dbi = vdbi.begin();
    KEYS::const_iterator iter_key = keys.begin();
    for (;iter_key!=keys.end();++iter_key, ++iter_dbi) {
        const RedisDBIdx& dbi = *iter_dbi;
        SETDEFAULTIOTYPE(SLAVE);
        const string &key = *iter_key;
        if (key.length()>0) {
            bool ret = command_string(*iter_dbi, item.str, "GET %s", key.c_str());
            if (!ret) {
                item.type = REDIS_REPLY_NIL;
                item.str  = "";
            } else {
                item.type = REDIS_REPLY_STRING;
                bRet = true;
            }
            vDdata.push_back(item);
        }
    }
    return bRet;
}
bool xRedisClient::getbit( const RedisDBIdx& dbi, const string& key, int& offset, int& bit ) {
    SETDEFAULTIOTYPE(SLAVE);
    int64_t intval = 0;
    bool bRet = command_integer(dbi, intval, "GETBIT %s %d", key.c_str(), offset);
    bit = (int)intval;
    return bRet;
}
bool xRedisClient::lrange(const RedisDBIdx& dbi,    const string& key, int64_t start, int64_t end, ArrayReply& array) {
	if (0 == key.length()) {
		return false;
	}
	SETDEFAULTIOTYPE(SLAVE);
	return command_array(dbi, array, "LRANGE %s %lld %lld", key.c_str(), start, end);
}
bool xRedisClient::smembers(const RedisDBIdx& dbi,  const KEY& key, VALUES& vValue) {
	if (0 == key.length()) {
		return false;
	}
	SETDEFAULTIOTYPE(SLAVE);
	return command_list(dbi, vValue, "SMEMBERS %s", key.c_str());
}
bool xRedisClient::lrem(const RedisDBIdx& dbi, const string& key, int count, const string& value, int64_t num) {
	if (0 == key.length()) {
		return false;
	}
	SETDEFAULTIOTYPE(MASTER);
	return command_integer(dbi, num, "LREM %s %d %s", key.c_str(), count, value.c_str());
}
bool xRedisClient::zremrangebyrank(const RedisDBIdx& dbi,  const string& key, int start, int stop, int64_t& count) {
    if (0==key.length()) {
        return false;
    }
    SETDEFAULTIOTYPE(MASTER);
    return command_integer(dbi, count, "ZREMRANGEBYRANK %s %d %d", key.c_str(), start, stop);
}
bool xRedisClient::lset(const RedisDBIdx& dbi, const string& key, int index, const string& value) {
	if (0 == key.length()) {
		return false;
	}
	SETDEFAULTIOTYPE(MASTER);
	return command_status(dbi, "LSET %s %d %s", key.c_str(), index, value.c_str());
}
bool xRedisClient::zincrby(const RedisDBIdx& dbi,  const string& key, const double &increment, const string& member, string& value ) {
    if (0==key.length()) {
        return false;
    }
    SETDEFAULTIOTYPE(MASTER);
    return command_string(dbi, value, "ZINCRBY %s %f %s", key.c_str(), increment, member.c_str());
}
bool xRedisClient::rpoplpush(const RedisDBIdx& dbi,    const string& key_src, const string& key_dest, string& value) {
	if ((0 == key_src.length()) || (0 == key_dest.length())) {
		return false;
	}
	SETDEFAULTIOTYPE(MASTER);
	return command_string(dbi, value, "RPOPLPUSH %s %s", key_src.c_str(), key_dest.c_str());
}
bool xRedisClient::zscrad(const RedisDBIdx& dbi,     const string& key, int64_t& count){
    if (0==key.length()) {
        return false;
    }
    SETDEFAULTIOTYPE(SLAVE);
    return command_integer(dbi, count, "ZSCRAD %s", key.c_str());
}
bool xRedisClient::ltrim(const RedisDBIdx& dbi, const string& key, int start, int end) {
	if (0 == key.length()) {
		return false;
	}
	SETDEFAULTIOTYPE(MASTER);
	return command_status(dbi, "LTRIM %s %d %d", key.c_str(), start, end);
}
bool xRedisClient::rpop(const RedisDBIdx& dbi,    const string& key, string& value) {
	if (0 == key.length()) {
		return false;
	}
	SETDEFAULTIOTYPE(MASTER);
	return command_string(dbi, value, "RPOP %s", key.c_str());
}
 bool xRedisClient::zrevrank(const RedisDBIdx& dbi,  const string& key, const string &member, int64_t& rank){
     if (0==key.length()) {
         return false;
     }
     SETDEFAULTIOTYPE(SLAVE);
     return command_integer(dbi, rank, "ZREVRANK %s %s", key.c_str(), member.c_str());
 }
bool xRedisClient::llen(const RedisDBIdx& dbi,    const string& key, int64_t& retval) {
	if (0 == key.length()) {
		return false;
	}
	SETDEFAULTIOTYPE(SLAVE);
	return command_integer(dbi, retval, "LLEN %s", key.c_str());
}
bool xRedisClient::smove(const RedisDBIdx& dbi,  const KEY& srckey, const KEY& deskey,  const VALUE& member) {
	if (0 == srckey.length()) {
		return false;
	}
	SETDEFAULTIOTYPE(MASTER);
	return command_bool(dbi, "SMOVE %s", srckey.c_str(), deskey.c_str(), member.c_str());
}
bool xRedisClient::lindex(const RedisDBIdx& dbi,    const string& key, int64_t index, VALUE& value) {
	if (0 == key.length()) {
		return false;
	}
	SETDEFAULTIOTYPE(SLAVE);
	return command_string(dbi, value, "LINDEX %s %lld", key.c_str(), index);
}
bool xRedisClient::zrem(const RedisDBIdx& dbi,        const KEY& key, const VALUES& vmembers, int64_t &count) {
    VDATA vCmdData;
    vCmdData.push_back("ZREM");
    vCmdData.push_back(key);
    addparam(vCmdData, vmembers);
    SETDEFAULTIOTYPE(MASTER);
    return commandargv_integer(dbi, vCmdData, count);
}
bool xRedisClient::hdel(const RedisDBIdx& dbi,    const string& key, const KEYS& vfiled, int64_t& count) {
    VDATA vCmdData;
    vCmdData.push_back("HDEL");
    vCmdData.push_back(key);
    addparam(vCmdData, vfiled);
    SETDEFAULTIOTYPE(MASTER);
    return commandargv_integer(dbi, vCmdData, count);
}
bool xRedisClient::set(const RedisDBIdx& dbi, const string& key, const char *value, int len, int second) {
    SETDEFAULTIOTYPE(MASTER);
    if (0==second) {
        return command_bool(dbi, "set %s %b", key.c_str(), value, len);
    } else {
        return command_bool(dbi, "set %s %b EX %d", key.c_str(), value, len, second);
    }
}
bool xRedisClient::linsert(const RedisDBIdx& dbi,    const string& key, const LMODEL mod, const string& pivot, const string& value, int64_t& retval) {
	static const char *lmodel[2] = {"BEFORE", "AFTER"};
	if (0 == key.length()) {
		return false;
	}
	SETDEFAULTIOTYPE(MASTER);
	return command_integer(dbi, retval, "LINSERT %s %s %s %s", key.c_str(), lmodel[mod], pivot.c_str(), value.c_str());
}
bool xRedisClient::hmset(const RedisDBIdx& dbi,    const string& key, const VDATA& vData){
    VDATA vCmdData;
    vCmdData.push_back("HMSET");
    vCmdData.push_back(key);
    addparam(vCmdData, vData);
    SETDEFAULTIOTYPE(MASTER);
    return commandargv_status(dbi, vCmdData);
}
bool xRedisClient::hmget(const RedisDBIdx& dbi,    const string& key, const KEYS& field, ArrayReply& array){
    VDATA vCmdData;
    vCmdData.push_back("HMGET");
    vCmdData.push_back(key);
    addparam(vCmdData, field);
    SETDEFAULTIOTYPE(SLAVE);
    return commandargv_array(dbi, vCmdData, array);
}
bool xRedisClient::set(const RedisDBIdx& dbi,    const string& key,  const string& value) {
    VDATA vCmdData;
    vCmdData.push_back("SET");
    vCmdData.push_back(key);
    vCmdData.push_back(value);
    SETDEFAULTIOTYPE(MASTER);
    return commandargv_status(dbi, vCmdData);
}
bool xRedisClient::echo(const RedisDBIdx& dbi, const string& str, std::string &value)
{
	if (0==str.length()) {
        return false;
    }
    SETDEFAULTIOTYPE(MASTER);
    return command_string(dbi, value, "echo %s", str.c_str());
}