From 6b979416e0e4eac0a036ca5f2b81b748a3d2e680 Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Thu, 10 Jan 2019 05:55:23 +0530 Subject: Extending the API for json_writer by introdcing classes for Json_writer_object and Json_writer_array. These classes will be used for the implementation of the optimizer trace. --- sql/my_json_writer.cc | 73 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 65 insertions(+), 8 deletions(-) (limited to 'sql/my_json_writer.cc') diff --git a/sql/my_json_writer.cc b/sql/my_json_writer.cc index d219e88b98b..9c4d63f9c4a 100644 --- a/sql/my_json_writer.cc +++ b/sql/my_json_writer.cc @@ -16,7 +16,6 @@ #include "mariadb.h" #include "sql_priv.h" #include "sql_string.h" - #include "my_json_writer.h" void Json_writer::append_indent() @@ -62,6 +61,7 @@ void Json_writer::end_object() indent_level-=INDENT_SIZE; if (!first_child) append_indent(); + first_child= false; output.append("}"); } @@ -129,7 +129,6 @@ void Json_writer::add_ll(longlong val) add_unquoted_str(buf); } - /* Add a memory size, printing in Kb, Kb, Gb if necessary */ void Json_writer::add_size(longlong val) { @@ -173,7 +172,7 @@ void Json_writer::add_null() void Json_writer::add_unquoted_str(const char* str) { - if (fmt_helper.on_add_str(str)) + if (fmt_helper.on_add_str(str, 0)) return; if (!element_started) @@ -183,10 +182,9 @@ void Json_writer::add_unquoted_str(const char* str) element_started= false; } - void Json_writer::add_str(const char *str) { - if (fmt_helper.on_add_str(str)) + if (fmt_helper.on_add_str(str, 0)) return; if (!element_started) @@ -198,12 +196,70 @@ void Json_writer::add_str(const char *str) element_started= false; } +/* + This function is used to add only num_bytes of str to the output string +*/ + +void Json_writer::add_str(const char* str, size_t num_bytes) +{ + if (fmt_helper.on_add_str(str, num_bytes)) + return; + + if (!element_started) + start_element(); + + output.append('"'); + output.append(str, num_bytes); + output.append('"'); + element_started= false; +} void Json_writer::add_str(const String &str) { - add_str(str.ptr()); + add_str(str.ptr(), str.length()); } +Json_writer_object::Json_writer_object(Json_writer *writer):Json_writer_struct(writer) +{ + if (my_writer) + my_writer->start_object(); +} + +Json_writer_object::Json_writer_object(Json_writer *writer, const char *str) + :Json_writer_struct(writer) +{ + if (my_writer) + my_writer->add_member(str).start_object(); + +} +Json_writer_object::~Json_writer_object() +{ + if (!closed && my_writer) + my_writer->end_object(); + closed= TRUE; +} + +Json_writer_array::Json_writer_array(Json_writer *writer):Json_writer_struct(writer) +{ + if (my_writer) + my_writer->start_array(); +} + +Json_writer_array::Json_writer_array(Json_writer *writer, const char *str) + :Json_writer_struct(writer) +{ + if (my_writer) + my_writer->add_member(str).start_array(); + +} +Json_writer_array::~Json_writer_array() +{ + if (!closed && my_writer) + { + my_writer->end_array(); + closed= TRUE; + } +} bool Single_line_formatting_helper::on_add_member(const char *name) { @@ -267,11 +323,12 @@ void Single_line_formatting_helper::on_start_object() } -bool Single_line_formatting_helper::on_add_str(const char *str) +bool Single_line_formatting_helper::on_add_str(const char *str, + size_t num_bytes) { if (state == IN_ARRAY) { - size_t len= strlen(str); + size_t len= num_bytes ? num_bytes : strlen(str); // New length will be: // "$string", -- cgit v1.2.1