jamesge commented on a change in pull request #972: Redis server protocol URL: https://github.com/apache/incubator-brpc/pull/972#discussion_r358591199
########## File path: src/brpc/redis_reply.cpp ########## @@ -352,4 +413,52 @@ void RedisReply::CopyFromDifferentArena(const RedisReply& other, } } +bool RedisReply::SetArray(int size) { + if (!_arena || _type != REDIS_REPLY_NIL) { + return false; + } + _type = REDIS_REPLY_ARRAY; + if (size < 0) { + LOG(ERROR) << "negative size=" << size << " when calling SetArray"; + return false; + } else if (size == 0) { + _length = 0; + return true; + } + RedisReply* subs = (RedisReply*)_arena->allocate(sizeof(RedisReply) * size); + if (!subs) { + LOG(FATAL) << "Fail to allocate RedisReply[" << size << "]"; + return false; + } + for (int i = 0; i < size; ++i) { + new (&subs[i]) RedisReply(_arena); + } + _length = size; + _data.array.replies = subs; + return true; +} + +bool RedisReply::SetBasicString(const std::string& str, RedisReplyType type) { + if (!_arena || _type != REDIS_REPLY_NIL) { + return false; + } + const size_t size = str.size(); + if (size < sizeof(_data.short_str)) { + memcpy(_data.short_str, str.c_str(), size); + _data.short_str[size] = '\0'; + } else { + char* d = (char*)_arena->allocate((size/8 + 1) * 8); + if (!d) { + LOG(FATAL) << "Fail to allocate string[" << size << "]"; + return false; + } + memcpy(d, str.c_str(), size); Review comment: 要么取c_str(),拷贝size+1个,要么取data(),拷贝size个 ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@brpc.apache.org For additional commands, e-mail: dev-h...@brpc.apache.org