You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@brpc.apache.org by ja...@apache.org on 2019/04/18 03:55:17 UTC

[incubator-brpc] branch master updated: replace SplitStringIntoKeyValuePairs

This is an automated email from the ASF dual-hosted git repository.

jamesge pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-brpc.git


The following commit(s) were added to refs/heads/master by this push:
     new 9b1f6ad  replace SplitStringIntoKeyValuePairs
     new acce779  Merge pull request #736 from zyearn/replace_kvpair_splitter
9b1f6ad is described below

commit 9b1f6ad02e888136de89cd4bcc6b812b8a6c4d3b
Author: zhujiashun <zh...@gmail.com>
AuthorDate: Wed Apr 17 20:11:22 2019 +0800

    replace SplitStringIntoKeyValuePairs
---
 .../policy/consistent_hashing_load_balancer.cpp    | 20 ++++++++++----------
 src/brpc/uri.h                                     |  6 +++---
 src/butil/string_splitter.h                        | 22 +++++++++++-----------
 src/bvar/variable.cpp                              | 15 ++++++---------
 test/string_splitter_unittest.cpp                  |  6 +++---
 5 files changed, 33 insertions(+), 36 deletions(-)

diff --git a/src/brpc/policy/consistent_hashing_load_balancer.cpp b/src/brpc/policy/consistent_hashing_load_balancer.cpp
index 20a043e..8baacee 100644
--- a/src/brpc/policy/consistent_hashing_load_balancer.cpp
+++ b/src/brpc/policy/consistent_hashing_load_balancer.cpp
@@ -270,10 +270,11 @@ size_t ConsistentHashingLoadBalancer::RemoveServersInBatch(
     return n;
 }
 
-LoadBalancer *ConsistentHashingLoadBalancer::New(const butil::StringPiece& params) const {
+LoadBalancer *ConsistentHashingLoadBalancer::New(
+    const butil::StringPiece& params) const {
     ConsistentHashingLoadBalancer* lb = 
         new (std::nothrow) ConsistentHashingLoadBalancer(_type);
-    if (lb != nullptr && !lb->SetParameters(params)) {
+    if (lb && !lb->SetParameters(params)) {
         delete lb;
         lb = nullptr;
     }
@@ -377,20 +378,19 @@ void ConsistentHashingLoadBalancer::GetLoads(
 }
 
 bool ConsistentHashingLoadBalancer::SetParameters(const butil::StringPiece& params) {
-    for (butil::StringSplitter sp(params.begin(), params.end(), ' '); sp != nullptr; ++sp) {
-        butil::StringPiece key_value(sp.field(), sp.length());
-        size_t p = key_value.find('=');
-        if (p == key_value.npos || p == key_value.size() - 1) {
-            // No value configed.
+    for (butil::KeyValuePairsSplitter sp(params.begin(), params.end(), ' ', '=');
+            sp; ++sp) {
+        if (sp.value().empty()) {
+            LOG(ERROR) << "Empty value for " << sp.key() << " in lb parameter";
             return false;
         }
-        if (key_value.substr(0, p) == "replicas") {
-            if (!butil::StringToSizeT(key_value.substr(p + 1), &_num_replicas)) {
+        if (sp.key() == "replicas") {
+            if (!butil::StringToSizeT(sp.value(), &_num_replicas)) {
                 return false;
             }
             continue;
         }
-        LOG(ERROR) << "Failed to set this unknown parameters " << key_value;
+        LOG(ERROR) << "Failed to set this unknown parameters " << sp.key_and_value();
     }
     return true;
 }
diff --git a/src/brpc/uri.h b/src/brpc/uri.h
index 59ccb9b..706f547 100644
--- a/src/brpc/uri.h
+++ b/src/brpc/uri.h
@@ -198,15 +198,15 @@ inline std::ostream& operator<<(std::ostream& os, const URI& uri) {
 class QuerySplitter : public butil::KeyValuePairsSplitter {
 public:
     inline QuerySplitter(const char* str_begin, const char* str_end)
-        : KeyValuePairsSplitter(str_begin, str_end, '=', '&')
+        : KeyValuePairsSplitter(str_begin, str_end, '&', '=')
     {}
 
     inline QuerySplitter(const char* str_begin)
-        : KeyValuePairsSplitter(str_begin, '=', '&')
+        : KeyValuePairsSplitter(str_begin, '&', '=')
     {}
 
     inline QuerySplitter(const butil::StringPiece &sp)
-        : KeyValuePairsSplitter(sp, '=', '&')
+        : KeyValuePairsSplitter(sp, '&', '=')
     {}
 };
 
diff --git a/src/butil/string_splitter.h b/src/butil/string_splitter.h
index b85f60d..b38b9c1 100644
--- a/src/butil/string_splitter.h
+++ b/src/butil/string_splitter.h
@@ -167,8 +167,8 @@ private:
 
 // Split query in the format according to the given delimiters.
 // This class can also handle some exceptional cases.
-// 1. consecutive key_value_pair_delimiter are omitted, for example,
-//    suppose key_value_delimiter is '=' and key_value_pair_delimiter
+// 1. consecutive pair_delimiter are omitted, for example,
+//    suppose key_value_delimiter is '=' and pair_delimiter
 //    is '&', then 'k1=v1&&&k2=v2' is normalized to 'k1=k2&k2=v2'.
 // 2. key or value can be empty or both can be empty.
 // 3. consecutive key_value_delimiter are not omitted, for example,
@@ -178,25 +178,25 @@ class KeyValuePairsSplitter {
 public:
     inline KeyValuePairsSplitter(const char* str_begin,
                                  const char* str_end,
-                                 char key_value_delimiter,
-                                 char key_value_pair_delimiter)
-        : _sp(str_begin, str_end, key_value_pair_delimiter)
+                                 char pair_delimiter,
+                                 char key_value_delimiter)
+        : _sp(str_begin, str_end, pair_delimiter)
         , _delim_pos(StringPiece::npos)
         , _key_value_delim(key_value_delimiter) {
         UpdateDelimiterPosition();
     }
 
     inline KeyValuePairsSplitter(const char* str_begin,
-                                 char key_value_delimiter,
-                                 char key_value_pair_delimiter)
+                                 char pair_delimiter,
+                                 char key_value_delimiter)
         : KeyValuePairsSplitter(str_begin, NULL,
-                key_value_delimiter, key_value_pair_delimiter) {}
+                pair_delimiter, key_value_delimiter) {}
 
     inline KeyValuePairsSplitter(const StringPiece &sp,
-                                 char key_value_delimiter,
-                                 char key_value_pair_delimiter)
+                                 char pair_delimiter,
+                                 char key_value_delimiter)
         : KeyValuePairsSplitter(sp.begin(), sp.end(),
-                key_value_delimiter, key_value_pair_delimiter) {}
+                pair_delimiter, key_value_delimiter) {}
 
     inline StringPiece key() {
         return key_and_value().substr(0, _delim_pos);
diff --git a/src/bvar/variable.cpp b/src/bvar/variable.cpp
index cfb4c92..d31ba9c 100644
--- a/src/bvar/variable.cpp
+++ b/src/bvar/variable.cpp
@@ -24,7 +24,6 @@
 #include "butil/containers/flat_map.h"           // butil::FlatMap
 #include "butil/scoped_lock.h"                   // BAIDU_SCOPE_LOCK
 #include "butil/string_splitter.h"               // butil::StringSplitter
-#include "butil/strings/string_split.h"          // butil::SplitStringIntoKeyValuePairs
 #include "butil/errno.h"                         // berror
 #include "butil/time.h"                          // milliseconds_from_now
 #include "butil/file_util.h"                     // butil::FilePath
@@ -627,15 +626,13 @@ public:
             // .data will be appended later
             path = path.RemoveFinalExtension();
         }
-        butil::StringPairs pairs;
-        pairs.reserve(8);
-        butil::SplitStringIntoKeyValuePairs(tabs, '=', ';', &pairs);
-        dumpers.reserve(pairs.size() + 1);
-        //matchers.reserve(pairs.size());
-        for (size_t i = 0; i < pairs.size(); ++i) {
+
+        for (butil::KeyValuePairsSplitter sp(tabs, ';', '='); sp; ++sp) {
+            std::string key = sp.key().as_string();
+            std::string value = sp.value().as_string();
             FileDumper *f = new FileDumper(
-                    path.AddExtension(pairs[i].first).AddExtension("data").value(), s);
-            WildcardMatcher *m = new WildcardMatcher(pairs[i].second, '?', true);
+                    path.AddExtension(key).AddExtension("data").value(), s);
+            WildcardMatcher *m = new WildcardMatcher(value, '?', true);
             dumpers.push_back(std::make_pair(f, m));
         }
         dumpers.push_back(std::make_pair(
diff --git a/test/string_splitter_unittest.cpp b/test/string_splitter_unittest.cpp
index e88e1bc..da6024c 100644
--- a/test/string_splitter_unittest.cpp
+++ b/test/string_splitter_unittest.cpp
@@ -343,12 +343,12 @@ TEST_F(StringSplitterTest, key_value_pairs_splitter_sanity) {
         // Test three constructors
         butil::KeyValuePairsSplitter* psplitter = NULL;
         if (i == 0) {
-            psplitter = new butil::KeyValuePairsSplitter(kvstr, '=', '&');
+            psplitter = new butil::KeyValuePairsSplitter(kvstr, '&', '=');
         } else if (i == 1) {
             psplitter = new butil::KeyValuePairsSplitter(
-                    kvstr.data(), kvstr.data() + kvstr.size(), '=', '&');
+                    kvstr.data(), kvstr.data() + kvstr.size(), '&', '=');
         } else if (i == 2) {
-            psplitter = new butil::KeyValuePairsSplitter(kvstr.c_str(), '=', '&');
+            psplitter = new butil::KeyValuePairsSplitter(kvstr.c_str(), '&', '=');
         }
         butil::KeyValuePairsSplitter& splitter = *psplitter;
 


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@brpc.apache.org
For additional commands, e-mail: dev-help@brpc.apache.org