MySQL 8.3.0
Source Code Documentation
strfunc.h
Go to the documentation of this file.
1/* Copyright (c) 2006, 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 STRFUNC_INCLUDED
24#define STRFUNC_INCLUDED
25
26#include <stddef.h>
27#include <sys/types.h>
28#include <cstring>
29#include <utility>
30
31#include "lex_string.h"
32#include "my_inttypes.h"
33#include "mysql/mysql_lex_string.h" // MYSQL_LEX_CSTRING
35#include "template_utils.h"
36
37class THD;
38struct MEM_ROOT;
39struct TYPELIB;
40
41ulonglong find_set(const TYPELIB *lib, const char *x, size_t length,
42 const CHARSET_INFO *cs, const char **err_pos, uint *err_len,
43 bool *set_warning);
44uint find_type(const TYPELIB *lib, const char *find, size_t length,
45 bool part_match);
46uint find_type2(const TYPELIB *lib, const char *find, size_t length,
47 const CHARSET_INFO *cs);
48uint check_word(TYPELIB *lib, const char *val, const char *end,
49 const char **end_of_word);
51 const char *lib[]);
53 const char *lib[]);
55 const char *lib[], bool quoted);
56
57size_t strconvert(const CHARSET_INFO *from_cs, const char *from,
58 CHARSET_INFO *to_cs, char *to, size_t to_length,
59 uint *errors);
60
61/**
62 Return a LEX_CSTRING handle to a std::string like (meaning something
63 which has the c_str() and length() member functions). Note that the
64 std::string-like object retains ownership of the character array,
65 and consequently the returned LEX_CSTRING is only valid as long as the
66 std::string-like object is valid.
67
68 @param s std::string-like object
69
70 @return LEX_CSTRING handle to string
71*/
72template <class STDSTRINGLIKE_TYPE>
73MYSQL_LEX_CSTRING lex_cstring_handle(const STDSTRINGLIKE_TYPE &s) {
74 return {s.c_str(), s.length()};
75}
76
77/**
78 Lowercase a string according to charset.
79
80 @param ci pointer to charset for conversion
81 @param s string to lower-case
82 @retval modified argument if r-value
83 @retval copy of modified argument if lvalue (meaningless, don't use)
84 */
85template <class STRLIKE_TYPE>
86STRLIKE_TYPE casedn(const CHARSET_INFO *ci, STRLIKE_TYPE &&s) {
87 s.resize(ci->casedn_multiply * s.size());
88 s.resize(my_casedn_str(ci, &s.front()));
89 return std::forward<STRLIKE_TYPE>(s);
90}
91
92/**
93 Lowercase a string according to charset. Overload for const T& which
94 copies argument and forwards to T&& overload.
95
96 @param ci pointer to charset for conversion
97 @param src string to lower-case
98 @retval modified copy of argument
99 */
100
101template <class STRLIKE_TYPE>
102STRLIKE_TYPE casedn(const CHARSET_INFO *ci, const STRLIKE_TYPE &src) {
103 return casedn(ci, STRLIKE_TYPE{src});
104}
105
106/**
107 Create a LEX_STRING in a MEM_ROOT and copy the given string
108 into it.
109
110 @param mem_root MEM_ROOT where to allocate the LEX_STRING.
111 @param str string to be copied into the LEX_STRING.
112 @param length length of str, in bytes
113
114 @return nullptr on failure, or pointer to the LEX_STRING object
115*/
117 size_t length);
118
119/**
120 Copy the given string into a LEX_STRING, allocating it in the
121 given MEM_ROOT.
122
123 @param mem_root MEM_ROOT where to allocate the string.
124 @param lex_str LEX_STRING to fill with the copied string.
125 @param str string to be copied into the LEX_STRING.
126 @param length length of str, in bytes
127
128 @return true on failure (OOM), false otherwise.
129*/
131 const char *str, size_t length);
132
133/**
134 Copy the given string into a LEX_CSTRING, allocating it in the
135 given MEM_ROOT.
136
137 @param mem_root MEM_ROOT where to allocate the string.
138 @param lex_str LEX_CSTRING to fill with the copied string.
139 @param str string to be copied into the LEX_CSTRING.
140 @param length length of str, in bytes
141
142 @return true on failure (OOM), false otherwise.
143*/
145 const char *str, size_t length);
146
147/**
148 Utility function for copying a LEX_STRING_TYPE (either LEX_STRING
149 or LEX_CSTRING) onto a mem_root.
150
151 @param mem_root Where to allocate
152 @param s Source string to copy.
153
154 @return LEX_STRING_TYPE referring to the mem_root allocated string.
155 */
156template <class LEX_STRING_TYPE>
157inline LEX_STRING_TYPE LexStringDupRoot(MEM_ROOT *mem_root, LEX_STRING_TYPE s) {
158 return {strmake_root(mem_root, s.str, s.length), s.length};
159}
160
161/**
162 Utility function for copying a LEX_STRING_TYPE (either LEX_STRING
163 or LEX_CSTRING) onto a mem_root, but which does not allocate space
164 for empty strings. If called on a zero-length string EMPTY_CSTR is
165 returned (where str is "").
166
167 @param mem_root Where to allocate
168 @param s Source string to copy.
169
170 @return LEX_STRING_TYPE referring to the mem_root allocated string,
171 or EMPTY_CSTR.
172 */
173template <class LEX_STRING_TYPE>
175 LEX_STRING_TYPE s) {
176 return s.length == 0 ? LEX_CSTRING{"", 0} : LexStringDupRoot(mem_root, s);
177}
178
179/**
180 Utility function for collating (using strnncoll) two LEX_STRING_TYPEs.
181 Saves the boiler plate and casting needed when calling the function directly.
182*/
183template <class LEX_STRING_TYPE>
184inline int strnncmp_nopads(const CHARSET_INFO &cs, LEX_STRING_TYPE &&a,
185 LEX_STRING_TYPE &&b) {
186 return cs.coll->strnncoll(
187 &cs, pointer_cast<const unsigned char *>(a.str), a.length,
188 pointer_cast<const unsigned char *>(b.str), b.length, false);
189}
190#endif /* STRFUNC_INCLUDED */
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:35
static MEM_ROOT mem_root
Definition: client_plugin.cc:113
char * strmake_root(MEM_ROOT *root, const char *str, size_t len)
Definition: my_alloc.cc:286
#define quoted
Definition: lexyy.cc:960
A better implementation of the UNIX ctype(3) library.
size_t my_casedn_str(const CHARSET_INFO *cs, char *str)
Definition: m_ctype.h:733
Some integer typedefs for easier portability.
unsigned long long int ulonglong
Definition: my_inttypes.h:55
uint end_of_word(const char *pos)
Definition: mysqltest.cc:11243
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1065
Definition: commit_order_queue.h:33
const byte * find(const Pages *pages, const page_id_t &page_id) noexcept
Find a doublewrite copy of a page.
Definition: buf0dblwr.cc:3578
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
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:191
std::set< Key, Compare, ut::allocator< Key > > set
Specialization of set which uses ut_allocator.
Definition: ut0new.h:2881
int strnncmp_nopads(const CHARSET_INFO &cs, LEX_STRING_TYPE &&a, LEX_STRING_TYPE &&b)
Utility function for collating (using strnncoll) two LEX_STRING_TYPEs.
Definition: strfunc.h:184
bool lex_string_strmake(MEM_ROOT *mem_root, LEX_STRING *lex_str, const char *str, size_t length)
Copy the given string into a LEX_STRING, allocating it in the given MEM_ROOT.
Definition: strfunc.cc:333
char * set_to_string(THD *thd, LEX_STRING *result, ulonglong set, const char *lib[])
Definition: strfunc.cc:297
MYSQL_LEX_CSTRING lex_cstring_handle(const STDSTRINGLIKE_TYPE &s)
Return a LEX_CSTRING handle to a std::string like (meaning something which has the c_str() and length...
Definition: strfunc.h:73
LEX_STRING_TYPE LexStringDupRoot(MEM_ROOT *mem_root, LEX_STRING_TYPE s)
Utility function for copying a LEX_STRING_TYPE (either LEX_STRING or LEX_CSTRING) onto a mem_root.
Definition: strfunc.h:157
ulonglong find_set(const TYPELIB *lib, const char *x, size_t length, const CHARSET_INFO *cs, const char **err_pos, uint *err_len, bool *set_warning)
Definition: strfunc.cc:59
STRLIKE_TYPE casedn(const CHARSET_INFO *ci, STRLIKE_TYPE &&s)
Lowercase a string according to charset.
Definition: strfunc.h:86
LEX_STRING * make_lex_string_root(MEM_ROOT *mem_root, const char *str, size_t length)
Create a LEX_STRING in a MEM_ROOT and copy the given string into it.
Definition: strfunc.cc:324
LEX_STRING_TYPE LexStringDupRootUnlessEmpty(MEM_ROOT *mem_root, LEX_STRING_TYPE s)
Utility function for copying a LEX_STRING_TYPE (either LEX_STRING or LEX_CSTRING) onto a mem_root,...
Definition: strfunc.h:174
char * flagset_to_string(THD *thd, LEX_STRING *result, ulonglong set, const char *lib[])
Definition: strfunc.cc:302
uint check_word(TYPELIB *lib, const char *val, const char *end, const char **end_of_word)
Definition: strfunc.cc:194
size_t strconvert(const CHARSET_INFO *from_cs, const char *from, CHARSET_INFO *to_cs, char *to, size_t to_length, uint *errors)
Definition: strfunc.cc:226
uint find_type2(const TYPELIB *lib, const char *find, size_t length, const CHARSET_INFO *cs)
Definition: strfunc.cc:156
uint find_type(const TYPELIB *lib, const char *find, size_t length, bool part_match)
Definition: strfunc.cc:119
Definition: m_ctype.h:422
uint8_t casedn_multiply
Definition: m_ctype.h:444
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:82
Definition: mysql_lex_string.h:39
size_t length
Definition: mysql_lex_string.h:41
Definition: mysql_lex_string.h:34
Definition: typelib.h:34
Definition: result.h:29