File: json_to_any_handler.cc

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (120 lines) | stat: -rw-r--r-- 4,022 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
 * Copyright (c) 2017, 2025, Oracle and/or its affiliates.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License, version 2.0,
 * as published by the Free Software Foundation.
 *
 * This program is designed to work with certain software (including
 * but not limited to OpenSSL) that is licensed under separate terms,
 * as designated in a particular file or component or in included license
 * documentation.  The authors of MySQL hereby grant you an additional
 * permission to link the program and your derivative works with the
 * separately licensed software that they have either included with
 * the program or referenced in the documentation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License, version 2.0, for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
 */

#include "plugin/x/tests/driver/json_to_any_handler.h"

bool Json_to_any_handler::Key(const char *str, rapidjson::SizeType length,
                              bool copy) {
  typedef ::Mysqlx::Datatypes::Object_ObjectField Field;
  Field *f = m_stack.top()->mutable_obj()->add_fld();
  f->set_key(str, length);
  m_stack.push(f->mutable_value());
  return true;
}

bool Json_to_any_handler::Null() {
  get_scalar(::Mysqlx::Datatypes::Scalar_Type_V_NULL);
  return true;
}

bool Json_to_any_handler::Bool(bool b) {
  get_scalar(::Mysqlx::Datatypes::Scalar_Type_V_BOOL)->set_v_bool(b);
  return true;
}

bool Json_to_any_handler::Int(int i) {
  get_scalar(::Mysqlx::Datatypes::Scalar_Type_V_SINT)->set_v_signed_int(i);
  return true;
}

bool Json_to_any_handler::Uint(unsigned u) {
  get_scalar(::Mysqlx::Datatypes::Scalar_Type_V_UINT)->set_v_unsigned_int(u);
  return true;
}

bool Json_to_any_handler::Int64(int64_t i) {
  get_scalar(::Mysqlx::Datatypes::Scalar_Type_V_SINT)->set_v_signed_int(i);
  return true;
}

bool Json_to_any_handler::Uint64(uint64_t u) {
  get_scalar(::Mysqlx::Datatypes::Scalar_Type_V_UINT)->set_v_unsigned_int(u);
  return true;
}

bool Json_to_any_handler::Double(double d, bool) {
  get_scalar(::Mysqlx::Datatypes::Scalar_Type_V_DOUBLE)->set_v_double(d);
  return true;
}

bool Json_to_any_handler::String(const char *str, rapidjson::SizeType length,
                                 bool) {
  get_scalar(::Mysqlx::Datatypes::Scalar_Type_V_STRING)
      ->mutable_v_string()
      ->set_value(str, length);
  return true;
}

bool Json_to_any_handler::StartObject() {
  Any *any = m_stack.top();
  if (any->has_type() && any->type() == ::Mysqlx::Datatypes::Any_Type_ARRAY)
    m_stack.push(any->mutable_array()->add_value());
  m_stack.top()->set_type(::Mysqlx::Datatypes::Any_Type_OBJECT);
  m_stack.top()->mutable_obj();
  return true;
}

bool Json_to_any_handler::EndObject(rapidjson::SizeType /*member_count*/) {
  m_stack.pop();
  return true;
}

bool Json_to_any_handler::StartArray() {
  Any *any = m_stack.top();
  if (any->has_type() && any->type() == ::Mysqlx::Datatypes::Any_Type_ARRAY)
    m_stack.push(any->mutable_array()->add_value());

  m_stack.top()->set_type(::Mysqlx::Datatypes::Any_Type_ARRAY);
  m_stack.top()->mutable_array();
  return true;
}

bool Json_to_any_handler::EndArray(rapidjson::SizeType /*element_count*/) {
  m_stack.pop();
  return true;
}

Json_to_any_handler::Scalar *Json_to_any_handler::get_scalar(
    Scalar::Type scalar_type) {
  Any *any = m_stack.top();
  if (any->has_type() && any->type() == ::Mysqlx::Datatypes::Any_Type_ARRAY)
    any = any->mutable_array()->add_value();
  else
    m_stack.pop();
  any->set_type(::Mysqlx::Datatypes::Any_Type_SCALAR);
  Scalar *s = any->mutable_scalar();
  s->set_type(scalar_type);
  return s;
}