forked from fastio/1store
-
Notifications
You must be signed in to change notification settings - Fork 0
/
redis_protocol.cc
72 lines (67 loc) · 2.45 KB
/
redis_protocol.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
* This file is open source software, licensed to you under the terms
* of the Apache License, Version 2.0 (the "License"). See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. You may not use this file except in compliance with the License.
*
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* Copyright (c) 2016-2026, Peng Jian, [email protected]. All rights reserved.
*
*/
#include "redis_protocol.hh"
#include "redis.hh"
#include "base.hh"
#include <algorithm>
#include "redis_commands.hh"
namespace redis {
redis_protocol::redis_protocol(sharded_redis& redis) : _redis(redis)
{
}
void redis_protocol::prepare_request()
{
_command_args._command_args_count = _parser._args_count - 1;
_command_args._command = std::move(_parser._command);
_command_args._command_args = std::move(_parser._args_list);
}
future<> redis_protocol::handle(input_stream<char>& in, output_stream<char>& out)
{
_parser.init();
return in.consume(_parser).then([this, &out] () -> future<> {
switch (_parser._state) {
case redis_protocol_parser::state::eof:
return make_ready_future<>();
case redis_protocol_parser::state::error:
return out.write(msg_err);
case redis_protocol_parser::state::ok:
{
prepare_request();
if (_command_args._command_args_count <= 0 || _command_args._command_args.empty()) {
return out.write(msg_err);
}
sstring& command = _command_args._command;
std::transform(command.begin(), command.end(), command.begin(), ::toupper);
auto command_handler = redis_commands_ptr()->get(_command_args._command);
return command_handler( _command_args, out);
}
};
std::abort();
}).then_wrapped([this, &out] (auto&& f) -> future<> {
try {
f.get();
} catch (std::bad_alloc& e) {
return out.write(msg_err);
}
return make_ready_future<>();
});
}
}