summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnel Husakovic <anel@mariadb.org>2019-05-24 03:27:28 -0700
committerAnel Husakovic <anel@mariadb.org>2019-07-08 08:53:29 -0700
commita4a3149f1e7688535df9fa7fea17042723e739ba (patch)
tree4882be917d9692bcac207c6fc199dcb7b3249fc5
parent8cc7d3ee3f57d875c305076493c80dbefd2814c9 (diff)
downloadmariadb-git-a4a3149f1e7688535df9fa7fea17042723e739ba.tar.gz
Add parsing of of mysql json object with INT values (0x5)
- Used `string::append_longlong()` and is looking as: ``` (gdb) p buffer->Ptr $1 = 0x7fffe00306e8 "{\"a\":2}" ``` @todo test with big >0 and <0 ints in mysql - After this step strings are getting double qoutes (mysql has `double_qoute()` ``` (gdb) p buffer->Ptr $1 = 0x7fffe004ae48 "{\"key1\":\"val1\",\"key2\":\"val2\"}", ```
-rw-r--r--sql/mysql_json.cc39
-rw-r--r--sql/mysql_json.h4
2 files changed, 29 insertions, 14 deletions
diff --git a/sql/mysql_json.cc b/sql/mysql_json.cc
index 062dd3bdaed..4a158802281 100644
--- a/sql/mysql_json.cc
+++ b/sql/mysql_json.cc
@@ -77,6 +77,7 @@ bool parse_array_or_object(Field_mysql_json::enum_type t, const char *data,
if (header_size > bytes)
return true; /* purecov: inspected */
+ String *buffer= new String(); // this will go as parameter
if (t==Field_mysql_json::enum_type::OBJECT)
{
@@ -84,8 +85,6 @@ bool parse_array_or_object(Field_mysql_json::enum_type t, const char *data,
size_t value_type_offset, value_counter(0);
bool is_last(false);
- String *buffer= new String();
-
if(buffer->append('{'))
return true;
@@ -105,14 +104,20 @@ bool parse_array_or_object(Field_mysql_json::enum_type t, const char *data,
//keys->append((const char*)key_element); // generating error
//keys->append(STRING_WITH_LEN(key_element));
- buffer->append(String((const char *)key_element, &my_charset_bin));
+ if(buffer->append('"'))
+ return true;
+ if( buffer->append(String((const char *)key_element, &my_charset_bin)) )
+ return true;
+ if(buffer->append('"'))
+ return true;
delete[] key_element;
-
+ if(buffer->append(":"))
+ return true;
// @anel calculate value type and get a value
value_type_offset= 2*offset_size+ (large?KEY_ENTRY_SIZE_LARGE:KEY_ENTRY_SIZE_SMALL)*(element_count)+(large ? VALUE_ENTRY_SIZE_LARGE : VALUE_ENTRY_SIZE_SMALL)*value_counter;
- // value_json_type= data[value_type_offset];
value_counter++;
- check_value_type_and_append(buffer, value_type_offset, data, is_last, large, 0);
+
+ check_mysql_value_type_and_append(buffer, value_type_offset, data, is_last, large, 0);
if(i!=(element_count-1))
is_last=true;
@@ -125,7 +130,7 @@ bool parse_array_or_object(Field_mysql_json::enum_type t, const char *data,
return 1;
}
- bool check_value_type_and_append(String* buffer, size_t value_type_offset, const char *data, bool is_last, bool large, size_t depth)
+ bool check_mysql_value_type_and_append(String* buffer, size_t value_type_offset, const char *data, bool is_last, bool large, size_t depth)
{
size_t value_json_type, value_length, value_length_ptr;
char *value_element;
@@ -134,18 +139,28 @@ bool parse_array_or_object(Field_mysql_json::enum_type t, const char *data,
return true;
value_json_type= data[value_type_offset];
+ value_length_ptr= read_offset_or_size(data+value_type_offset+1, large);
+ value_length= (uint) data[value_length_ptr];
+
switch(value_json_type)
{
+ case JSONB_TYPE_INT16 :
+ {
+ // value_length_ptr is a value of interest (negative should work, @todo)
+ buffer->append_longlong((longlong) (value_length_ptr));
+ break;
+ }
case JSONB_TYPE_STRING:
{
-
- value_length_ptr= read_offset_or_size(data+value_type_offset+1, large);
- value_length= (uint) data[value_length_ptr];
value_element= new char[value_length+1];
memmove(value_element, const_cast<char*>(&data[value_length_ptr+1]), value_length);
value_element[value_length]= '\0';
- buffer->append(":");
- buffer->append(String((const char *)value_element, &my_charset_bin));
+ if(buffer->append('"'))
+ return true;
+ if( buffer->append(String((const char *)value_element, &my_charset_bin)) )
+ return true;
+ if(buffer->append('"'))
+ return true;
delete[] value_element;
if(!is_last)
buffer->append(",");
diff --git a/sql/mysql_json.h b/sql/mysql_json.h
index f84fe5025ae..71b83b45eb9 100644
--- a/sql/mysql_json.h
+++ b/sql/mysql_json.h
@@ -143,6 +143,6 @@ size_t read_offset_or_size(const char *, bool);
bool parse_array_or_object(Field_mysql_json::enum_type,
const char *,size_t , bool);
bool parse_scalar();
- bool check_value_type_and_append(String* buffer, size_t value_type_offset, const char *data, bool is_last, bool large, size_t depth);
-
+ bool check_mysql_value_type_and_append(String* buffer, size_t value_type_offset, const char *data, bool is_last, bool large, size_t depth);
+
#endif /* MYSQL_JSON_INCLUDED */ \ No newline at end of file