This is an automated email from the ASF dual-hosted git repository.
twice 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 968551d5 Add method to read JSON from storage for simplifying code
(#1843)
968551d5 is described below
commit 968551d5f1a202e71808971022d720417ee8430d
Author: Twice <[email protected]>
AuthorDate: Sat Oct 21 15:49:59 2023 +0900
Add method to read JSON from storage for simplifying code (#1843)
---
kvrocks.conf | 5 +++++
src/types/redis_json.cc | 55 +++++++++++++++++++++----------------------------
src/types/redis_json.h | 2 ++
3 files changed, 31 insertions(+), 31 deletions(-)
diff --git a/kvrocks.conf b/kvrocks.conf
index 7089cec8..be433254 100644
--- a/kvrocks.conf
+++ b/kvrocks.conf
@@ -312,6 +312,11 @@ max-bitmap-to-string-mb 16
# Default: no
redis-cursor-compatible no
+# Maximum nesting depth allowed when parsing and serializing
+# JSON documents while using JSON commands like JSON.SET.
+# Default: 1024
+json-max-nesting-depth 1024
+
################################## TLS ###################################
# By default, TLS/SSL is disabled, i.e. `tls-port` is set to 0.
diff --git a/src/types/redis_json.cc b/src/types/redis_json.cc
index 291d14b5..cc4fc768 100644
--- a/src/types/redis_json.cc
+++ b/src/types/redis_json.cc
@@ -45,15 +45,31 @@ rocksdb::Status Json::write(Slice ns_key, JsonMetadata
*metadata, const JsonValu
return storage_->Write(storage_->DefaultWriteOptions(),
batch->GetWriteBatch());
}
+rocksdb::Status Json::read(const Slice &ns_key, JsonMetadata *metadata,
JsonValue *value) {
+ std::string bytes;
+ Slice rest;
+
+ auto s = GetMetadata(kRedisJson, ns_key, &bytes, metadata, &rest);
+ if (!s.ok()) return s;
+
+ if (metadata->format != JsonStorageFormat::JSON)
+ return rocksdb::Status::NotSupported("JSON storage format not supported");
+
+ auto origin_res = JsonValue::FromString(rest.ToStringView());
+ if (!origin_res) return rocksdb::Status::Corruption(origin_res.Msg());
+ *value = *std::move(origin_res);
+
+ return rocksdb::Status::OK();
+}
+
rocksdb::Status Json::Set(const std::string &user_key, const std::string
&path, const std::string &value) {
auto ns_key = AppendNamespacePrefix(user_key);
LockGuard guard(storage_->GetLockManager(), ns_key);
- std::string bytes;
JsonMetadata metadata;
- Slice rest;
- auto s = GetMetadata(kRedisJson, ns_key, &bytes, &metadata, &rest);
+ JsonValue origin;
+ auto s = read(ns_key, &metadata, &origin);
if (s.IsNotFound()) {
if (path != "$") return rocksdb::Status::InvalidArgument("new objects must
be created at the root");
@@ -67,17 +83,10 @@ rocksdb::Status Json::Set(const std::string &user_key,
const std::string &path,
if (!s.ok()) return s;
- if (metadata.format != JsonStorageFormat::JSON)
- return rocksdb::Status::NotSupported("JSON storage format not supported");
-
auto new_res = JsonValue::FromString(value,
storage_->GetConfig()->json_max_nesting_depth);
if (!new_res) return rocksdb::Status::InvalidArgument(new_res.Msg());
auto new_val = *std::move(new_res);
- auto origin_res = JsonValue::FromString(rest.ToStringView());
- if (!origin_res) return rocksdb::Status::Corruption(origin_res.Msg());
- auto origin = *std::move(origin_res);
-
auto set_res = origin.Set(path, std::move(new_val));
if (!set_res) return rocksdb::Status::InvalidArgument(set_res.Msg());
@@ -87,19 +96,11 @@ rocksdb::Status Json::Set(const std::string &user_key,
const std::string &path,
rocksdb::Status Json::Get(const std::string &user_key, const
std::vector<std::string> &paths, JsonValue *result) {
auto ns_key = AppendNamespacePrefix(user_key);
- std::string bytes;
JsonMetadata metadata;
- Slice rest;
- auto s = GetMetadata(kRedisJson, ns_key, &bytes, &metadata, &rest);
+ JsonValue json_val;
+ auto s = read(ns_key, &metadata, &json_val);
if (!s.ok()) return s;
- if (metadata.format != JsonStorageFormat::JSON)
- return rocksdb::Status::NotSupported("JSON storage format not supported");
-
- auto json_res = JsonValue::FromString(rest.ToStringView());
- if (!json_res) return rocksdb::Status::Corruption(json_res.Msg());
- auto json_val = *std::move(json_res);
-
JsonValue res;
if (paths.empty()) {
@@ -127,7 +128,7 @@ rocksdb::Status Json::ArrAppend(const std::string
&user_key, const std::string &
std::vector<jsoncons::json> append_values;
append_values.reserve(values.size());
for (auto &v : values) {
- auto value_res = JsonValue::FromString(v);
+ auto value_res = JsonValue::FromString(v,
storage_->GetConfig()->json_max_nesting_depth);
if (!value_res) return rocksdb::Status::InvalidArgument(value_res.Msg());
auto value = *std::move(value_res);
append_values.emplace_back(std::move(value.value));
@@ -135,19 +136,11 @@ rocksdb::Status Json::ArrAppend(const std::string
&user_key, const std::string &
LockGuard guard(storage_->GetLockManager(), ns_key);
- std::string bytes;
JsonMetadata metadata;
- Slice rest;
- auto s = GetMetadata(kRedisJson, ns_key, &bytes, &metadata, &rest);
+ JsonValue value;
+ auto s = read(ns_key, &metadata, &value);
if (!s.ok()) return s;
- if (metadata.format != JsonStorageFormat::JSON)
- return rocksdb::Status::NotSupported("JSON storage format not supported");
-
- auto value_res = JsonValue::FromString(rest.ToStringView());
- if (!value_res) return rocksdb::Status::Corruption(value_res.Msg());
- auto value = *std::move(value_res);
-
auto append_res = value.ArrAppend(path, append_values, result_count);
if (!append_res) return rocksdb::Status::InvalidArgument(append_res.Msg());
diff --git a/src/types/redis_json.h b/src/types/redis_json.h
index 33c2625a..04895be5 100644
--- a/src/types/redis_json.h
+++ b/src/types/redis_json.h
@@ -25,6 +25,7 @@
#include <string>
#include "json.h"
+#include "storage/redis_metadata.h"
namespace redis {
@@ -39,6 +40,7 @@ class Json : public Database {
private:
rocksdb::Status write(Slice ns_key, JsonMetadata *metadata, const JsonValue
&json_val);
+ rocksdb::Status read(const Slice &ns_key, JsonMetadata *metadata, JsonValue
*value);
};
} // namespace redis