mariadb/sql/char_buffer.h
Alexander Barkov b956a6a259 MDEV-31948 Add class DBNameBuffer, split check_db_name() into stages
- Adding a class Lex_ident_fs, to store identifiers for on-disk
  database objects, such as databases, tables, triggers.

- Moving the validation code from check_db_name()
  to non-modifying methods in Lex_ident_fs:

    Lex_ident_fs::check_body()
    Lex_ident_fs::check_db_name()

  Adding a new method Lex_ident_fs::check_db_name_with_error(),
  which performs validation and raises an error on validation failure.

  Unlike the old function check_db_name(), the new class Lex_ident_fs
  does not lower-case the identifier during the validation.
  Lower-casing must be done before calling Lex_ident_fs validation methods.

- Adding a low level helper template class CharBuffer which can:
  * store exact or lower-cased strings with a short fixed maximum length
  * return the value as a LEX_CSTRING efficiently

- Adding a helper template class DBNameBuffer (deriving from CharBuffer), to
  allocate optionally lower-cased database identifiers on stack when relevant.
  Useful for temporary values which don't need to be allocated on MEM_ROOT.

- Using DBNameBuffer in mysql_change_db()

- Using DBNameBuffer in show_create_db()
2023-08-18 16:36:15 +04:00

72 lines
2.1 KiB
C++

#ifndef CHAR_BUFFER_INCLUDED
#define CHAR_BUFFER_INCLUDED
/*
Copyright (c) 2023, MariaDB
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
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 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-1335 USA
*/
/*
A string buffer with length.
This template class is useful to store things like database, table names,
whose maximum length a small fixed known value. Mainly to be used as
stack variables to store temporary values.
Can store exact string copies or casefolded string copies.
The stored value is returned as a LEX_CSTRING.
*/
template<size_t buff_sz>
class CharBuffer
{
char m_buff[buff_sz + 1 /* one extra byte for '\0' */];
size_t m_length;
public:
CharBuffer()
:m_length(0)
{
m_buff[0]= '\0';
}
CharBuffer<buff_sz> & copy_bin(const LEX_CSTRING &str)
{
m_length= MY_MIN(buff_sz, str.length);
memcpy(m_buff, str.str, m_length);
m_buff[m_length]= '\0';
return *this;
}
CharBuffer<buff_sz> & copy_casedn(CHARSET_INFO *cs, const LEX_CSTRING &str)
{
m_length= cs->cset->casedn(cs, str.str, str.length, m_buff, buff_sz);
/*
casedn() never writes outsize of buff_sz (unless a bug in casedn()),
so it's safe to write '\0' at the position m_length:
*/
DBUG_ASSERT(m_length <= buff_sz);
m_buff[m_length]= '\0';
return *this;
}
CharBuffer<buff_sz> & copy_casedn(CHARSET_INFO *cs, const LEX_CSTRING &str,
bool casedn)
{
casedn ? copy_casedn(cs, str) : copy_bin(str);
return *this;
}
LEX_CSTRING to_lex_cstring() const
{
return LEX_CSTRING{m_buff, m_length};
}
};
#endif // CHAR_BUFFER_INCLUDED