MySQL 8.0.33
Source Code Documentation
object_table_definition_impl.h
Go to the documentation of this file.
1/* Copyright (c) 2014, 2023, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is also distributed with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have included with MySQL.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License, version 2.0, for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22
23#ifndef DD__OBJECT_TABLE_DEFINITION_IMPL_INCLUDED
24#define DD__OBJECT_TABLE_DEFINITION_IMPL_INCLUDED
25
26#include <assert.h>
27#include <map>
28#include <memory>
29#include <vector>
30
31#include "sql/dd/string_type.h" // dd::String_type
32#include "sql/dd/types/object_table_definition.h" // dd::Object_table_definition
33#include "sql/mysqld.h" // lower_case_table_names
34
35namespace dd {
36
37class Properties;
38
39///////////////////////////////////////////////////////////////////////////
40
42 public:
43 typedef std::map<String_type, int> Element_numbers;
44 typedef std::map<int, String_type> Element_definitions;
45
46 private:
47 enum class Label {
48 NAME,
49 FIELDS,
50 INDEXES,
52 OPTIONS,
53 LABEL,
57 };
58
59 static const char *key(Label label) {
60 switch (label) {
61 case Label::NAME:
62 return "name";
63 case Label::FIELDS:
64 return "fields";
65 case Label::INDEXES:
66 return "indexes";
68 return "foreign_keys";
69 case Label::OPTIONS:
70 return "options";
71 case Label::LABEL:
72 return "lbl";
73 case Label::POSITION:
74 return "pos";
76 return "def";
77 case Label::ELEMENT:
78 return "elem";
79 default:
80 assert(false);
81 return "";
82 }
83 }
84
86
89
91
94
97
100
103
104 std::vector<String_type> m_dml_statements;
105
106 void add_element(int element_number, const String_type &element_name,
107 const String_type &element_definition,
108 Element_numbers *element_numbers,
109 Element_definitions *element_definitions) {
110 assert(element_numbers != nullptr && element_definitions != nullptr &&
111 element_numbers->find(element_name) == element_numbers->end() &&
112 element_definitions->find(element_number) ==
113 element_definitions->end());
114
115 (*element_numbers)[element_name] = element_number;
116 (*element_definitions)[element_number] = element_definition;
117 }
118
119 int element_number(const String_type &element_name,
120 const Element_numbers &element_numbers) const {
121 assert(element_numbers.find(element_name) != element_numbers.end());
122 return element_numbers.find(element_name)->second;
123 }
124
125 void get_element_properties(dd::Properties *properties,
126 const Element_numbers &element_numbers,
127 const Element_definitions &element_defs) const;
128
129 bool set_element_properties(const String_type &prop_str,
130 Element_numbers *element_numbers,
131 Element_definitions *element_defs);
132
133 public:
135
137 const String_type &table_name,
138 const String_type &ddl_statement)
139 : m_schema_name(schema_name),
141 m_ddl_statement(ddl_statement) {}
142
143 ~Object_table_definition_impl() override = default;
144
147 }
148
150
151 /**
152 Get the collation which is used for names related to the file
153 system (e.g. a schema name or table name). This collation is
154 case sensitive or not, depending on the setting of lower_case-
155 table_names.
156
157 @return Pointer to CHARSET_INFO.
158 */
159
163 }
164
165 /**
166 Get the collation which is used for the name field in the table.
167 Table collation UTF8_BIN is used when collation for the name field
168 is not specified. Tables using different collation must override this
169 method.
170
171 TODO: Changing table collation is not supporting during upgrade as of now.
172 To support this, static definition of this method should be avoided
173 and should provide a possibility to have different collations for
174 actual and target table definition.
175
176 @return Pointer to CHARSET_INFO.
177 */
178 static const CHARSET_INFO *name_collation() {
180 }
181
182 /**
183 Convert to lowercase if lower_case_table_names == 2. This is needed
184 e.g when reconstructing name keys from a dictionary object in order
185 to remove the object.
186
187 @param src String to possibly convert to lowercase.
188 @param [in,out] buf Buffer for storing lowercase'd string. Supplied
189 by the caller.
190
191 @returns A pointer to the src string if l_c_t_n != 2
192 @returns A pointer to the buf supplied by the caller, into which
193 the src string has been copied and lowercase'd, if l_c_t_n == 2
194 */
195
196 static const char *fs_name_case(const String_type &src, char *buf) {
197 const char *tmp_name = src.c_str();
198 if (lower_case_table_names == 2) {
199 // Lower case table names == 2 is tested on OSX.
200 /* purecov: begin tested */
201 my_stpcpy(buf, tmp_name);
203 tmp_name = buf;
204 /* purecov: end */
205 }
206 return tmp_name;
207 }
208
209 const String_type &get_table_name() const { return m_table_name; }
210
211 void set_table_name(const String_type &name) override { m_table_name = name; }
212
214
215 void add_field(int field_number, const String_type &field_name,
216 const String_type field_definition) override {
217 add_element(field_number, field_name, field_definition, &m_field_numbers,
219 }
220
221 void add_sql_mode_field(int field_number, const String_type &field_name);
222
223 void add_index(int index_number, const String_type &index_name,
224 const String_type &index_definition) override {
225 add_element(index_number, index_name, index_definition, &m_index_numbers,
227 }
228
229 virtual void add_foreign_key(int foreign_key_number,
230 const String_type &foreign_key_name,
231 const String_type &foreign_key_definition) {
232 add_element(foreign_key_number, foreign_key_name, foreign_key_definition,
234 }
235
236 virtual void add_option(int option_number, const String_type &option_name,
237 const String_type &option_definition) {
238 add_element(option_number, option_name, option_definition,
240 }
241
243 m_dml_statements.push_back(statement);
244 }
245
246 virtual int field_number(const String_type &field_name) const {
247 return element_number(field_name, m_field_numbers);
248 }
249
250 virtual int index_number(const String_type &index_name) const {
251 return element_number(index_name, m_index_numbers);
252 }
253
254 virtual int option_number(const String_type &option_name) const {
255 return element_number(option_name, m_option_numbers);
256 }
257
258 String_type get_ddl() const override;
259
260 const std::vector<String_type> &get_dml() const override {
261 return m_dml_statements;
262 }
263
264 void store_into_properties(Properties *table_def_properties) const override;
265
266 virtual bool restore_from_string(const String_type &ddl_statement) {
267 m_ddl_statement = ddl_statement;
268 return false;
269 }
270
271 bool restore_from_properties(const Properties &table_def_properties) override;
272};
273
274///////////////////////////////////////////////////////////////////////////
275
276} // namespace dd
277
278#endif // DD__OBJECT_TABLE_DEFINITION_IMPL_INCLUDED
Definition: object_table_definition_impl.h:41
const String_type & get_table_name() const
Definition: object_table_definition_impl.h:209
std::map< String_type, int > Element_numbers
Definition: object_table_definition_impl.h:43
static bool is_dd_tablespace_encrypted()
Definition: object_table_definition_impl.h:149
void store_into_properties(Properties *table_def_properties) const override
Store the elements of the object table definition into a property object.
Definition: object_table_definition_impl.cc:140
virtual int index_number(const String_type &index_name) const
Definition: object_table_definition_impl.h:250
Element_definitions m_field_definitions
Definition: object_table_definition_impl.h:93
virtual bool restore_from_string(const String_type &ddl_statement)
Definition: object_table_definition_impl.h:266
Label
Definition: object_table_definition_impl.h:47
String_type get_ddl() const override
Get the SQL DDL statement for creating the dictionary table.
Definition: object_table_definition_impl.cc:99
void add_field(int field_number, const String_type &field_name, const String_type field_definition) override
Add a field to the object table definition.
Definition: object_table_definition_impl.h:215
static const char * key(Label label)
Definition: object_table_definition_impl.h:59
std::map< int, String_type > Element_definitions
Definition: object_table_definition_impl.h:44
Element_definitions m_foreign_key_definitions
Definition: object_table_definition_impl.h:99
int element_number(const String_type &element_name, const Element_numbers &element_numbers) const
Definition: object_table_definition_impl.h:119
Element_numbers m_option_numbers
Definition: object_table_definition_impl.h:101
bool set_element_properties(const String_type &prop_str, Element_numbers *element_numbers, Element_definitions *element_defs)
Definition: object_table_definition_impl.cc:58
Element_definitions m_option_definitions
Definition: object_table_definition_impl.h:102
virtual void add_option(int option_number, const String_type &option_name, const String_type &option_definition)
Definition: object_table_definition_impl.h:236
void set_table_name(const String_type &name) override
Set the name of the table.
Definition: object_table_definition_impl.h:211
virtual void add_populate_statement(const String_type &statement)
Definition: object_table_definition_impl.h:242
void set_schema_name(const String_type &name)
Definition: object_table_definition_impl.h:213
static const CHARSET_INFO * fs_name_collation()
Get the collation which is used for names related to the file system (e.g.
Definition: object_table_definition_impl.h:160
virtual int option_number(const String_type &option_name) const
Definition: object_table_definition_impl.h:254
void get_element_properties(dd::Properties *properties, const Element_numbers &element_numbers, const Element_definitions &element_defs) const
Definition: object_table_definition_impl.cc:37
void add_index(int index_number, const String_type &index_name, const String_type &index_definition) override
Add an index to the object table definition.
Definition: object_table_definition_impl.h:223
void add_sql_mode_field(int field_number, const String_type &field_name)
Definition: object_table_definition_impl.cc:87
String_type m_table_name
Definition: object_table_definition_impl.h:88
virtual void add_foreign_key(int foreign_key_number, const String_type &foreign_key_name, const String_type &foreign_key_definition)
Definition: object_table_definition_impl.h:229
static const char * fs_name_case(const String_type &src, char *buf)
Convert to lowercase if lower_case_table_names == 2.
Definition: object_table_definition_impl.h:196
Object_table_definition_impl(const String_type &schema_name, const String_type &table_name, const String_type &ddl_statement)
Definition: object_table_definition_impl.h:136
const std::vector< String_type > & get_dml() const override
Get the SQL DML statements for populating the table.
Definition: object_table_definition_impl.h:260
void add_element(int element_number, const String_type &element_name, const String_type &element_definition, Element_numbers *element_numbers, Element_definitions *element_definitions)
Definition: object_table_definition_impl.h:106
Element_numbers m_index_numbers
Definition: object_table_definition_impl.h:95
std::vector< String_type > m_dml_statements
Definition: object_table_definition_impl.h:104
~Object_table_definition_impl() override=default
static bool s_dd_tablespace_encrypted
Definition: object_table_definition_impl.h:85
bool restore_from_properties(const Properties &table_def_properties) override
Restore the elements of the object table definition from a property object.
Definition: object_table_definition_impl.cc:167
String_type m_ddl_statement
Definition: object_table_definition_impl.h:90
Element_definitions m_index_definitions
Definition: object_table_definition_impl.h:96
Element_numbers m_field_numbers
Definition: object_table_definition_impl.h:92
Element_numbers m_foreign_key_numbers
Definition: object_table_definition_impl.h:98
static const CHARSET_INFO * name_collation()
Get the collation which is used for the name field in the table.
Definition: object_table_definition_impl.h:178
virtual int field_number(const String_type &field_name) const
Definition: object_table_definition_impl.h:246
static void set_dd_tablespace_encrypted(bool is_encrypted)
Definition: object_table_definition_impl.h:145
String_type m_schema_name
Definition: object_table_definition_impl.h:87
The purpose of this interface is to enable retrieving the SQL statements necessary to create and popu...
Definition: object_table_definition.h:47
The Properties class defines an interface for storing key=value pairs, where both key and value may b...
Definition: properties.h:73
CHARSET_INFO my_charset_utf8mb3_bin
Definition: ctype-utf8.cc:5883
CHARSET_INFO my_charset_utf8mb3_tolower_ci
Definition: ctype-utf8.cc:5813
#define my_casedn_str(s, a)
Definition: m_ctype.h:761
static char * my_stpcpy(char *dst, const char *src)
Copy a string from src to dst until (and including) terminating null byte.
Definition: m_string.h:164
uint lower_case_table_names
Definition: mysqld.cc:1323
Definition: buf0block_hint.cc:29
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:42
bool is_encrypted(const String_type &type)
Definition: dd_table.h:420
Char_string_template< String_type_allocator > String_type
Definition: string_type.h:50
const char * table_name
Definition: rules_table_service.cc:55
case opt name
Definition: sslopt-case.h:32
Definition: m_ctype.h:382
Definition: mysqlslap.cc:216