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

torwig pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks.git


The following commit(s) were added to refs/heads/unstable by this push:
     new ffdce20d chore(resp): extract RESP functions from Connection (#2406)
ffdce20d is described below

commit ffdce20de4142a00caa33534903ac5a763a56ff6
Author: Twice <[email protected]>
AuthorDate: Sun Jul 14 01:21:36 2024 +0900

    chore(resp): extract RESP functions from Connection (#2406)
---
 src/server/redis_connection.cc | 52 ------------------------------------------
 src/server/redis_connection.h  | 49 ++++++++++++++++++---------------------
 src/server/redis_reply.cc      | 52 ++++++++++++++++++++++++++++++++++++++++++
 src/server/redis_reply.h       | 47 +++++++++++++++++++++++++++++++++++++-
 4 files changed, 120 insertions(+), 80 deletions(-)

diff --git a/src/server/redis_connection.cc b/src/server/redis_connection.cc
index b8985f60..bdef3816 100644
--- a/src/server/redis_connection.cc
+++ b/src/server/redis_connection.cc
@@ -133,58 +133,6 @@ void Connection::Reply(const std::string &msg) {
   redis::Reply(bufferevent_get_output(bev_), msg);
 }
 
-std::string Connection::Bool(bool b) const {
-  if (protocol_version_ == RESP::v3) {
-    return b ? "#t" CRLF : "#f" CRLF;
-  }
-  return Integer(b ? 1 : 0);
-}
-
-std::string Connection::MultiBulkString(const std::vector<std::string> 
&values) const {
-  std::string result = MultiLen(values.size());
-  for (const auto &value : values) {
-    if (value.empty()) {
-      result += NilString();
-    } else {
-      result += BulkString(value);
-    }
-  }
-  return result;
-}
-
-std::string Connection::MultiBulkString(const std::vector<std::string> &values,
-                                        const std::vector<rocksdb::Status> 
&statuses) const {
-  std::string result = MultiLen(values.size());
-  for (size_t i = 0; i < values.size(); i++) {
-    if (i < statuses.size() && !statuses[i].ok()) {
-      result += NilString();
-    } else {
-      result += BulkString(values[i]);
-    }
-  }
-  return result;
-}
-
-std::string Connection::SetOfBulkStrings(const std::vector<std::string> 
&elems) const {
-  std::string result;
-  result += HeaderOfSet(elems.size());
-  for (const auto &elem : elems) {
-    result += BulkString(elem);
-  }
-  return result;
-}
-
-std::string Connection::MapOfBulkStrings(const std::vector<std::string> 
&elems) const {
-  CHECK(elems.size() % 2 == 0);
-
-  std::string result;
-  result += HeaderOfMap(elems.size() / 2);
-  for (const auto &elem : elems) {
-    result += BulkString(elem);
-  }
-  return result;
-}
-
 void Connection::SendFile(int fd) {
   // NOTE: we don't need to close the fd, the libevent will do that
   auto output = bufferevent_get_output(bev_);
diff --git a/src/server/redis_connection.h b/src/server/redis_connection.h
index f3015fcf..78e4a67c 100644
--- a/src/server/redis_connection.h
+++ b/src/server/redis_connection.h
@@ -32,6 +32,7 @@
 #include "commands/commander.h"
 #include "event_util.h"
 #include "redis_request.h"
+#include "server/redis_reply.h"
 
 class Worker;
 
@@ -66,46 +67,40 @@ class Connection : public EvbufCallbackBase<Connection> {
   void Reply(const std::string &msg);
   RESP GetProtocolVersion() const { return protocol_version_; }
   void SetProtocolVersion(RESP version) { protocol_version_ = version; }
-  std::string Bool(bool b) const;
-  std::string BigNumber(const std::string &n) const {
-    return protocol_version_ == RESP::v3 ? "(" + n + CRLF : BulkString(n);
-  }
-  std::string Double(double d) const {
-    return protocol_version_ == RESP::v3 ? "," + util::Float2String(d) + CRLF 
: BulkString(util::Float2String(d));
-  }
-  // ext is the extension of file to send, 'txt' for text file, 'md ' for 
markdown file
-  // at most 3 chars, padded with space
-  // if RESP is V2, treat verbatim string as blob string
-  // https://github.com/redis/redis/blob/7.2/src/networking.c#L1099
+  std::string Bool(bool b) const { return redis::Bool(protocol_version_, b); }
+  std::string BigNumber(const std::string &n) const { return 
redis::BigNumber(protocol_version_, n); }
+  std::string Double(double d) const { return redis::Double(protocol_version_, 
d); }
   std::string VerbatimString(std::string ext, const std::string &data) const {
-    CHECK(ext.size() <= 3);
-    size_t padded_len = 3 - ext.size();
-    ext = ext + std::string(padded_len, ' ');
-    return protocol_version_ == RESP::v3 ? "=" + std::to_string(3 + 1 + 
data.size()) + CRLF + ext + ":" + data + CRLF
-                                         : BulkString(data);
+    return redis::VerbatimString(protocol_version_, std::move(ext), data);
   }
   std::string NilString() const { return redis::NilString(protocol_version_); }
-  std::string NilArray() const { return protocol_version_ == RESP::v3 ? "_" 
CRLF : "*-1" CRLF; }
-  std::string MultiBulkString(const std::vector<std::string> &values) const;
+  std::string NilArray() const { return redis::NilArray(protocol_version_); }
+  std::string MultiBulkString(const std::vector<std::string> &values) const {
+    return redis::MultiBulkString(protocol_version_, values);
+  }
   std::string MultiBulkString(const std::vector<std::string> &values,
-                              const std::vector<rocksdb::Status> &statuses) 
const;
+                              const std::vector<rocksdb::Status> &statuses) 
const {
+    return redis::MultiBulkString(protocol_version_, values, statuses);
+  }
   template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
   std::string HeaderOfSet(T len) const {
-    return protocol_version_ == RESP::v3 ? "~" + std::to_string(len) + CRLF : 
MultiLen(len);
+    return redis::HeaderOfSet(protocol_version_, len);
+  }
+  std::string SetOfBulkStrings(const std::vector<std::string> &elems) const {
+    return redis::SetOfBulkStrings(protocol_version_, elems);
   }
-  std::string SetOfBulkStrings(const std::vector<std::string> &elems) const;
   template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
   std::string HeaderOfMap(T len) const {
-    return protocol_version_ == RESP::v3 ? "%" + std::to_string(len) + CRLF : 
MultiLen(len * 2);
+    return redis::HeaderOfMap(protocol_version_, len);
+  }
+  std::string MapOfBulkStrings(const std::vector<std::string> &elems) const {
+    return redis::MapOfBulkStrings(protocol_version_, elems);
   }
-  std::string MapOfBulkStrings(const std::vector<std::string> &elems) const;
   template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
   std::string HeaderOfAttribute(T len) const {
-    return "|" + std::to_string(len) + CRLF;
-  }
-  std::string HeaderOfPush(int64_t len) const {
-    return protocol_version_ == RESP::v3 ? ">" + std::to_string(len) + CRLF : 
MultiLen(len);
+    return redis::HeaderOfAttribute(len);
   }
+  std::string HeaderOfPush(int64_t len) const { return 
redis::HeaderOfPush(protocol_version_, len); }
 
   using UnsubscribeCallback = std::function<void(std::string, int)>;
   void SubscribeChannel(const std::string &channel);
diff --git a/src/server/redis_reply.cc b/src/server/redis_reply.cc
index 52fc180e..04e8bbd8 100644
--- a/src/server/redis_reply.cc
+++ b/src/server/redis_reply.cc
@@ -72,4 +72,56 @@ std::string ArrayOfBulkStrings(const 
std::vector<std::string> &elems) {
   return result;
 }
 
+std::string Bool(RESP ver, bool b) {
+  if (ver == RESP::v3) {
+    return b ? "#t" CRLF : "#f" CRLF;
+  }
+  return Integer(b ? 1 : 0);
+}
+
+std::string MultiBulkString(RESP ver, const std::vector<std::string> &values) {
+  std::string result = MultiLen(values.size());
+  for (const auto &value : values) {
+    if (value.empty()) {
+      result += NilString(ver);
+    } else {
+      result += BulkString(value);
+    }
+  }
+  return result;
+}
+
+std::string MultiBulkString(RESP ver, const std::vector<std::string> &values,
+                            const std::vector<rocksdb::Status> &statuses) {
+  std::string result = MultiLen(values.size());
+  for (size_t i = 0; i < values.size(); i++) {
+    if (i < statuses.size() && !statuses[i].ok()) {
+      result += NilString(ver);
+    } else {
+      result += BulkString(values[i]);
+    }
+  }
+  return result;
+}
+
+std::string SetOfBulkStrings(RESP ver, const std::vector<std::string> &elems) {
+  std::string result;
+  result += HeaderOfSet(ver, elems.size());
+  for (const auto &elem : elems) {
+    result += BulkString(elem);
+  }
+  return result;
+}
+
+std::string MapOfBulkStrings(RESP ver, const std::vector<std::string> &elems) {
+  CHECK(elems.size() % 2 == 0);
+
+  std::string result;
+  result += HeaderOfMap(ver, elems.size() / 2);
+  for (const auto &elem : elems) {
+    result += BulkString(elem);
+  }
+  return result;
+}
+
 }  // namespace redis
diff --git a/src/server/redis_reply.h b/src/server/redis_reply.h
index f50c559d..ceb6042e 100644
--- a/src/server/redis_reply.h
+++ b/src/server/redis_reply.h
@@ -25,7 +25,9 @@
 #include <string>
 #include <vector>
 
+#include "rocksdb/status.h"
 #include "status.h"
+#include "string_util.h"
 
 #define CRLF "\r\n"                    // NOLINT
 #define RESP_PREFIX_ERROR "-"          // NOLINT
@@ -46,7 +48,7 @@ std::string Integer(T data) {
   return ":" + std::to_string(data) + CRLF;
 }
 
-inline std::string NilString(const RESP ver) {
+inline std::string NilString(RESP ver) {
   if (ver == RESP::v3) {
     return "_" CRLF;
   }
@@ -63,4 +65,47 @@ std::string MultiLen(T len) {
 std::string Array(const std::vector<std::string> &list);
 std::string ArrayOfBulkStrings(const std::vector<std::string> &elements);
 
+std::string Bool(RESP ver, bool b);
+inline std::string BigNumber(RESP ver, const std::string &n) {
+  return ver == RESP::v3 ? "(" + n + CRLF : BulkString(n);
+}
+inline std::string Double(RESP ver, double d) {
+  return ver == RESP::v3 ? "," + util::Float2String(d) + CRLF : 
BulkString(util::Float2String(d));
+}
+// ext is the extension of file to send, 'txt' for text file, 'md ' for 
markdown file
+// at most 3 chars, padded with space
+// if RESP is V2, treat verbatim string as blob string
+// https://github.com/redis/redis/blob/7.2/src/networking.c#L1099
+inline std::string VerbatimString(RESP ver, std::string ext, const std::string 
&data) {
+  CHECK(ext.size() <= 3);
+  size_t padded_len = 3 - ext.size();
+  ext = ext + std::string(padded_len, ' ');
+  return ver == RESP::v3 ? "=" + std::to_string(3 + 1 + data.size()) + CRLF + 
ext + ":" + data + CRLF
+                         : BulkString(data);
+}
+
+inline std::string NilArray(RESP ver) { return ver == RESP::v3 ? "_" CRLF : 
"*-1" CRLF; }
+std::string MultiBulkString(RESP ver, const std::vector<std::string> &values);
+std::string MultiBulkString(RESP ver, const std::vector<std::string> &values,
+                            const std::vector<rocksdb::Status> &statuses);
+
+template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
+std::string HeaderOfSet(RESP ver, T len) {
+  return ver == RESP::v3 ? "~" + std::to_string(len) + CRLF : MultiLen(len);
+}
+std::string SetOfBulkStrings(RESP ver, const std::vector<std::string> &elems);
+template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
+std::string HeaderOfMap(RESP ver, T len) {
+  return ver == RESP::v3 ? "%" + std::to_string(len) + CRLF : MultiLen(len * 
2);
+}
+std::string MapOfBulkStrings(RESP ver, const std::vector<std::string> &elems);
+template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
+std::string HeaderOfAttribute(T len) {
+  return "|" + std::to_string(len) + CRLF;
+}
+template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
+std::string HeaderOfPush(RESP ver, T len) {
+  return ver == RESP::v3 ? ">" + std::to_string(len) + CRLF : MultiLen(len);
+}
+
 }  // namespace redis

Reply via email to