diff options
author | Varun Gupta <varun.gupta@mariadb.com> | 2019-01-10 05:55:23 +0530 |
---|---|---|
committer | Varun Gupta <varun.gupta@mariadb.com> | 2019-02-13 11:52:35 +0530 |
commit | 6b979416e0e4eac0a036ca5f2b81b748a3d2e680 (patch) | |
tree | 1224c98bdc5ba3e4152e0eb2edea0589d8a8f2ac /sql/my_json_writer.cc | |
parent | 4d5f85a3ec59b4a417da39a229fbb58e79c32029 (diff) | |
download | mariadb-git-6b979416e0e4eac0a036ca5f2b81b748a3d2e680.tar.gz |
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.
Diffstat (limited to 'sql/my_json_writer.cc')
-rw-r--r-- | sql/my_json_writer.cc | 73 |
1 files changed, 65 insertions, 8 deletions
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", |