Fixed bug when only one key is returned during ls().

Instead of placing it in response::value it should be placed in
reponse::values
This commit is contained in:
arches 2016-07-01 10:17:41 -04:00
parent 79f28dce20
commit dd1d01519c
5 changed files with 13 additions and 3 deletions

View File

@ -10,7 +10,7 @@ etcd::Response::Response(const etcdv3::V3Response& reply)
_error_message = reply.error_message; _error_message = reply.error_message;
_action = reply.action; _action = reply.action;
int size = reply.values.size(); int size = reply.values.size();
if(size > 1) if(reply.isPrefix)
{ {
for(int index = 0; index < size; index++) for(int index = 0; index < size; index++)
{ {

View File

@ -189,10 +189,16 @@ TEST_CASE("list a directory")
CHECK(0 == etcd.ls("/test/new_dir").get().keys().size()); CHECK(0 == etcd.ls("/test/new_dir").get().keys().size());
etcd.set("/test/new_dir/key1", "value1").wait(); etcd.set("/test/new_dir/key1", "value1").wait();
etcd::Response resp = etcd.ls("/test/new_dir").get();
CHECK("get" == resp.action());
REQUIRE(1 == resp.keys().size());
CHECK("/test/new_dir/key1" == resp.key(0));
CHECK("value1" == resp.value(0).as_string());
etcd.set("/test/new_dir/key2", "value2").wait(); etcd.set("/test/new_dir/key2", "value2").wait();
etcd.set("/test/new_dir/sub_dir", "value3").wait(); etcd.set("/test/new_dir/sub_dir", "value3").wait();
etcd::Response resp = etcd.ls("/test/new_dir").get(); resp = etcd.ls("/test/new_dir").get();
CHECK("get" == resp.action()); CHECK("get" == resp.action());
REQUIRE(3 == resp.keys().size()); REQUIRE(3 == resp.keys().size());
CHECK("/test/new_dir/key1" == resp.key(0)); CHECK("/test/new_dir/key1" == resp.key(0));

View File

@ -20,6 +20,7 @@ namespace etcdv3
AsyncRangeResponse ParseResponse(); AsyncRangeResponse ParseResponse();
RangeResponse reply; RangeResponse reply;
std::unique_ptr<ClientAsyncResponseReader<RangeResponse>> response_reader; std::unique_ptr<ClientAsyncResponseReader<RangeResponse>> response_reader;
bool prefix;
}; };
} }

View File

@ -9,9 +9,10 @@ namespace etcdv3
class V3Response class V3Response
{ {
public: public:
V3Response(): error_code(0), index(0) {}; V3Response(): error_code(0), index(0), isPrefix(false) {};
int error_code; int error_code;
int index; int index;
bool isPrefix;
std::string error_message; std::string error_message;
std::string action; std::string action;
std::vector<mvccpb::KeyValue> values; std::vector<mvccpb::KeyValue> values;

View File

@ -9,6 +9,7 @@ etcdv3::AsyncGetAction::AsyncGetAction(std::string const & key, KV::Stub* stub_,
get_request.set_key(key); get_request.set_key(key);
if(withPrefix) if(withPrefix)
{ {
prefix = withPrefix;
std::string range_end(key); std::string range_end(key);
int ascii = (int)range_end[range_end.length()-1]; int ascii = (int)range_end[range_end.length()-1];
range_end.back() = ascii+1; range_end.back() = ascii+1;
@ -35,6 +36,7 @@ etcdv3::AsyncRangeResponse etcdv3::AsyncGetAction::ParseResponse()
{ {
range_resp.ParseResponse(); range_resp.ParseResponse();
range_resp.action = etcdv3::GET_ACTION; range_resp.action = etcdv3::GET_ACTION;
range_resp.isPrefix = prefix;
} }
return range_resp; return range_resp;