MySQL 9.1.0
Source Code Documentation
json_binary.h
Go to the documentation of this file.
1#ifndef JSON_BINARY_INCLUDED
2#define JSON_BINARY_INCLUDED
3
4/* Copyright (c) 2015, 2024, Oracle and/or its affiliates.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License, version 2.0,
8 as published by the Free Software Foundation.
9
10 This program is designed to work with certain software (including
11 but not limited to OpenSSL) that is licensed under separate terms,
12 as designated in a particular file or component or in included license
13 documentation. The authors of MySQL hereby grant you an additional
14 permission to link the program and your derivative works with the
15 separately licensed software that they have either included with
16 the program or referenced in the documentation.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License, version 2.0, for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
26
27/**
28 @file
29
30 This file specifies the interface for serializing JSON values into
31 binary representation, and for reading values back from the binary
32 representation.
33
34 The binary format is as follows:
35
36 Each JSON value (scalar, object or array) has a one byte type
37 identifier followed by the actual value.
38
39 If the value is a JSON object, its binary representation will have a
40 header that contains:
41
42 - the member count
43 - the size of the binary value in bytes
44 - a list of pointers to each key
45 - a list of pointers to each value
46
47 The actual keys and values will come after the header, in the same
48 order as in the header.
49
50 Similarly, if the value is a JSON array, the binary representation
51 will have a header with
52
53 - the element count
54 - the size of the binary value in bytes
55 - a list of pointers to each value
56
57 followed by the actual values, in the same order as in the header.
58
59 @verbatim
60 doc ::= type value
61
62 type ::=
63 0x00 | // small JSON object
64 0x01 | // large JSON object
65 0x02 | // small JSON array
66 0x03 | // large JSON array
67 0x04 | // literal (true/false/null)
68 0x05 | // int16
69 0x06 | // uint16
70 0x07 | // int32
71 0x08 | // uint32
72 0x09 | // int64
73 0x0a | // uint64
74 0x0b | // double
75 0x0c | // utf8mb4 string
76 0x0f // custom data (any MySQL data type)
77
78 value ::=
79 object |
80 array |
81 literal |
82 number |
83 string |
84 custom-data
85
86 object ::= element-count size key-entry* value-entry* key* value*
87
88 array ::= element-count size value-entry* value*
89
90 // number of members in object or number of elements in array
91 element-count ::=
92 uint16 | // if used in small JSON object/array
93 uint32 // if used in large JSON object/array
94
95 // number of bytes in the binary representation of the object or array
96 size ::=
97 uint16 | // if used in small JSON object/array
98 uint32 // if used in large JSON object/array
99
100 key-entry ::= key-offset key-length
101
102 key-offset ::=
103 uint16 | // if used in small JSON object
104 uint32 // if used in large JSON object
105
106 key-length ::= uint16 // key length must be less than 64KB
107
108 value-entry ::= type offset-or-inlined-value
109
110 // This field holds either the offset to where the value is stored,
111 // or the value itself if it is small enough to be inlined (that is,
112 // if it is a JSON literal or a small enough [u]int).
113 offset-or-inlined-value ::=
114 uint16 | // if used in small JSON object/array
115 uint32 // if used in large JSON object/array
116
117 key ::= utf8mb4-data
118
119 literal ::=
120 0x00 | // JSON null literal
121 0x01 | // JSON true literal
122 0x02 | // JSON false literal
123
124 number ::= .... // little-endian format for [u]int(16|32|64), whereas
125 // double is stored in a platform-independent, eight-byte
126 // format using float8store()
127
128 string ::= data-length utf8mb4-data
129
130 custom-data ::= custom-type data-length binary-data
131
132 custom-type ::= uint8 // type identifier that matches the
133 // internal enum_field_types enum
134
135 data-length ::= uint8* // If the high bit of a byte is 1, the length
136 // field is continued in the next byte,
137 // otherwise it is the last byte of the length
138 // field. So we need 1 byte to represent
139 // lengths up to 127, 2 bytes to represent
140 // lengths up to 16383, and so on...
141 @endverbatim
142*/
143
144#include <stddef.h>
145#include <cassert>
146#include <cstdint>
147#include <string>
148#include <string_view>
149
150/*
151 This file is part of our public interface for the 'json_binary' library.
152 This means that #includes of MySQL headers here should be limited to
153 files that are INSTALLed.
154*/
155#include "field_types.h" // enum_field_types
157
158#ifdef MYSQL_SERVER
159class Field_json;
160class Json_wrapper;
161class THD;
162#endif
163
164class Json_dom;
165class String;
166
167#if defined(WIN32) && defined(EXPORT_JSON_FUNCTIONS)
168#define EXPORT_JSON_FUNCTION __declspec(dllexport)
169#else
170#define EXPORT_JSON_FUNCTION
171#endif
172
173namespace json_binary {
174
175inline constexpr char JSONB_TYPE_SMALL_OBJECT = 0x0;
176inline constexpr char JSONB_TYPE_LARGE_OBJECT = 0x1;
177inline constexpr char JSONB_TYPE_SMALL_ARRAY = 0x2;
178inline constexpr char JSONB_TYPE_LARGE_ARRAY = 0x3;
179inline constexpr char JSONB_TYPE_LITERAL = 0x4;
180inline constexpr char JSONB_TYPE_INT16 = 0x5;
181inline constexpr char JSONB_TYPE_UINT16 = 0x6;
182inline constexpr char JSONB_TYPE_INT32 = 0x7;
183inline constexpr char JSONB_TYPE_UINT32 = 0x8;
184inline constexpr char JSONB_TYPE_INT64 = 0x9;
185inline constexpr char JSONB_TYPE_UINT64 = 0xA;
186inline constexpr char JSONB_TYPE_DOUBLE = 0xB;
187inline constexpr char JSONB_TYPE_STRING = 0xC;
188inline constexpr char JSONB_TYPE_OPAQUE = 0xF;
189
190inline constexpr char JSONB_NULL_LITERAL = 0x0;
191inline constexpr char JSONB_TRUE_LITERAL = 0x1;
192inline constexpr char JSONB_FALSE_LITERAL = 0x2;
193
194void write_offset_or_size(char *dest, size_t offset_or_size, bool large);
195
196bool append_offset_or_size(String *dest, size_t offset_or_size, bool large);
197
198bool append_int16(String *dest, int16_t value);
199
200bool attempt_inline_value(const Json_dom *value, String *dest, size_t pos,
201 bool large);
202
203uint32_t read_offset_or_size(const char *data, bool large);
204
205bool inlined_type(uint8_t type, bool large);
206
207uint8_t offset_size(bool large);
208uint8_t key_entry_size(bool large);
209uint8_t value_entry_size(bool large);
210
211/**
212 Serialize the JSON document represented by dom to binary format in
213 the destination string, replacing any content already in the
214 destination string.
215
216 @param[in] dom the input DOM tree
217 @param error_handler a handler that is invoked if an error occurs
218 @param[in,out] dest the destination string
219 @retval false on success
220 @retval true if an error occurred
221 */
222bool serialize(const Json_dom *dom,
223 const JsonSerializationErrorHandler &error_handler,
224 String *dest);
225
226/**
227 Class used for reading JSON values that are stored in the binary
228 format. Values are parsed lazily, so that only the parts of the
229 value that are interesting to the caller, are read. Array elements
230 can be looked up in constant time using the element() function.
231 Object members can be looked up in O(log n) time using the lookup()
232 function.
233*/
234class Value {
235 public:
236 enum enum_type : uint8_t {
247 ERROR /* Not really a type. Used to signal that an
248 error was detected. */
249 };
250
251 /**
252 Does this value, and all of its members, represent a valid JSON
253 value?
254 */
256 bool is_valid() const;
257
259 enum_type type() const { return m_type; }
260
261 /// Does this value use the large storage format?
263 bool large_format() const { return m_large; }
264
265 /**
266 Get a pointer to the beginning of the STRING or OPAQUE data
267 represented by this instance.
268 */
270 const char *get_data() const {
271 assert(m_type == STRING || m_type == OPAQUE);
272 return m_data;
273 }
274
275 /**
276 Get the length in bytes of the STRING or OPAQUE value represented by
277 this instance.
278 */
280 uint32_t get_data_length() const {
281 assert(m_type == STRING || m_type == OPAQUE);
282 return m_length;
283 }
284
285 /**
286 Get the length in bytes of the STRING or OPAQUE value represented by
287 this instance.
288 */
290 uint32_t get_container_length() const {
291 assert(m_type == ARRAY || m_type == OBJECT);
292 return m_length;
293 }
294
296 const char *get_container_data() const {
297 assert(m_type == ARRAY || m_type == OBJECT);
298 return m_data;
299 }
300
301 /** Get the value of an INT. */
303 int64_t get_int64() const {
304 assert(m_type == INT);
305 return m_int_value;
306 }
307
308 /** Get the value of a UINT. */
310 uint64_t get_uint64() const {
311 assert(m_type == UINT);
312 return static_cast<uint64_t>(m_int_value);
313 }
314
315 /** Get the value of a DOUBLE. */
317 double get_double() const {
318 assert(m_type == DOUBLE);
319 return m_double_value;
320 }
321
322 /**
323 Get the number of elements in an array, or the number of members in
324 an object.
325 */
327 uint32_t element_count() const {
328 assert(m_type == ARRAY || m_type == OBJECT);
329 return m_element_count;
330 }
331
332 /**
333 Get the MySQL field type of an opaque value. Identifies the type of
334 the value stored in the data portion of an opaque value.
335 */
338 assert(m_type == OPAQUE);
339 return m_field_type;
340 }
341
343 Value element(size_t pos) const;
344
346 Value key(size_t pos) const;
347
349 Value lookup(std::string_view key) const;
350
352 size_t lookup_index(std::string_view key) const;
353
355 bool is_backed_by(const String *str) const;
356
358 bool raw_binary(const JsonSerializationErrorHandler &error_handler,
359 String *buf) const;
361 bool get_free_space(const JsonSerializationErrorHandler &error_handler,
362 size_t *space) const;
363#ifdef MYSQL_SERVER
364 bool update_in_shadow(const Field_json *field, size_t pos,
365 Json_wrapper *new_value, size_t data_offset,
366 size_t data_length, const char *original,
367 char *destination, bool *changed) const;
368 bool remove_in_shadow(const Field_json *field, size_t pos,
369 const char *original, char *destination) const;
370#endif
372 bool has_space(size_t pos, size_t needed, size_t *offset) const;
373
374 /** Constructor for values that represent literals or errors. */
376 explicit Value(enum_type t) : m_data(nullptr), m_type(t) {
377 assert(t == LITERAL_NULL || t == LITERAL_TRUE || t == LITERAL_FALSE ||
378 t == ERROR);
379 }
380
381 /** Constructor for values that represent ints or uints. */
383 explicit Value(enum_type t, int64_t val) : m_int_value(val), m_type(t) {
384 assert(t == INT || t == UINT);
385 }
386
387 /** Constructor for values that represent doubles. */
389 explicit Value(double val) : m_double_value(val), m_type(DOUBLE) {}
390
391 /** Constructor for values that represent strings. */
393 Value(const char *data, uint32_t len)
394 : m_data(data), m_length(len), m_type(STRING) {}
395
396 /**
397 Constructor for values that represent arrays or objects.
398
399 @param t type
400 @param data pointer to the start of the binary representation
401 @param bytes the number of bytes in the binary representation of the value
402 @param element_count the number of elements or members in the value
403 @param large true if the value should be stored in the large
404 storage format with 4 byte offsets instead of 2 byte offsets
405 */
407 Value(enum_type t, const char *data, uint32_t bytes, uint32_t element_count,
408 bool large)
409 : m_data(data),
411 m_length(bytes),
412 m_type(t),
413 m_large(large) {
414 assert(t == ARRAY || t == OBJECT);
415 }
416
417 /** Constructor for values that represent opaque data. */
419 Value(enum_field_types ft, const char *data, uint32_t len)
420 : m_data(data), m_length(len), m_field_type(ft), m_type(OPAQUE) {}
421
422 /** Empty constructor. Produces a value that represents an error condition. */
425
426 /** Is this value an array? */
428 bool is_array() const { return m_type == ARRAY; }
429
430 /** Is this value an object? */
432 bool is_object() const { return m_type == OBJECT; }
433
434 /**
435 Format the JSON value to an external JSON string in buffer in
436 the format of ISO/IEC 10646.
437
438 @param[in,out] buffer the formatted string is appended, so make sure
439 the length is set correctly before calling
440 @param[in] depth_handler Pointer to a function that should handle error
441 occurred when depth is exceeded.
442
443 @return false formatting went well, else true
444 */
446 bool to_std_string(std::string *buffer,
447 const JsonErrorHandler &depth_handler) const;
448
449 /**
450 Format the JSON value to an external JSON string in buffer in the format of
451 ISO/IEC 10646. Add newlines and indentation for readability.
452
453 @param[in,out] buffer the buffer that receives the formatted string
454 (the string is appended, so make sure the length
455 is set correctly before calling)
456 @param[in] depth_handler Pointer to a function that should handle error
457 occurred when depth is exceeded.
458
459 @retval false on success
460 @retval true on error
461 */
463 bool to_pretty_std_string(std::string *buffer,
464 const JsonErrorHandler &depth_handler) const;
465
466 /**
467 Compare two Values
468 @note This function is limited to scalars only, for objects/arrays it
469 asserts. The main purpose is to separate old/new scalar values for updates
470 on multi-valued indexes.
471 @returns
472 -1 this < val
473 0 this == val
474 1 this > val
475 */
476#ifdef MYSQL_SERVER
477 int eq(const Value &val) const;
478#endif
479
481 size_t key_entry_offset(size_t pos) const;
482
484 size_t value_entry_offset(size_t pos) const;
485
486 private:
487 /*
488 Instances use only one of m_data, m_int_value and m_double_value,
489 so keep them in a union to save space in memory.
490 */
491 union {
492 /**
493 Pointer to the start of the binary representation of the value. Only
494 used by STRING, OPAQUE, OBJECT and ARRAY.
495
496 The memory pointed to by this member is not owned by this Value
497 object. Callers that create Value objects must make sure that the
498 memory is not freed as long as the Value object is alive.
499 */
500 const char *m_data;
501 /** The value if the type is INT or UINT. */
502 int64_t m_int_value;
503 /** The value if the type is DOUBLE. */
505 };
506
507 /**
508 Element count for arrays and objects. Unused for other types.
509 */
511
512 /**
513 The full length (in bytes) of the binary representation of an array or
514 object, or the length of a string or opaque value. Unused for other types.
515 */
516 uint32_t m_length;
517
518 /**
519 The MySQL field type of the value, in case the type of the value is
520 OPAQUE. Otherwise, it is unused.
521 */
523
524 /** The JSON type of the value. */
526
527 /**
528 True if an array or an object uses the large storage format with 4
529 byte offsets instead of 2 byte offsets.
530 */
532
533 bool first_value_offset(size_t *offset) const;
534 bool element_offsets(size_t pos, size_t *start, size_t *end,
535 bool *inlined) const;
536};
537
538/**
539 Parse a JSON binary document.
540
541 @param[in] data a pointer to the binary data
542 @param[in] len the size of the binary document in bytes
543 @return an object that allows access to the contents of the document
544*/
546Value parse_binary(const char *data, size_t len);
547
548/**
549 How much space is needed for a JSON value when it is stored in the binary
550 format.
551
552 @param[in] value the JSON value to add to a document
553 @param[in] large true if the large storage format is used
554 @param[out] needed gets set to the amount of bytes needed to store
555 the value
556 @retval false if successful
557 @retval true if an error occurred while calculating the needed space
558*/
559#ifdef MYSQL_SERVER
560bool space_needed(const Json_wrapper *value, bool large, size_t *needed);
561#endif
562
563/**
564 Apply a function to every value in a JSON document. That is, apply
565 the function to the root node of the JSON document, to all its
566 children, grandchildren and so on.
567
568 @param value the root of the JSON document
569 @param func the function to apply
570 @retval true if the processing was stopped
571 @retval false if the processing was completed
572
573 @tparam Func a functor type that takes a #json_binary::Value
574 parameter and returns a `bool` which is `true` if the processing
575 should stop or `false` if the processing should continue with the
576 next node
577*/
578template <typename Func>
579bool for_each_node(const Value &value, const Func &func) {
580 if (func(value)) return true;
581
582 if (value.is_array() || value.is_object())
583 for (size_t i = 0, size = value.element_count(); i < size; ++i)
584 if (for_each_node(value.element(i), func)) return true;
585
586 return false;
587}
588} // namespace json_binary
589
590#endif /* JSON_BINARY_INCLUDED */
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:251
A field that stores a JSON value.
Definition: field.h:4062
Error handler for the functions that serialize a JSON value in the JSON binary storage format.
Definition: json_error_handler.h:49
JSON DOM abstract base class.
Definition: json_dom.h:172
Abstraction for accessing JSON values irrespective of whether they are (started out as) binary JSON v...
Definition: json_dom.h:1150
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:167
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Class used for reading JSON values that are stored in the binary format.
Definition: json_binary.h:234
double m_double_value
The value if the type is DOUBLE.
Definition: json_binary.h:504
EXPORT_JSON_FUNCTION uint32_t element_count() const
Get the number of elements in an array, or the number of members in an object.
Definition: json_binary.h:327
EXPORT_JSON_FUNCTION const char * get_data() const
Get a pointer to the beginning of the STRING or OPAQUE data represented by this instance.
Definition: json_binary.h:270
EXPORT_JSON_FUNCTION Value(enum_field_types ft, const char *data, uint32_t len)
Constructor for values that represent opaque data.
Definition: json_binary.h:419
EXPORT_JSON_FUNCTION Value key(size_t pos) const
Get the key of the member stored at the specified position in a JSON object.
Definition: json_binary.cc:1131
EXPORT_JSON_FUNCTION enum_field_types field_type() const
Get the MySQL field type of an opaque value.
Definition: json_binary.h:337
EXPORT_JSON_FUNCTION Value(enum_type t, const char *data, uint32_t bytes, uint32_t element_count, bool large)
Constructor for values that represent arrays or objects.
Definition: json_binary.h:407
EXPORT_JSON_FUNCTION int64_t get_int64() const
Get the value of an INT.
Definition: json_binary.h:303
bool m_large
True if an array or an object uses the large storage format with 4 byte offsets instead of 2 byte off...
Definition: json_binary.h:531
EXPORT_JSON_FUNCTION Value(const char *data, uint32_t len)
Constructor for values that represent strings.
Definition: json_binary.h:393
int64_t m_int_value
The value if the type is INT or UINT.
Definition: json_binary.h:502
EXPORT_JSON_FUNCTION uint32_t get_data_length() const
Get the length in bytes of the STRING or OPAQUE value represented by this instance.
Definition: json_binary.h:280
EXPORT_JSON_FUNCTION size_t value_entry_offset(size_t pos) const
Get the offset of the value entry that describes the element at a given position in this array or obj...
Definition: json_binary.cc:1522
bool first_value_offset(size_t *offset) const
Find the lowest possible offset where a value can be located inside this array or object.
Definition: json_binary.cc:1376
EXPORT_JSON_FUNCTION bool is_object() const
Is this value an object?
Definition: json_binary.h:432
EXPORT_JSON_FUNCTION bool to_std_string(std::string *buffer, const JsonErrorHandler &depth_handler) const
Format the JSON value to an external JSON string in buffer in the format of ISO/IEC 10646.
Definition: json_binary.cc:2110
EXPORT_JSON_FUNCTION bool to_pretty_std_string(std::string *buffer, const JsonErrorHandler &depth_handler) const
Format the JSON value to an external JSON string in buffer in the format of ISO/IEC 10646.
Definition: json_binary.cc:2122
EXPORT_JSON_FUNCTION const char * get_container_data() const
Definition: json_binary.h:296
EXPORT_JSON_FUNCTION Value(double val)
Constructor for values that represent doubles.
Definition: json_binary.h:389
EXPORT_JSON_FUNCTION Value lookup(std::string_view key) const
Get the value associated with the specified key in a JSON object.
Definition: json_binary.cc:1168
EXPORT_JSON_FUNCTION bool get_free_space(const JsonSerializationErrorHandler &error_handler, size_t *space) const
Get the amount of unused space in the binary representation of this value.
Definition: json_binary.cc:1970
uint32_t m_length
The full length (in bytes) of the binary representation of an array or object, or the length of a str...
Definition: json_binary.h:516
enum_type
Definition: json_binary.h:236
@ DOUBLE
Definition: json_binary.h:242
@ LITERAL_FALSE
Definition: json_binary.h:245
@ INT
Definition: json_binary.h:240
@ STRING
Definition: json_binary.h:239
@ OBJECT
Definition: json_binary.h:237
@ LITERAL_TRUE
Definition: json_binary.h:244
@ ERROR
Definition: json_binary.h:247
@ LITERAL_NULL
Definition: json_binary.h:243
@ UINT
Definition: json_binary.h:241
@ OPAQUE
Definition: json_binary.h:246
@ ARRAY
Definition: json_binary.h:238
EXPORT_JSON_FUNCTION uint32_t get_container_length() const
Get the length in bytes of the STRING or OPAQUE value represented by this instance.
Definition: json_binary.h:290
EXPORT_JSON_FUNCTION Value()
Empty constructor.
Definition: json_binary.h:424
EXPORT_JSON_FUNCTION enum_type type() const
Definition: json_binary.h:259
EXPORT_JSON_FUNCTION bool has_space(size_t pos, size_t needed, size_t *offset) const
Does this array or object have enough space to replace the value at the given position with another v...
Definition: json_binary.cc:1408
int eq(const Value &val) const
Compare two Values.
Definition: json_binary.cc:2064
EXPORT_JSON_FUNCTION Value(enum_type t)
Constructor for values that represent literals or errors.
Definition: json_binary.h:376
enum_field_types m_field_type
The MySQL field type of the value, in case the type of the value is OPAQUE.
Definition: json_binary.h:522
EXPORT_JSON_FUNCTION bool is_array() const
Is this value an array?
Definition: json_binary.h:428
EXPORT_JSON_FUNCTION Value element(size_t pos) const
Get the element at the specified position of a JSON array or a JSON object.
Definition: json_binary.cc:1092
EXPORT_JSON_FUNCTION bool large_format() const
Does this value use the large storage format?
Definition: json_binary.h:263
EXPORT_JSON_FUNCTION bool is_backed_by(const String *str) const
Is this binary value pointing to data that is contained in the specified string.
Definition: json_binary.cc:1229
enum_type m_type
The JSON type of the value.
Definition: json_binary.h:525
bool update_in_shadow(const Field_json *field, size_t pos, Json_wrapper *new_value, size_t data_offset, size_t data_length, const char *original, char *destination, bool *changed) const
Update a value in an array or object.
Definition: json_binary.cc:1727
bool remove_in_shadow(const Field_json *field, size_t pos, const char *original, char *destination) const
Remove a value from an array or object.
Definition: json_binary.cc:1916
const char * m_data
Pointer to the start of the binary representation of the value.
Definition: json_binary.h:500
EXPORT_JSON_FUNCTION size_t lookup_index(std::string_view key) const
Get the index of the element with the specified key in a JSON object.
Definition: json_binary.cc:1181
EXPORT_JSON_FUNCTION uint64_t get_uint64() const
Get the value of a UINT.
Definition: json_binary.h:310
EXPORT_JSON_FUNCTION size_t key_entry_offset(size_t pos) const
Get the offset of the key entry that describes the key of the member at a given position in this obje...
Definition: json_binary.cc:1509
EXPORT_JSON_FUNCTION bool raw_binary(const JsonSerializationErrorHandler &error_handler, String *buf) const
Copy the binary representation of this value into a buffer, replacing the contents of the receiving b...
Definition: json_binary.cc:1254
EXPORT_JSON_FUNCTION bool is_valid() const
Does this value, and all of its members, represent a valid JSON value?
Definition: json_binary.cc:865
bool element_offsets(size_t pos, size_t *start, size_t *end, bool *inlined) const
Find the start offset and the end offset of the specified element.
Definition: json_binary.cc:1319
EXPORT_JSON_FUNCTION Value(enum_type t, int64_t val)
Constructor for values that represent ints or uints.
Definition: json_binary.h:383
uint32_t m_element_count
Element count for arrays and objects.
Definition: json_binary.h:510
EXPORT_JSON_FUNCTION double get_double() const
Get the value of a DOUBLE.
Definition: json_binary.h:317
This file contains the field type.
enum_field_types
Column types for MySQL Note: Keep include/mysql/components/services/bits/stored_program_bits....
Definition: field_types.h:55
static void start(mysql_harness::PluginFuncEnv *env)
Definition: http_auth_backend_plugin.cc:180
#define EXPORT_JSON_FUNCTION
Definition: json_binary.h:170
std::function< void()> JsonErrorHandler
Definition: json_error_handler.h:36
uint32 element_count
Definition: my_tree.h:52
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1105
Definition: buf0block_hint.cc:30
Definition: json_binary.cc:89
void write_offset_or_size(char *dest, size_t offset_or_size, bool large)
Write an offset or a size to a char array.
Definition: json_binary.cc:222
constexpr char JSONB_TYPE_SMALL_OBJECT
Definition: json_binary.h:175
constexpr char JSONB_TYPE_DOUBLE
Definition: json_binary.h:186
uint8_t offset_size(bool large)
Get the size of an offset value.
Definition: json_binary.cc:416
constexpr char JSONB_TYPE_LITERAL
Definition: json_binary.h:179
bool space_needed(const Json_wrapper *value, bool large, size_t *needed)
How much space is needed for a JSON value when it is stored in the binary format.
Definition: json_binary.cc:1536
constexpr char JSONB_TYPE_LARGE_ARRAY
Definition: json_binary.h:178
bool serialize(const Json_dom *dom, const JsonSerializationErrorHandler &error_handler, String *dest)
Serialize the JSON document represented by dom to binary format in the destination string,...
Definition: json_binary.cc:121
bool append_offset_or_size(String *dest, size_t offset_or_size, bool large)
Append an offset or a size to a String.
Definition: json_binary.cc:190
constexpr char JSONB_TYPE_INT32
Definition: json_binary.h:182
bool append_int16(String *dest, int16_t value)
Encode a 16-bit int at the end of the destination string.
Definition: json_binary.cc:158
constexpr char JSONB_TRUE_LITERAL
Definition: json_binary.h:191
constexpr char JSONB_TYPE_UINT64
Definition: json_binary.h:185
constexpr char JSONB_NULL_LITERAL
Definition: json_binary.h:190
constexpr char JSONB_TYPE_UINT16
Definition: json_binary.h:181
constexpr char JSONB_TYPE_OPAQUE
Definition: json_binary.h:188
constexpr char JSONB_TYPE_INT16
Definition: json_binary.h:180
constexpr char JSONB_TYPE_SMALL_ARRAY
Definition: json_binary.h:177
bool attempt_inline_value(const Json_dom *value, String *dest, size_t pos, bool large)
Attempt to inline a value in its value entry at the beginning of an object or an array.
Definition: json_binary.cc:449
uint32_t read_offset_or_size(const char *data, bool large)
Read an offset or size field from a buffer.
Definition: json_binary.cc:996
constexpr char JSONB_TYPE_UINT32
Definition: json_binary.h:183
constexpr char JSONB_FALSE_LITERAL
Definition: json_binary.h:192
constexpr char JSONB_TYPE_STRING
Definition: json_binary.h:187
bool for_each_node(const Value &value, const Func &func)
Apply a function to every value in a JSON document.
Definition: json_binary.h:579
bool inlined_type(uint8_t type, bool large)
Will a value of the specified type be inlined?
Definition: json_binary.cc:397
Value parse_binary(const char *data, size_t len)
Parse a JSON binary document.
Definition: json_binary.cc:1067
uint8_t value_entry_size(bool large)
Get the size of a value entry.
Definition: json_binary.cc:434
uint8_t key_entry_size(bool large)
Get the size of a key entry.
Definition: json_binary.cc:425
constexpr char JSONB_TYPE_LARGE_OBJECT
Definition: json_binary.h:176
constexpr char JSONB_TYPE_INT64
Definition: json_binary.h:184
size_t size(const char *const c)
Definition: base64.h:46
mutable_buffer buffer(void *p, size_t n) noexcept
Definition: buffer.h:418
required string type
Definition: replication_group_member_actions.proto:34