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