75 #define TODO_OPTIMIZE_JSON_BODY_STRING true 78 #if TODO_OPTIMIZE_JSON_BODY_STRING 79 struct JSON_RAW_STRING_DELETER
81 void operator() (
char *
p)
const 86 #endif // TODO_OPTIMIZE_JSON_BODY_STRING 88 typedef rapidjson::GenericStringBuffer<JSON_ENCODING, JSON_PRIVATE_ALLOCATOR>
JSON_STRING_BUFFER;
89 typedef rapidjson::GenericMemberIterator<true, JSON_ENCODING, JSON_PRIVATE_MEMPOOL>::Iterator
JSON_MEMBER_ITERATOR;
92 typedef std::function<int (const JSON_VALUE &, const JSON_PATH &, bool &)>
map_func_type;
97 void JSON_DOC_STORE::create_mutable_reference ()
103 void JSON_DOC_STORE::delete_mutable ()
105 delete m_mutable_reference;
116 : m_input_doc (nullptr)
117 , m_value_doc (nullptr)
127 virtual void next () = 0;
129 virtual bool has_next () = 0;
133 virtual void set (
const JSON_DOC &new_doc) = 0;
141 if (value ==
nullptr)
146 if (m_value_doc ==
nullptr)
151 m_value_doc->CopyFrom (*value, m_value_doc->GetAllocator ());
158 m_input_doc =
nullptr;
163 return m_input_doc ==
nullptr;
169 if (m_value_doc !=
nullptr)
192 void next ()
override;
194 bool has_next ()
override;
199 return &m_iterator->value;
205 assert (new_doc.IsObject ());
207 m_input_doc = &new_doc;
208 m_iterator = new_doc.MemberBegin ();
227 void next ()
override;
229 bool has_next ()
override;
238 assert (new_doc.IsArray ());
240 m_input_doc = &new_doc;
241 m_iterator = new_doc.GetArray ().Begin ();
258 if (m_input_doc ==
nullptr)
265 return (m_iterator + 1) != end;
278 if (m_input_doc ==
nullptr)
285 return (m_iterator + 1) != end;
297 int validate (
const JSON_DOC *doc)
const;
298 const char *get_schema_raw ()
const;
301 void generate_schema_validator (
void);
323 typedef typename JSON_DOC::Ch
Ch;
354 virtual bool RawNumber (
const Ch *str, SizeType length,
bool copy)
358 virtual bool String (
const Ch *str, SizeType length,
bool copy)
366 virtual bool Key (
const Ch *str, SizeType length,
bool copy)
394 int WalkDocument (
const JSON_DOC &document);
449 int CallBefore (
const JSON_VALUE &value)
override;
460 int CallBefore (
const JSON_VALUE &value)
override;
461 int CallAfter (
const JSON_VALUE &value)
override;
462 int CallOnArrayIterate ()
override;
463 int CallOnKeyIterate (
const JSON_VALUE &key)
override;
496 bool Null ()
override;
497 bool Bool (
bool b)
override;
498 bool Int (
int i)
override;
499 bool Uint (
unsigned i)
override;
500 bool Int64 (std::int64_t i)
override;
501 bool Uint64 (std::uint64_t i)
override;
502 bool Double (
double d)
override;
503 bool String (
const Ch *str,
SizeType length,
bool copy)
override;
504 bool StartObject ()
override;
505 bool Key (
const Ch *str,
SizeType length,
bool copy)
override;
506 bool StartArray ()
override;
507 bool EndObject (
SizeType memberCount)
override;
508 bool EndArray (
SizeType elementCount)
override;
527 bool Null ()
override;
528 bool Bool (
bool b)
override;
529 bool Int (
int i)
override;
530 bool Uint (
unsigned i)
override;
531 bool Int64 (std::int64_t i)
override;
532 bool Uint64 (std::uint64_t i)
override;
533 bool Double (
double d)
override;
534 bool String (
const Ch *str,
SizeType length,
bool copy)
override;
535 bool StartObject ()
override;
536 bool Key (
const Ch *str,
SizeType length,
bool copy)
override;
537 bool StartArray ()
override;
538 bool EndObject (
SizeType memberCount)
override;
539 bool EndArray (
SizeType elementCount)
override;
542 bool SaveSizePointers (
char *ptr);
543 void SetSizePointers (
SizeType size);
545 bool PackType (
const DB_JSON_TYPE &type);
546 bool PackString (
const char *str);
581 , m_current_indent (0)
588 bool Null ()
override;
589 bool Bool (
bool b)
override;
590 bool Int (
int i)
override;
591 bool Uint (
unsigned i)
override;
592 bool Int64 (std::int64_t i)
override;
593 bool Uint64 (std::uint64_t i)
override;
594 bool Double (
double d)
override;
595 bool String (
const Ch *str,
SizeType length,
bool copy)
override;
596 bool StartObject ()
override;
597 bool Key (
const Ch *str,
SizeType length,
bool copy)
override;
598 bool StartArray ()
override;
599 bool EndObject (
SizeType memberCount)
override;
600 bool EndArray (
SizeType elementCount)
override;
608 void WriteDelimiters (
bool is_key =
false);
609 void PushLevel (
const DB_JSON_TYPE &type);
611 void SetIndentOnNewLine ();
620 , is_first (is_first)
628 static const size_t LEVEL_INDENT_UNIT = 2;
661 std::vector<std::string> &paths);
668 const DB_JSON_TYPE &found_type,
const DB_JSON_TYPE &expected_type,
669 const DB_JSON_TYPE &expected_type_optional = DB_JSON_NULL);
690 std::vector<const char *> inserted_keys;
692 if (value.IsObject ())
694 for (
auto it = value.MemberBegin (); it != value.MemberEnd (); ++it)
696 const char *current_key = it->name.GetString ();
698 for (
unsigned int i = 0;
i < inserted_keys.size ();
i++)
700 if (strcmp (current_key, inserted_keys[
i]) == 0)
707 inserted_keys.push_back (current_key);
724 if (value.IsArray ())
729 if (value.IsObject () || value.IsArray ())
742 if (value.IsArray ())
747 if (value.IsArray () || value.IsObject ())
769 std::string path_item =
"\"";
771 std::string object_key = key.GetString ();
772 for (
auto it = object_key.begin (); it != object_key.end (); ++it)
775 if (*it ==
'"' || *it ==
'\\')
777 it = object_key.insert (it,
'\\') + 1;
780 path_item += object_key;
905 m_validator->GetInvalidSchemaPointer ().StringifyUriFragment (sb1);
906 m_validator->GetInvalidDocumentPointer ().StringifyUriFragment (sb2);
908 m_validator->GetInvalidSchemaKeyword (), sb2.GetString ());
944 json_itr->
set (new_doc);
950 if (json_itr !=
NULL)
965 if (type == DB_JSON_TYPE::DB_JSON_OBJECT)
969 else if (type == DB_JSON_TYPE::DB_JSON_ARRAY)
987 if (json_itr !=
NULL)
1005 assert (!document->HasParseError ());
1017 return "JSON_ARRAY";
1018 case DB_JSON_OBJECT:
1019 return "JSON_OBJECT";
1022 case DB_JSON_BIGINT:
1024 case DB_JSON_DOUBLE:
1026 case DB_JSON_STRING:
1048 if (!document->IsArray () && !document->IsObject ())
1053 if (document->IsArray ())
1055 return document->Size ();
1058 if (document->IsObject ())
1060 unsigned int length = 0;
1062 for (JSON_VALUE::ConstMemberIterator itr = document->MemberBegin (); itr != document->MemberEnd (); ++itr)
1092 assert (result_str ==
nullptr);
1094 if (!doc.IsString ())
1102 if (result_str ==
nullptr)
1113 if (doc->IsArray ())
1115 unsigned int max = 0;
1117 for (JSON_VALUE::ConstValueIterator itr = doc->Begin (); itr != doc->End (); ++itr)
1129 else if (doc->IsObject ())
1131 unsigned int max = 0;
1133 for (JSON_VALUE::ConstMemberIterator itr = doc->MemberBegin (); itr != doc->MemberEnd (); ++itr)
1154 JSON_DOC_STORE &result,
bool allow_wildcards)
1172 JSON_DOC_STORE &result,
bool allow_wildcards)
1176 if (document ==
NULL)
1178 if (result.is_mutable ())
1180 result.get_mutable ()->SetNull ();
1185 std::vector<JSON_PATH> json_paths;
1187 for (
const std::string &path : paths)
1189 json_paths.emplace_back ();
1190 error_code = json_paths.back ().parse (path.c_str ());
1197 if (!allow_wildcards && json_paths.back ().contains_wildcard ())
1205 bool array_result =
false;
1206 if (json_paths.size () > 1)
1208 array_result =
true;
1212 array_result = json_paths[0].contains_wildcard ();
1215 std::vector<std::vector<const JSON_VALUE *>> produced_array (json_paths.size ());
1216 for (
size_t i = 0;
i < json_paths.size (); ++
i)
1218 produced_array[
i] = std::move (json_paths[
i].extract (*document));
1223 for (
const auto &produced : produced_array)
1227 if (!result.is_mutable ())
1229 result.create_mutable_reference ();
1230 result.get_mutable ()->SetArray ();
1239 assert (produced_array.size () == 1 && (produced_array[0].empty () || produced_array[0].size () == 1));
1241 if (!produced_array[0].empty ())
1243 if (!result.is_mutable ())
1245 result.create_mutable_reference ();
1248 result.get_mutable ()->CopyFrom (*produced_array[0][0], result.get_mutable ()->GetAllocator ());
1268 if (document ==
NULL)
1273 std::vector<JSON_PATH> json_paths;
1274 for (
const auto &path : paths)
1276 json_paths.emplace_back ();
1277 error_code = json_paths.back ().parse (path.c_str ());
1285 bool contains_wildcard =
false;
1286 for (
const JSON_PATH &json_path : json_paths)
1288 contains_wildcard = contains_wildcard || json_path.contains_wildcard ();
1291 if (!contains_wildcard)
1293 for (
const JSON_PATH &json_path : json_paths)
1295 const JSON_VALUE *found = json_path.get (*document);
1296 if (find_all && found ==
NULL)
1301 if (!find_all && found !=
NULL)
1311 std::unique_ptr<bool[]> found_set (
new bool[paths.size ()]);
1312 for (std::size_t
i = 0;
i < paths.size (); ++
i)
1314 found_set[
i] =
false;
1318 const JSON_PATH &accumulated_path,
bool &stop) ->
int 1320 for (std::size_t
i = 0;
i < json_paths.size (); ++
i)
1324 found_set[
i] =
true;
1338 for (std::size_t
i = 0;
i < paths.size (); ++
i)
1340 if (find_all && !found_set[
i])
1345 if (!find_all && found_set[i])
1360 rapidjson::Writer<JSON_STRING_BUFFER> json_default_writer (buffer);
1364 doc->Accept (json_default_writer);
1372 #if TODO_OPTIMIZE_JSON_BODY_STRING 1380 #endif // TODO_OPTIMIZE_JSON_BODY_STRING 1390 if (!doc.IsObject ())
1395 if (doc.HasMember (name))
1401 key.SetString (name, (rapidjson::SizeType)
strlen (name), doc.GetAllocator ());
1402 doc.AddMember (key, value, doc.GetAllocator ());
1412 val.SetString (value, (rapidjson::SizeType)
strlen (value), doc->GetAllocator ());
1432 val.SetInt64 (value);
1444 val.CopyFrom (*value, doc->GetAllocator ());
1459 val.SetDouble (value);
1469 if (!doc->IsArray ())
1479 v.SetString (value, (rapidjson::SizeType)
strlen (value), doc->GetAllocator ());
1480 doc->PushBack (v, doc->GetAllocator ());
1486 if (!doc->IsArray ())
1491 doc->PushBack (
JSON_VALUE ().SetInt (value), doc->GetAllocator ());
1497 if (!doc->IsArray ())
1502 doc->PushBack (
JSON_VALUE ().SetInt64 (value), doc->GetAllocator ());
1508 if (!doc->IsArray ())
1513 doc->PushBack (
JSON_VALUE ().SetDouble (value), doc->GetAllocator ());
1521 if (!doc->IsArray ())
1532 new_doc.CopyFrom (*value, doc->GetAllocator ());
1534 doc->PushBack (new_doc, doc->GetAllocator ());
1542 if (!doc->IsArray ())
1553 new_doc.CopyFrom (*value, doc->GetAllocator ());
1555 doc->PushBack (new_doc, doc->GetAllocator ());
1585 if (json_raw ==
NULL)
1590 if (doc.Parse (json_raw, json_raw_length).HasParseError ())
1593 rapidjson::GetParseError_En (doc.GetParseError ()), doc.GetErrorOffset ());
1631 new_doc->CopyFrom (*doc, new_doc->GetAllocator ());
1633 #if TODO_OPTIMIZE_JSON_BODY_STRING 1637 #endif // TODO_OPTIMIZE_JSON_BODY_STRING 1647 dest.CopyFrom (*src, dest.GetAllocator ());
1675 int error_code = p.
parse (raw_path);
1710 p.
set (doc, *value);
1727 p.
set (doc, *value);
1753 int error_code = p.
parse (raw_path);
1762 p.
set (doc, *value);
1777 if (!parent_val->IsArray ())
1780 parent_val->CopyFrom (*value, doc.GetAllocator ());
1782 else if (parent_val->GetArray ().Size () > 0 )
1784 p.
set (doc, *value);
1796 p.
set (doc, *value);
1807 if (!parent_val->IsObject ())
1815 p.
set (doc, *value);
1848 int error_code = p.
parse (raw_path);
1858 p.
set (doc, *value);
1875 p.
set (doc, *value);
1886 p.
set (doc, *value);
1896 p.
set (doc, *value);
1914 int error_code = p.
parse (raw_path);
1962 std::vector<JSON_PATH> &paths,
const std::vector<std::string> &patterns,
bool find_all)
1964 std::vector<JSON_PATH> json_paths;
1965 for (
const auto &path : patterns)
1967 json_paths.emplace_back ();
1968 int error_code = json_paths.back ().parse (path.c_str ());
1979 db_string_escape_str (raw_json_string.c_str (), raw_json_string.length (), "ed_str, "ed_sz);
1980 raw_json_string = quoted_str;
1986 db_make_string (&encoded_pattern_dbval, encoded_pattern.c_str ());
1989 const map_func_type &f_search = [&json_paths, &paths, &encoded_pattern_dbval, esc_char, find_all] (
const JSON_VALUE &jv,
1990 const JSON_PATH &crt_path,
bool &stop) ->
int 1992 if (!jv.IsString ())
1997 const char *json_str = jv.GetString ();
2004 int error_code =
db_string_like (&str_val, &encoded_pattern_dbval, esc_char, &match);
2005 if (error_code !=
NO_ERROR || !match)
2010 for (std::size_t
i = 0;
i < json_paths.size (); ++
i)
2014 if (res == JSON_PATH::MATCH_RESULT::PREFIX_MATCH || res == JSON_PATH::MATCH_RESULT::FULL_MATCH)
2016 paths.push_back (crt_path);
2052 int error_code = p.
parse (raw_path);
2059 JSON_VALUE value_copy (*value, doc.GetAllocator());
2065 json_val->GetArray ().PushBack (value_copy, doc.GetAllocator ());
2087 json_val->GetArray ().PushBack (value_copy, doc.GetAllocator ());
2097 parent_val->GetArray ().PushBack (value_copy, doc.GetAllocator ());
2109 json_val->GetArray ().PushBack (value_copy, doc.GetAllocator ());
2134 int error_code = p.
parse (raw_path);
2159 p.
set (doc, *value);
2163 json_parent->GetArray ().PushBack (
JSON_VALUE (), doc.GetAllocator ());
2165 for (rapidjson::SizeType
i = json_parent->GetArray ().Size () - 1;
i >= last_token_idx + 1; --
i)
2167 json_parent->GetArray ()[
i] = std::move (json_parent->GetArray ()[
i - 1]);
2169 p.
set (doc, *value);
2188 assert (dest.IsObject () && source.IsObject ());
2191 for (JSON_VALUE::ConstMemberIterator itr = source.MemberBegin (); itr != source.MemberEnd (); ++itr)
2193 const char *name = itr->name.GetString ();
2196 if (dest.HasMember (name))
2199 if (itr->value.IsNull ())
2201 dest.RemoveMember (name);
2209 else if (!itr->value.IsNull ())
2231 assert (dest.IsObject () && source.IsObject ());
2234 for (JSON_VALUE::ConstMemberIterator itr = source.MemberBegin (); itr != source.MemberEnd (); ++itr)
2236 const char *name = itr->name.GetString ();
2239 if (dest.HasMember (name))
2260 assert (source.IsArray ());
2261 assert (dest.IsArray ());
2265 for (JSON_VALUE::ValueIterator itr = source_copy.Begin (); itr != source_copy.End (); ++itr)
2267 dest.PushBack (*itr, allocator);
2277 assert (dest_array.IsArray ());
2280 dest_array.PushBack (
JSON_VALUE (value, allocator), allocator);
2290 assert (dest_object.IsObject ());
2293 dest_object.AddMember (
JSON_VALUE (name, allocator),
JSON_VALUE (value, allocator), allocator);
2299 if (!obj->IsObject ())
2305 result = (int) obj->HasMember (key);
2318 rapidjson::Document document;
2320 document.Parse (json_body);
2321 if (document.HasParseError ())
2324 rapidjson::GetParseError_En (document.GetParseError ()), document.GetErrorOffset ());
2370 error_code = validator->
load ();
2409 return val1 ==
NULL && val2 ==
NULL;
2416 if (source.IsObject () && dest.IsObject ())
2422 if (!dest.IsArray ())
2426 if (source.IsArray ())
2440 if (source.IsObject ())
2442 if (!dest.IsObject ())
2450 dest.CopyFrom (source, allocator);
2571 return DB_JSON_NULL;
2574 if (val->IsString ())
2576 return DB_JSON_STRING;
2578 else if (val->IsInt ())
2582 else if (val->IsInt64 () || val->IsUint ())
2584 return DB_JSON_BIGINT;
2586 else if (val->IsFloat () || val->IsDouble () || val->IsUint64 ())
2589 return DB_JSON_DOUBLE;
2591 else if (val->IsObject ())
2593 return DB_JSON_OBJECT;
2595 else if (val->IsArray ())
2597 return DB_JSON_ARRAY;
2599 else if (val->IsNull ())
2601 return DB_JSON_NULL;
2603 else if (val->IsBool ())
2605 return DB_JSON_BOOL;
2608 return DB_JSON_UNKNOWN;
2622 return val->GetInt ();
2636 return val->IsInt64 () ? val->GetInt64 () : val->GetUint ();
2665 return doc->GetString ();
2703 return doc->GetBool ();
2730 const DB_JSON_TYPE &found_type,
const DB_JSON_TYPE &expected_type,
2731 const DB_JSON_TYPE &expected_type_optional)
2736 if (expected_type_optional != DB_JSON_NULL)
2738 expected_type_str +=
" or ";
2743 path.
dump_json_path ().c_str (), expected_type_str.c_str (), found_type_str);
2752 int error_code = jp.
parse (pointer_path);
2778 if (sql_path ==
NULL)
2783 bool unescaped_backslash =
false;
2784 bool in_quotes =
false;
2785 for (std::size_t
i = 0; sql_path[
i] !=
'\0'; ++
i)
2787 if (!in_quotes && sql_path[
i] ==
'*')
2792 if (!unescaped_backslash && sql_path[
i] ==
'"')
2794 in_quotes = !in_quotes;
2797 if (sql_path[
i] ==
'\\')
2799 unescaped_backslash = !unescaped_backslash;
2803 unescaped_backslash =
false;
2824 for (
auto it = obj.GetArray ().begin (); it != obj.GetArray ().end (); ++it)
2826 std::stringstream ss;
2827 ss << sql_path <<
"[" << count++ <<
"]";
2831 else if (obj.IsObject ())
2833 for (
auto it = obj.MemberBegin (); it != obj.MemberEnd (); ++it)
2835 std::stringstream ss;
2836 ss << sql_path <<
'.' <<
'"' << it->name.GetString () <<
'"';
2842 paths.push_back (sql_path);
2856 std::vector<std::string> paths;
2861 result_json->SetArray ();
2863 for (
auto &path : paths)
2866 val.SetString (path.c_str (), result_json->GetAllocator ());
2867 result_json->PushBack (val, result_json->GetAllocator ());
2883 assert (result_str ==
nullptr);
2887 doc.Accept (json_pretty_writer);
2895 assert (raw_json_string.length () >= 2 && raw_json_string[0] ==
'"');
2904 std::string res = doc->IsString () ? doc->GetString () :
"";
2922 int error_code = p.
parse (raw_path);
2936 else if (head->IsObject ())
2938 result_json.SetArray ();
2940 for (
auto it = head->MemberBegin (); it != head->MemberEnd (); ++it)
2944 val.SetString (it->name.GetString (), result_json.GetAllocator ());
2945 result_json.PushBack (val, result_json.GetAllocator ());
2985 DB_JSON_TYPE doc_type, val_type;
2990 if (doc_type == val_type)
2992 if (doc_type == DB_JSON_STRING)
2994 result = (strcmp (doc->GetString (), value->GetString ()) == 0);
2996 else if (doc_type == DB_JSON_INT)
3000 else if (doc_type == DB_JSON_BIGINT)
3004 else if (doc_type == DB_JSON_DOUBLE)
3008 else if (doc_type == DB_JSON_ARRAY)
3010 for (JSON_VALUE::ConstValueIterator itr_val = value->Begin (); itr_val != value->End (); ++itr_val)
3015 for (JSON_VALUE::ConstValueIterator itr_doc = doc->Begin (); itr_doc != doc->End (); ++itr_doc)
3032 else if (doc_type == DB_JSON_OBJECT)
3035 JSON_VALUE::ConstMemberIterator itr_val;
3037 for (itr_val = value->MemberBegin (); itr_val != value->MemberEnd (); ++itr_val)
3039 if (doc->HasMember (itr_val->name))
3055 else if (doc_type == DB_JSON_NULL)
3066 result = (v1 == v2);
3070 if (doc_type == DB_JSON_ARRAY)
3072 for (JSON_VALUE::ConstValueIterator itr_doc = doc->Begin (); itr_doc != doc->End (); ++itr_doc)
3100 doc->SetString (str, len, doc->GetAllocator ());
3128 return *doc1 == *doc2;
3151 return (type == DB_JSON_ARRAY || type == DB_JSON_OBJECT);
3189 json_doc.create_mutable_reference ();
3212 json_doc.set_mutable_reference (json_doc_ptr);
3233 json_doc.create_mutable_reference ();
3258 json_doc.create_mutable_reference ();
3279 json_doc.create_mutable_reference ();
3287 json_doc.create_mutable_reference ();
3312 const DB_VALUE *str_valp = &db_val;
3324 str_valp = &cnv_to_str;
3335 db_make_json (&value, doc_store.release_mutable_reference (),
true);
3341 if (value.IsArray ())
3348 swap_value.SetArray ();
3349 swap_value.PushBack (value, allocator);
3350 swap_value.Swap (value);
3369 error_code = CallBefore (value);
3380 if (value.IsObject ())
3382 for (
auto it = value.MemberBegin (); it != value.MemberEnd (); ++it)
3384 CallOnKeyIterate (it->name);
3389 error_code = WalkValue (it->value);
3401 else if (value.IsArray ())
3403 for (
const JSON_VALUE *it = value.Begin (); it != value.End (); ++it)
3405 CallOnArrayIterate ();
3410 error_code = WalkValue (*it);
3423 error_code = CallAfter (value);
3437 m_size_pointers.push (ptr);
3442 return !HasError ();
3448 char *buf = m_size_pointers.top ();
3449 m_size_pointers.pop ();
3451 assert (buf >= m_buffer->buffer && buf < m_buffer->ptr);
3460 m_error =
or_put_int (m_buffer, static_cast<int> (type));
3461 return !HasError ();
3468 return !HasError ();
3474 m_length += GetTypePackedSize ();
3481 return PackType (DB_JSON_NULL);
3495 if (!PackType (DB_JSON_BOOL))
3501 return !HasError ();
3515 if (!PackType (DB_JSON_INT))
3524 return !HasError ();
3538 if (!PackType (DB_JSON_INT))
3547 return !HasError ();
3561 if (!PackType (DB_JSON_BIGINT))
3570 return !HasError ();
3584 if (!PackType (DB_JSON_BIGINT))
3593 return !HasError ();
3607 if (!PackType (DB_JSON_DOUBLE))
3613 return !HasError ();
3619 m_length += GetTypePackedSize () + GetStringPackedSize (str);
3626 return PackType (DB_JSON_STRING) && PackString (str);
3633 m_length += GetStringPackedSize (str);
3640 return PackString (str);
3646 m_length += GetTypePackedSize ();
3654 if (!PackType (DB_JSON_OBJECT))
3661 return SaveSizePointers (m_buffer->ptr);
3667 m_length += GetTypePackedSize ();
3675 if (!PackType (DB_JSON_ARRAY))
3682 return SaveSizePointers (m_buffer->ptr);
3695 SetSizePointers (memberCount);
3709 SetSizePointers (elementCount);
3717 if (m_level_stack.empty ())
3728 if (is_key || m_level_stack.top ().type == DB_JSON_TYPE::DB_JSON_ARRAY)
3731 if (!m_level_stack.top ().is_first)
3733 m_buffer.append (
",");
3738 m_level_stack.top ().is_first =
false;
3741 SetIndentOnNewLine ();
3746 assert (m_level_stack.top ().type == DB_JSON_TYPE::DB_JSON_OBJECT);
3747 m_buffer.append (
" ");
3755 m_current_indent += LEVEL_INDENT_UNIT;
3765 m_current_indent -= LEVEL_INDENT_UNIT;
3766 m_level_stack.pop ();
3772 m_buffer.append (
"\n").append (m_current_indent,
' ');
3780 m_buffer.append (
"null");
3790 m_buffer.append (b ?
"true" :
"false");
3800 m_buffer.append (std::to_string (i));
3810 m_buffer.append (std::to_string (i));
3820 m_buffer.append (std::to_string (i));
3830 m_buffer.append (std::to_string (i));
3840 m_buffer.append (std::to_string (d));
3850 m_buffer.append (
"\"").append (str).append (
"\"");
3860 m_buffer.append (
"{");
3862 PushLevel (DB_JSON_TYPE::DB_JSON_OBJECT);
3870 WriteDelimiters (
true);
3872 m_buffer.append (
"\"").append (str).append (
"\"").append (
":");
3882 m_buffer.append (
"[");
3884 PushLevel (DB_JSON_TYPE::DB_JSON_ARRAY);
3894 if (memberCount != 0)
3897 SetIndentOnNewLine ();
3900 m_buffer.append (
"}");
3910 if (elementCount != 0)
3913 SetIndentOnNewLine ();
3916 m_buffer.append (
"]");
3936 if (!doc.Accept (js))
4000 value.SetString (buf->
ptr, static_cast<rapidjson::SizeType> (str_length - 1), doc_allocator);
4002 buf->
ptr += str_length;
4033 value.SetUint ((
unsigned) int_value);
4037 value.SetInt (int_value);
4061 value.SetUint64 ((std::uint64_t) bigint_value);
4065 value.SetInt64 (bigint_value);
4075 double double_value;
4085 value.SetDouble (double_value);
4103 assert (int_value == 0 || int_value == 1);
4105 value.SetBool (int_value == 1);
4127 for (
int i = 0;
i < size;
i++)
4147 value.AddMember (key, child, doc_allocator);
4170 value.Reserve (size, doc_allocator);
4172 for (
int i = 0;
i < size;
i++)
4182 value.PushBack (child, doc_allocator);
4199 DB_JSON_TYPE json_type;
4203 json_type =
static_cast<DB_JSON_TYPE
> (
or_get_int (buf, &rc));
4216 case DB_JSON_BIGINT:
4220 case DB_JSON_DOUBLE:
4224 case DB_JSON_STRING:
4236 case DB_JSON_OBJECT:
static void db_json_value_wrap_as_array(JSON_VALUE &value, JSON_PRIVATE_MEMPOOL &allocator)
JSON_VALUE & db_json_doc_to_value(JSON_DOC &doc)
std::stack< unsigned int > m_index
TP_DOMAIN tp_String_domain
#define ER_JSON_PATH_DOES_NOT_EXIST
bool db_json_doc_has_numeric_type(const JSON_DOC *doc)
bool StartArray() override
bool Uint64(std::uint64_t i) override
int db_make_json(DB_VALUE *value, JSON_DOC *json_document, bool need_clear)
const char * get_schema_raw() const
void db_json_delete_json_iterator(JSON_ITERATOR *&json_itr)
bool db_json_are_validators_equal(JSON_VALIDATOR *val1, JSON_VALIDATOR *val2)
unsigned int db_json_get_length(const JSON_DOC *document)
static bool db_json_value_has_numeric_type(const JSON_VALUE *doc)
virtual int CallBefore(const JSON_VALUE &value)
bool Int64(std::int64_t i) override
bool Uint(unsigned i) override
double db_json_get_double_from_document(const JSON_DOC *doc)
void WriteDelimiters(bool is_key=false)
int db_json_merge_patch_func(const JSON_DOC *source, JSON_DOC *&dest)
bool SaveSizePointers(char *ptr)
virtual bool has_next()=0
static void db_json_merge_patch_values(const JSON_VALUE &source, JSON_VALUE &dest, JSON_PRIVATE_MEMPOOL &allocator)
JSON_MEMBER_ITERATOR m_iterator
bool Double(double d) override
bool parent_exists(JSON_DOC &jd) const
void db_make_json_from_doc_store_and_release(DB_VALUE &value, JSON_DOC_STORE &doc_store)
bool points_to_array_cell() const
int db_json_replace_func(const JSON_DOC *value, JSON_DOC &doc, const char *raw_path)
#define ER_TF_BUFFER_OVERFLOW
JSON_DOC * db_get_json_document(const DB_VALUE *value)
const JSON_DOC * db_json_iterator_get_document(JSON_ITERATOR &json_itr)
JSON_ITERATOR * db_json_create_iterator(const DB_JSON_TYPE &type)
static int db_json_unpack_string_to_value(OR_BUF *buf, JSON_VALUE &value, JSON_PRIVATE_MEMPOOL &doc_allocator)
#define ER_JSON_INVALID_JSON
rapidjson::GenericStringBuffer< JSON_ENCODING, JSON_PRIVATE_ALLOCATOR > JSON_STRING_BUFFER
static void db_json_merge_preserve_values(const JSON_VALUE &source, JSON_VALUE &dest, JSON_PRIVATE_MEMPOOL &allocator)
int parse(const char *path)
double or_get_double(OR_BUF *buf, int *error)
int db_json_normalize_path_string(const char *pointer_path, std::string &output)
JSON_VALIDATOR(const char *schema_raw)
#define ER_JSON_EXPECTING_JSON_DOC
char * db_json_get_json_body_from_document(const JSON_DOC &doc)
rapidjson::GenericArray< true, JSON_VALUE >::ConstValueIterator JSON_VALUE_ITERATOR
bool String(const Ch *str, SizeType length, bool copy) override
bool PackType(const DB_JSON_TYPE &type)
bool Uint64(std::uint64_t i) override
static double db_json_get_double_from_value(const JSON_VALUE *doc)
virtual int CallAfter(const JSON_VALUE &value)
bool db_json_iterator_has_next(JSON_ITERATOR &json_itr)
static int db_json_or_buf_underflow(OR_BUF *buf, size_t length)
JSON_PATH_MAPPER(map_func_type func)
int db_get_enum_string_size(const DB_VALUE *value)
#define ER_QSTR_INVALID_DATA_TYPE
bool db_json_iterator_is_empty(const JSON_ITERATOR &json_itr)
bool is_last_array_index_less_than(size_t size) const
JSON_DOC * db_json_get_copy_of_doc(const JSON_DOC *doc)
void db_json_set_double_to_doc(JSON_DOC *doc, double d)
bool db_json_is_valid(const char *json_str)
bool String(const Ch *str, SizeType length, bool copy) override
bool db_json_doc_is_uncomparable(const JSON_DOC *doc)
bool Key(const Ch *str, SizeType length, bool copy) override
bool EndArray(SizeType elementCount) override
int db_json_extract_document_from_path(const JSON_DOC *document, const std::string &path, JSON_DOC_STORE &result, bool allow_wildcards)
void db_json_pretty_func(const JSON_DOC &doc, char *&result_str)
int db_json_remove_func(JSON_DOC &doc, const char *raw_path)
bool Key(const Ch *str, SizeType length, bool copy) override
int db_value_to_json_path(const DB_VALUE &path_value, FUNC_TYPE fcode, std::string &path_str)
bool is_root_path() const
int db_json_value_is_contained_in_doc(const JSON_DOC *doc, const JSON_DOC *value, bool &result)
rapidjson::GenericMemberIterator< true, JSON_ENCODING, JSON_PRIVATE_MEMPOOL >::Iterator JSON_MEMBER_ITERATOR
bool PackString(const char *str)
bool EndArray(SizeType elementCount) override
bool Double(double d) override
bool Uint(unsigned i) override
enum tp_domain_status TP_DOMAIN_STATUS
const PATH_TOKEN * get_last_token() const
int CallOnArrayIterate() override
level_context(DB_JSON_TYPE type, bool is_first)
void db_json_set_string_to_doc(JSON_DOC *doc, const char *str, unsigned len)
rapidjson::SchemaDocument * m_schema
void push_array_index(unsigned long idx)
bool Key(const Ch *str, SizeType length, bool copy) override
JSON_DOC * db_json_make_json_array()
virtual bool StartArray()
static int db_json_er_set_expected_other_type(const char *file_name, const int line_no, const JSON_PATH &path, const DB_JSON_TYPE &found_type, const DB_JSON_TYPE &expected_type, const DB_JSON_TYPE &expected_type_optional=DB_JSON_NULL)
static void db_json_merge_two_json_array_values(const JSON_VALUE &source, JSON_VALUE &dest, JSON_PRIVATE_MEMPOOL &allocator)
static void db_json_get_paths_helper(const JSON_VALUE &obj, const std::string &sql_path, std::vector< std::string > &paths)
static int db_json_unpack_bigint_to_value(OR_BUF *buf, JSON_VALUE &value)
static void db_json_add_element_to_array(JSON_DOC *doc, const JSON_VALUE *value)
std::size_t GetLength() const
bool Uint64(std::uint64_t i) override
virtual bool Key(const Ch *str, SizeType length, bool copy)
int db_make_string(DB_VALUE *value, DB_CONST_C_CHAR str)
int db_json_get_all_paths_func(const JSON_DOC &doc, JSON_DOC *&result_json)
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
std::size_t db_json_serialize_length(const JSON_DOC &doc)
void db_json_iterator_next(JSON_ITERATOR &json_itr)
rapidjson::MemoryPoolAllocator< JSON_PRIVATE_ALLOCATOR > JSON_PRIVATE_MEMPOOL
JSON_VALUE_ITERATOR m_iterator
std::size_t GetTypePackedSize(void) const
JSON_VALIDATOR * db_json_copy_validator(JSON_VALIDATOR *validator)
JSON_SERIALIZER(OR_BUF &buffer)
static void db_json_object_add_member(const JSON_VALUE &name, const JSON_VALUE &value, JSON_VALUE &dest_object, JSON_PRIVATE_MEMPOOL &allocator)
JSON_DOC * db_json_make_json_object()
int or_packed_string_length(const char *string, int *strlen)
void PushLevel(const DB_JSON_TYPE &type)
DB_TYPE db_value_domain_type(const DB_VALUE *value)
char * db_private_strdup(THREAD_ENTRY *thrd, const char *s)
static int db_json_deserialize_doc_internal(OR_BUF *buf, JSON_VALUE &value, JSON_PRIVATE_MEMPOOL &doc_allocator)
static bool db_json_get_bool_from_value(const JSON_VALUE *doc)
#define ER_JSON_PATH_IS_NOT_ARRAY_CELL
static int db_json_unpack_int_to_value(OR_BUF *buf, JSON_VALUE &value)
void generate_schema_validator(void)
#define ER_OUT_OF_VIRTUAL_MEMORY
const char * db_json_get_schema_raw_from_validator(JSON_VALIDATOR *val)
int db_json_array_insert_func(const JSON_DOC *value, JSON_DOC &doc, const char *raw_path)
virtual bool StartObject()
int or_put_int(OR_BUF *buf, int num)
DB_BIGINT or_get_bigint(OR_BUF *buf, int *error)
#define DB_VALUE_DOMAIN_TYPE(value)
void push_object_key(std::string &&object_key)
#define DB_IS_STRING(value)
int or_put_bigint(OR_BUF *buf, DB_BIGINT num)
static void db_json_merge_two_json_objects_preserve(const JSON_VALUE &source, JSON_VALUE &dest, JSON_PRIVATE_MEMPOOL &allocator)
std::function< int(const JSON_VALUE &, const JSON_PATH &, bool &)> map_func_type
const JSON_DOC * m_input_doc
int or_align(OR_BUF *buf, int alignment)
const char * db_json_get_type_as_str(const JSON_DOC *document)
int db_json_get_int_from_document(const JSON_DOC *doc)
std::int64_t db_json_get_bigint_from_document(const JSON_DOC *doc)
void db_json_delete_doc(JSON_DOC *&doc)
static int db_json_unpack_bool_to_value(OR_BUF *buf, JSON_VALUE &value)
void db_json_set_iterator(JSON_ITERATOR *&json_itr, const JSON_DOC &new_doc)
static int db_json_contains_duplicate_keys(const JSON_DOC &doc)
virtual bool Double(double d)
static char * db_json_get_bool_as_str_from_value(const JSON_VALUE *doc)
#define ER_JSON_DUPLICATE_KEY
int db_string_put_cs_and_collation(DB_VALUE *value, const int codeset, const int collation_id)
TP_DOMAIN_STATUS tp_value_cast(const DB_VALUE *src, DB_VALUE *dest, const TP_DOMAIN *desired_domain, bool implicit_coercion)
static int db_json_unpack_array_to_value(OR_BUF *buf, JSON_VALUE &value, JSON_PRIVATE_MEMPOOL &doc_allocator)
bool EndArray(SizeType elementCount) override
int db_json_merge_preserve_func(const JSON_DOC *source, JSON_DOC *&dest)
static void db_json_merge_two_json_objects_patch(const JSON_VALUE &source, JSON_VALUE &dest, JSON_PRIVATE_MEMPOOL &allocator)
void db_json_set_bigint_to_doc(JSON_DOC *doc, std::int64_t i)
JSON_PATH get_parent() const
static int db_json_get_json_from_str(const char *json_raw, JSON_DOC &doc, size_t json_raw_length)
static int db_json_get_int_from_value(const JSON_VALUE *val)
#define ER_JSON_EXPECTED_OTHER_TYPE
int WalkDocument(const JSON_DOC &document)
virtual bool EndArray(SizeType elementCount)
const char * pr_type_name(DB_TYPE id)
char * db_json_copy_string_from_document(const JSON_DOC *doc)
void SetSizePointers(SizeType size)
virtual int CallOnKeyIterate(const JSON_VALUE &key)
bool Bool(bool b) override
std::string dump_json_path() const
#define db_private_free(thrd, ptr)
static unsigned int db_json_value_get_depth(const JSON_VALUE *doc)
int db_json_serialize(const JSON_DOC &doc, or_buf &buffer)
std::size_t GetStringPackedSize(const char *str) const
int db_json_path_unquote_object_keys(std::string &sql_path)
bool StartArray() override
int count(int &result, const cub_regex_object ®, const std::string &src, const int position, const INTL_CODESET codeset)
int pr_clear_value(DB_VALUE *value)
int db_json_search_func(const JSON_DOC &doc, const DB_VALUE *pattern, const DB_VALUE *esc_char, std::vector< JSON_PATH > &paths, const std::vector< std::string > &patterns, bool find_all)
DB_JSON_TYPE db_json_get_type(const JSON_DOC *doc)
int db_json_copy_and_convert_to_utf8(const DB_VALUE *src_dbval, DB_VALUE *dest_dbval, const DB_VALUE **json_str_dbval)
bool Uint(unsigned i) override
static const char * db_json_get_string_from_value(const JSON_VALUE *doc)
int db_json_path_unquote_object_keys_external(std::string &sql_path)
bool String(const Ch *str, SizeType length, bool copy) override
static void db_json_copy_doc(JSON_DOC &dest, const JSON_DOC *src)
int db_json_deserialize(OR_BUF *buf, JSON_DOC *&doc)
DB_CONST_C_CHAR db_get_enum_string(const DB_VALUE *value)
#define TP_IS_CHAR_TYPE(typeid)
void SetIndentOnNewLine()
int validate(const JSON_DOC *doc) const
static std::int64_t db_json_get_bigint_from_value(const JSON_VALUE *val)
static void error(const char *msg)
bool StartObject() override
bool Int64(std::int64_t i) override
char * or_pack_int(char *ptr, int number)
int db_json_array_append_func(const JSON_DOC *value, JSON_DOC &doc, const char *raw_path)
int db_json_validate_json(const char *json_body)
int db_json_unquote(const JSON_DOC &doc, char *&result_str)
#define ER_JSON_INVALID_PATH
bool db_value_is_null(const DB_VALUE *value)
unsigned long get_array_index() const
static const int MAX_CHUNK_SIZE
void db_json_reset_iterator(JSON_ITERATOR *&json_itr)
bool StartArray() override
void db_json_set_int_to_doc(JSON_DOC *doc, int i)
virtual bool Int64(std::int64_t i)
int db_json_keys_func(const JSON_DOC &doc, JSON_DOC &result_json, const char *raw_path)
int CallOnKeyIterate(const JSON_VALUE &key) override
static void db_json_array_push_back(const JSON_VALUE &value, JSON_VALUE &dest_array, JSON_PRIVATE_MEMPOOL &allocator)
virtual bool String(const Ch *str, SizeType length, bool copy)
const char * db_json_get_string_from_document(const JSON_DOC *doc)
unsigned int db_json_get_depth(const JSON_DOC *doc)
void set(JSON_DOC &jd, const JSON_VALUE &jv) const
int db_string_escape_str(const char *src_str, size_t src_size, char **res_string, size_t *dest_size)
virtual bool Bool(bool b)
int or_underflow(OR_BUF *buf)
bool is_last_token_array_index_zero() const
void db_json_clear_json_iterator(JSON_ITERATOR *&json_itr)
virtual bool RawNumber(const Ch *str, SizeType length, bool copy)
bool EndObject(SizeType memberCount) override
const JSON_DOC * get_value_to_doc()
virtual bool Uint(unsigned i)
void db_json_make_document_null(JSON_DOC *doc)
void db_json_delete_validator(JSON_VALIDATOR *&validator)
JSON_VALUE * get(JSON_DOC &jd) const
bool Bool(bool b) override
int db_json_validate_doc(JSON_VALIDATOR *validator, JSON_DOC *doc)
bool db_json_are_docs_equal(const JSON_DOC *doc1, const JSON_DOC *doc2)
std::string db_json_json_string_as_utf8(std::string raw_json_string)
bool EndObject(SizeType memberCount) override
virtual bool Uint64(std::uint64_t i)
int db_json_load_validator(const char *json_schema_raw, JSON_VALIDATOR *&validator)
int db_get_string_size(const DB_VALUE *value)
#define ER_JSON_NO_JSON_OBJECT_PROVIDED
rapidjson::SchemaValidator * m_validator
rapidjson::GenericValue< JSON_ENCODING, JSON_PRIVATE_MEMPOOL > JSON_VALUE
int db_string_like(const DB_VALUE *src_string, const DB_VALUE *pattern, const DB_VALUE *esc_char, int *result)
rapidjson::Document m_document
int db_make_null(DB_VALUE *value)
static const char * db_json_get_json_type_as_str(const DB_JSON_TYPE &json_type)
int CallBefore(const JSON_VALUE &value) override
std::stack< level_context > m_level_stack
#define ER_ARG_CAN_NOT_BE_CASTED_TO_DESIRED_DOMAIN
char * strdup(const char *str)
int db_json_add_member_to_object(JSON_DOC *doc, const char *name, const char *value)
static int db_json_er_set_path_does_not_exist(const char *file_name, const int line_no, const JSON_PATH &path, const JSON_DOC *doc)
JSON_VALIDATOR & operator=(const JSON_VALIDATOR ©)
int db_json_contains_path(const JSON_DOC *document, const std::vector< std::string > &paths, bool find_all, bool &result)
std::stack< char * > m_size_pointers
static int db_json_unpack_object_to_value(OR_BUF *buf, JSON_VALUE &value, JSON_PRIVATE_MEMPOOL &doc_allocator)
static int db_json_value_is_contained_in_doc_helper(const JSON_VALUE *doc, const JSON_VALUE *value, bool &result)
int or_put_double(OR_BUF *buf, double num)
int WalkValue(const JSON_VALUE &value)
int db_json_insert_func(const JSON_DOC *value, JSON_DOC &doc, const char *raw_path)
#define ER_JSON_INVALIDATED_BY_SCHEMA
int CallBefore(const JSON_VALUE &value) override
static char * db_json_bool_to_string(bool b)
static MATCH_RESULT match_pattern(const JSON_PATH &pattern, const JSON_PATH &path)
virtual bool EndObject(SizeType memberCount)
bool StartObject() override
int or_get_int(OR_BUF *buf, int *error)
int db_value_to_json_value(const DB_VALUE &db_val, JSON_DOC_STORE &json_doc)
static char * db_json_copy_string_from_value(const JSON_VALUE *doc)
int or_put_string_aligned_with_length(OR_BUF *buf, const char *str)
bool Double(double d) override
int db_json_object_contains_key(JSON_DOC *obj, const char *key, int &result)
DB_JSON_TYPE db_json_get_type_of_value(const JSON_VALUE *val)
bool EndObject(SizeType memberCount) override
bool StartObject() override
virtual int CallOnArrayIterate()
int db_value_to_json_doc(const DB_VALUE &db_val, bool force_copy, JSON_DOC_STORE &json_doc)
bool erase(JSON_DOC &jd) const
int CallAfter(const JSON_VALUE &value) override
bool db_json_path_contains_wildcard(const char *sql_path)
int db_value_to_json_key(const DB_VALUE &db_val, std::string &key_str)
bool Int64(std::int64_t i) override
bool db_json_get_bool_from_document(const JSON_DOC *doc)
static int db_json_add_json_value_to_object(JSON_DOC &doc, const char *name, JSON_VALUE &value)
char * db_json_get_bool_as_str_from_document(const JSON_DOC *doc)
bool Bool(bool b) override
virtual void set(const JSON_DOC &new_doc)=0
JSON_DOC * db_json_allocate_doc()
DB_CONST_C_CHAR db_get_string(const DB_VALUE *value)
static int db_json_unpack_double_to_value(OR_BUF *buf, JSON_VALUE &value)
const char * fcode_get_uppercase_name(FUNC_TYPE ftype)
int db_json_set_func(const JSON_DOC *value, JSON_DOC &doc, const char *raw_path)
char * db_json_get_raw_json_body_from_document(const JSON_DOC *doc)