diff --git a/etcd/Client.hpp b/etcd/Client.hpp index 3cd23e6..a0c68b0 100644 --- a/etcd/Client.hpp +++ b/etcd/Client.hpp @@ -16,6 +16,8 @@ using grpc::CompletionQueue; using grpc::Status; using etcdserverpb::PutRequest; using etcdserverpb::PutResponse; +using etcdserverpb::RangeRequest; +using etcdserverpb::RangeResponse; using etcdserverpb::KV; namespace etcd @@ -147,6 +149,7 @@ namespace etcd std::unique_ptr stub_; pplx::task send_put(const std::string& key, const std::string& value); + pplx::task send_get(std::string const & key); }; class AsyncPutResponse @@ -159,6 +162,17 @@ namespace etcd std::unique_ptr> response_reader; Response ParseResponse(); }; + + class AsyncRangeResponse + { + public: + RangeResponse reply; + Status status; + ClientContext context; + CompletionQueue cq_; + std::unique_ptr> response_reader; + Response ParseResponse(); + }; } #endif diff --git a/src/Client.cpp b/src/Client.cpp index 3036416..f0f6e90 100644 --- a/src/Client.cpp +++ b/src/Client.cpp @@ -33,8 +33,7 @@ pplx::task etcd::Client::send_put_request(web::http::uri_builder pplx::task etcd::Client::get(std::string const & key) { - web::http::uri_builder uri("/v2/keys" + key); - return send_get_request(uri); + return send_get(key); } pplx::task etcd::Client::set(std::string const & key, std::string const & value) @@ -137,9 +136,61 @@ pplx::task etcd::Client::watch(std::string const & key, int from etcd::Response etcd::AsyncPutResponse::ParseResponse() { + std::cout << reply.header().revision() << std::endl; return etcd::Response(); } +etcd::Response etcd::AsyncRangeResponse::ParseResponse() +{ + mvccpb::KeyValue kvs; + if(reply.kvs_size()) + { + int index=0; + do + { + kvs = reply.kvs(index++); + std::cout< etcd::Client::send_get(std::string const & key) +{ + RangeRequest request; + request.set_key(key); + + etcd::AsyncRangeResponse* call= new etcd::AsyncRangeResponse(); + + call->response_reader = stub_->AsyncRange(&call->context,request,&call->cq_); + + call->response_reader->Finish(&call->reply, &call->status, (void*)call); + + return pplx::task([call]() + { + void* got_tag; + bool ok = false; + etcd::Response resp; + + //blocking + call->cq_.Next(&got_tag, &ok); + GPR_ASSERT(got_tag == (void*)call); + GPR_ASSERT(ok); + + etcd::AsyncRangeResponse* call = static_cast(got_tag); + if(call->status.ok()) + { + resp = call->ParseResponse(); + } + + delete call; + return resp; + }); +} + pplx::task etcd::Client::send_put(std::string const & key, std::string const & value) {