From 707fb39975d97d47ba148a41301dfa75d903a1a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= Date: Mon, 20 Jan 2020 12:15:23 -0500 Subject: [PATCH] net: fix sending query in sendGetValues --- include/opendht/value.h | 2 ++ src/dht.cpp | 2 +- src/network_engine.cpp | 33 +++++++++++++++++++-------------- src/value.cpp | 4 ++-- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/include/opendht/value.h b/include/opendht/value.h index f430c7af..5cfe69fa 100644 --- a/include/opendht/value.h +++ b/include/opendht/value.h @@ -770,6 +770,8 @@ struct OPENDHT_PUBLIC Select return ss.str(); } + bool empty() const { return fieldSelection_.empty(); } + OPENDHT_PUBLIC friend std::ostream& operator<<(std::ostream& s, const dht::Select& q); private: std::vector fieldSelection_ {}; diff --git a/src/dht.cpp b/src/dht.cpp index c749ab0b..388f515e 100644 --- a/src/dht.cpp +++ b/src/dht.cpp @@ -370,7 +370,7 @@ Dht::searchSendGetValues(Sp sr, SearchNode* pn, bool update) if (not n) continue; - if (query and not query->select.getSelection().empty()) { + if (query and not query->select.empty()) { /* The request contains a select. No need to paginate... */ /* if (logger_) logger_->d(sr->id, n->node->id, "[search %s] [node %s] sending 'get'", diff --git a/src/network_engine.cpp b/src/network_engine.cpp index b050fc70..d6a3129e 100644 --- a/src/network_engine.cpp +++ b/src/network_engine.cpp @@ -763,22 +763,27 @@ NetworkEngine::sendGetValues(Sp n, const InfoHash& info_hash, const Query& msgpack::packer pk(&buffer); pk.pack_map(5+(config.network?1:0)); - pk.pack(KEY_A); pk.pack_map(2 + - (query.where.getFilter() or not query.select.getSelection().empty() ? 1:0) + - (want>0?1:0)); + unsigned sendQuery = (not query.where.empty() or not query.select.empty()) ? 1 : 0; + unsigned sendWant = (want > 0) ? 1 : 0; + + pk.pack(KEY_A); pk.pack_map(2 + sendQuery + sendWant); pk.pack(KEY_REQ_ID); pk.pack(myid); pk.pack(KEY_REQ_H); pk.pack(info_hash); - pk.pack(KEY_Q); pk.pack(query); - if (want > 0) { - pk.pack(KEY_REQ_WANT); - pk.pack_array(((want & WANT4)?1:0) + ((want & WANT6)?1:0)); - if (want & WANT4) pk.pack(AF_INET); - if (want & WANT6) pk.pack(AF_INET6); - } + if (sendQuery) { + pk.pack(KEY_Q); pk.pack(query); + } + if (sendWant) { + pk.pack(KEY_REQ_WANT); + unsigned sendWant4 = (want & WANT4) ? 1 : 0; + unsigned sendWant6 = (want & WANT6) ? 1 : 0; + pk.pack_array(sendWant4 + sendWant6); + if (sendWant4) pk.pack(AF_INET); + if (sendWant6) pk.pack(AF_INET6); + } pk.pack(KEY_Q); pk.pack(QUERY_GET); pk.pack(KEY_TID); pk.pack_bin(tid.size()); - pk.pack_bin_body((const char*)tid.data(), tid.size()); + pk.pack_bin_body((const char*)tid.data(), tid.size()); pk.pack(KEY_Y); pk.pack(KEY_Q); pk.pack(KEY_UA); pk.pack(my_v); if (config.network) { @@ -943,10 +948,10 @@ NetworkEngine::sendNodesValues(const SockAddr& addr, Tid tid, const Blob& nodes, } std::vector svals {}; if (not st.empty()) { /* pack complete values */ - auto fields = query.select.getSelection(); - if (fields.empty()) { + if (query.select.empty()) { svals = packValueHeader(buffer, st); } else { /* pack fields */ + auto fields = query.select.getSelection(); pk.pack(KEY_REQ_FIELDS); pk.pack_map(2); pk.pack(std::string("f")); pk.pack(fields); @@ -1057,7 +1062,7 @@ NetworkEngine::sendListen(Sp n, msgpack::packer pk(&buffer); pk.pack_map(5+(config.network?1:0)); - auto has_query = query.where.getFilter() or not query.select.getSelection().empty(); + auto has_query = not query.where.empty() or not query.select.empty(); pk.pack(KEY_A); pk.pack_map(4 + has_query); pk.pack(KEY_REQ_ID); pk.pack(myid); pk.pack(KEY_REQ_H); pk.pack(hash); diff --git a/src/value.cpp b/src/value.cpp index 88570224..2fcb028d 100644 --- a/src/value.cpp +++ b/src/value.cpp @@ -297,8 +297,8 @@ FieldValue::getLocalFilter() const FieldValueIndex::FieldValueIndex(const Value& v, const Select& s) { - auto selection = s.getSelection(); - if (not selection.empty()) { + if (not s.empty()) { + auto selection = s.getSelection(); std::transform(selection.begin(), selection.end(), std::inserter(index, index.end()), [](const std::set::value_type& f) { return std::make_pair(f, FieldValue {});