Commit 36ebd737 authored by liuminghang's avatar liuminghang

fix redis args

parent 87f149c4
......@@ -64,9 +64,13 @@ public:
explicit GetCommandHandler(RedisServiceImpl* rsimpl)
: _rsimpl(rsimpl) {}
brpc::RedisCommandHandlerResult Run(const std::vector<const char*>& args,
brpc::RedisReply* output,
bool /*flush_batched*/) override {
brpc::RedisCommandHandlerResult Run(const std::vector<butil::StringPiece>& args_piece,
brpc::RedisReply* output,
bool flush_batched) override {
std::vector<std::string> args;
for (size_t i = 0; i < args_piece.size(); ++i) {
args.emplace_back(args_piece[i].data(), args_piece.size());
}
if (args.size() != 2ul) {
output->FormatError("Expect 1 arg for 'get', actually %lu", args.size()-1);
return brpc::REDIS_CMD_HANDLED;
......@@ -90,9 +94,13 @@ public:
explicit SetCommandHandler(RedisServiceImpl* rsimpl)
: _rsimpl(rsimpl) {}
brpc::RedisCommandHandlerResult Run(const std::vector<const char*>& args,
brpc::RedisReply* output,
bool /*flush_batched*/) override {
brpc::RedisCommandHandlerResult Run(const std::vector<butil::StringPiece>& args_piece,
brpc::RedisReply* output,
bool flush_batched) override {
std::vector<std::string> args;
for (size_t i = 0; i < args_piece.size(); ++i) {
args.emplace_back(args_piece[i].data(), args_piece.size());
}
if (args.size() != 3ul) {
output->FormatError("Expect 2 args for 'set', actually %lu", args.size()-1);
return brpc::REDIS_CMD_HANDLED;
......
......@@ -76,7 +76,7 @@ public:
};
int ConsumeCommand(RedisConnContext* ctx,
const std::vector<const char*>& commands,
const std::vector<butil::StringPiece>& commands,
bool flush_batched,
butil::IOBufAppender* appender) {
RedisReply output(&ctx->arena);
......@@ -90,10 +90,10 @@ int ConsumeCommand(RedisConnContext* ctx,
return -1;
}
} else {
RedisCommandHandler* ch = ctx->redis_service->FindCommandHandler(commands[0]);
RedisCommandHandler* ch = ctx->redis_service->FindCommandHandler(commands[0].as_string());
if (!ch) {
char buf[64];
snprintf(buf, sizeof(buf), "ERR unknown command `%s`", commands[0]);
snprintf(buf, sizeof(buf), "ERR unknown command `%s`", commands[0].data());
output.SetError(buf);
} else {
result = ch->Run(commands, &output, flush_batched);
......@@ -159,7 +159,7 @@ ParseResult ParseRedisMessage(butil::IOBuf* source, Socket* socket,
ctx = new RedisConnContext(rs);
socket->reset_parsing_context(ctx);
}
std::vector<const char*> current_commands;
std::vector<butil::StringPiece> current_commands;
butil::IOBufAppender appender;
ParseError err = PARSE_OK;
......@@ -168,7 +168,7 @@ ParseResult ParseRedisMessage(butil::IOBuf* source, Socket* socket,
return MakeParseError(err);
}
while (true) {
std::vector<const char*> next_commands;
std::vector<butil::StringPiece> next_commands;
err = ctx->parser.Consume(*source, &next_commands, &ctx->arena);
if (err != PARSE_OK) {
break;
......
......@@ -260,7 +260,7 @@ public:
// an start marker and brpc will call MultiTransactionHandler() to new a transaction
// handler that all the following commands are sent to this tranction handler until
// it returns REDIS_CMD_HANDLED. Read the comment below.
virtual RedisCommandHandlerResult Run(const std::vector<const char*>& args,
virtual RedisCommandHandlerResult Run(const std::vector<butil::StringPiece>& args,
brpc::RedisReply* output,
bool flush_batched) = 0;
......
......@@ -362,7 +362,7 @@ RedisCommandParser::RedisCommandParser()
, _index(0) {}
ParseError RedisCommandParser::Consume(butil::IOBuf& buf,
std::vector<const char*>* commands,
std::vector<butil::StringPiece>* commands,
butil::Arena* arena) {
const char* pfc = (const char*)buf.fetch1();
if (pfc == NULL) {
......@@ -420,7 +420,7 @@ ParseError RedisCommandParser::Consume(butil::IOBuf& buf,
char* d = (char*)arena->allocate((len/8 + 1) * 8);
buf.cutn(d, len);
d[len] = '\0';
_commands[_index] = d;
_commands[_index] = butil::StringPiece(d, len);
if (_index == 0) {
// convert it to lowercase when it is command name
for (int i = 0; i < len; ++i) {
......
......@@ -50,7 +50,7 @@ public:
// Parse raw message from `buf'. Return PARSE_OK and set the parsed command
// to `commands' and length to `len' if successful. Memory of commands are
// allocated in `arena'.
ParseError Consume(butil::IOBuf& buf, std::vector<const char*>* commands,
ParseError Consume(butil::IOBuf& buf, std::vector<butil::StringPiece>* commands,
butil::Arena* arena);
private:
......@@ -60,7 +60,7 @@ private:
bool _parsing_array; // if the parser has met array indicator '*'
int _length; // array length
int _index; // current parsing array index
std::vector<const char*> _commands; // parsed command string
std::vector<butil::StringPiece> _commands; // parsed command string
};
} // namespace brpc
......
......@@ -128,7 +128,7 @@ void AssertReplyEqual(const brpc::RedisReply& reply1,
// fall through
case brpc::REDIS_REPLY_STATUS:
ASSERT_NE(reply1.c_str(), reply2.c_str()); // from different arena
ASSERT_STREQ(reply1.c_str(), reply2.c_str());
ASSERT_EQ(reply1.data(), reply2.data());
break;
case brpc::REDIS_REPLY_ERROR:
ASSERT_NE(reply1.error_message(), reply2.error_message()); // from different arena
......@@ -550,13 +550,13 @@ TEST_F(RedisTest, quote_and_escape) {
request.Clear();
}
std::string GetCompleteCommand(const std::vector<const char*>& commands) {
std::string GetCompleteCommand(const std::vector<butil::StringPiece>& commands) {
std::string res;
for (int i = 0; i < (int)commands.size(); ++i) {
if (i != 0) {
res.push_back(' ');
}
res.append(commands[i]);
res.append(commands[i].data(), commands[i].size());
}
return res;
}
......@@ -565,7 +565,7 @@ std::string GetCompleteCommand(const std::vector<const char*>& commands) {
TEST_F(RedisTest, command_parser) {
brpc::RedisCommandParser parser;
butil::IOBuf buf;
std::vector<const char*> command_out;
std::vector<butil::StringPiece> command_out;
butil::Arena arena;
{
// parse from whole command
......@@ -573,7 +573,7 @@ TEST_F(RedisTest, command_parser) {
ASSERT_TRUE(brpc::RedisCommandNoFormat(&buf, command.c_str()).ok());
ASSERT_EQ(brpc::PARSE_OK, parser.Consume(buf, &command_out, &arena));
ASSERT_TRUE(buf.empty());
ASSERT_STREQ(command.c_str(), GetCompleteCommand(command_out).c_str());
ASSERT_EQ(command, GetCompleteCommand(command_out));
}
{
// simulate parsing from network
......@@ -593,7 +593,7 @@ TEST_F(RedisTest, command_parser) {
}
}
ASSERT_TRUE(buf.empty());
ASSERT_STREQ(GetCompleteCommand(command_out).c_str(), "set abc def");
ASSERT_EQ(GetCompleteCommand(command_out), "set abc def");
}
}
{
......@@ -812,12 +812,12 @@ public:
RedisServiceImpl()
: _batch_count(0) {}
brpc::RedisCommandHandlerResult OnBatched(const std::vector<const char*> args,
brpc::RedisCommandHandlerResult OnBatched(const std::vector<std::string>& args,
brpc::RedisReply* output, bool flush_batched) {
if (_batched_command.empty() && flush_batched) {
if (strcmp(args[0], "set") == 0) {
if (args[0] == "set") {
DoSet(args[1], args[2], output);
} else if (strcmp(args[0], "get") == 0) {
} else if (args[0] == "get") {
DoGet(args[1], output);
}
return brpc::REDIS_CMD_HANDLED;
......@@ -869,9 +869,13 @@ public:
: _rs(rs)
, _batch_process(batch_process) {}
brpc::RedisCommandHandlerResult Run(const std::vector<const char*>& args,
brpc::RedisReply* output,
bool flush_batched) {
brpc::RedisCommandHandlerResult Run(const std::vector<butil::StringPiece>& args_piece,
brpc::RedisReply* output,
bool flush_batched) {
std::vector<std::string> args;
for (size_t i = 0; i < args_piece.size(); ++i) {
args.emplace_back(args_piece[i].data(), args_piece[i].size());
}
if (args.size() < 3) {
output->SetError("ERR wrong number of arguments for 'set' command");
return brpc::REDIS_CMD_HANDLED;
......@@ -900,9 +904,13 @@ public:
: _rs(rs)
, _batch_process(batch_process) {}
brpc::RedisCommandHandlerResult Run(const std::vector<const char*>& args,
brpc::RedisReply* output,
bool flush_batched) {
brpc::RedisCommandHandlerResult Run(const std::vector<butil::StringPiece>& args_piece,
brpc::RedisReply* output,
bool flush_batched) {
std::vector<std::string> args;
for (size_t i = 0; i < args_piece.size(); ++i) {
args.emplace_back(args_piece[i].data(), args_piece[i].size());
}
if (args.size() < 2) {
output->SetError("ERR wrong number of arguments for 'get' command");
return brpc::REDIS_CMD_HANDLED;
......@@ -933,9 +941,13 @@ class IncrCommandHandler : public brpc::RedisCommandHandler {
public:
IncrCommandHandler() {}
brpc::RedisCommandHandlerResult Run(const std::vector<const char*>& args,
brpc::RedisReply* output,
bool flush_batched) {
brpc::RedisCommandHandlerResult Run(const std::vector<butil::StringPiece>& args_piece,
brpc::RedisReply* output,
bool flush_batched) {
std::vector<std::string> args;
for (size_t i = 0; i < args_piece.size(); ++i) {
args.emplace_back(args_piece[i].data(), args_piece[i].size());
}
if (args.size() < 2) {
output->SetError("ERR wrong number of arguments for 'incr' command");
return brpc::REDIS_CMD_HANDLED;
......@@ -1047,9 +1059,9 @@ class MultiCommandHandler : public brpc::RedisCommandHandler {
public:
MultiCommandHandler() {}
brpc::RedisCommandHandlerResult Run(const std::vector<const char*>& args,
brpc::RedisReply* output,
bool flush_batched) {
brpc::RedisCommandHandlerResult Run(const std::vector<butil::StringPiece>& args_piece,
brpc::RedisReply* output,
bool flush_batched) {
output->SetStatus("OK");
return brpc::REDIS_CMD_CONTINUE;
}
......@@ -1060,14 +1072,18 @@ public:
class MultiTransactionHandler : public brpc::RedisCommandHandler {
public:
brpc::RedisCommandHandlerResult Run(const std::vector<const char*>& args,
brpc::RedisReply* output,
bool flush_batched) {
if (strcmp(args[0], "multi") == 0) {
brpc::RedisCommandHandlerResult Run(const std::vector<butil::StringPiece>& args_piece,
brpc::RedisReply* output,
bool flush_batched) {
std::vector<std::string> args;
for (size_t i = 0; i < args_piece.size(); ++i) {
args.emplace_back(args_piece[i].data(), args_piece[i].size());
}
if (args[0] == "multi") {
output->SetError("ERR duplicate multi");
return brpc::REDIS_CMD_CONTINUE;
}
if (strcmp(args[0], "exec") != 0) {
if (args[0] != "exec") {
std::vector<std::string> comm;
for (int i = 0; i < (int)args.size(); ++i) {
comm.push_back(args[i]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment