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