diff options
author | Monty <monty@mariadb.org> | 2020-08-14 20:22:43 +0300 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2021-05-19 22:27:29 +0200 |
commit | b3bc02f923f6002e6a5bd6446b80575292e1b0c7 (patch) | |
tree | 3d5032511ca892a1ce4c0649b3a046cb83c92c7f | |
parent | 5c7d243b29257fe02edaea42730893d4d185ced5 (diff) | |
download | mariadb-git-b3bc02f923f6002e6a5bd6446b80575292e1b0c7.tar.gz |
Added ErrConvString.lex_cstring() to simplify code
This allows us to use String::append() without using strlen().
The changes to the ErrConvString class where done by Alexander Barkov
-rw-r--r-- | sql/item.cc | 2 | ||||
-rw-r--r-- | sql/key.cc | 2 | ||||
-rw-r--r-- | sql/sql_class.h | 6 | ||||
-rw-r--r-- | sql/sql_error.cc | 8 | ||||
-rw-r--r-- | sql/sql_error.h | 56 | ||||
-rw-r--r-- | storage/connect/ha_connect.cc | 8 |
6 files changed, 46 insertions, 36 deletions
diff --git a/sql/item.cc b/sql/item.cc index 84fb509f024..fe5b45f31a9 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -3816,7 +3816,7 @@ void Item_string::print(String *str, enum_query_type query_type) changed. */ ErrConvString tmp(str_value.ptr(), str_value.length(), &my_charset_bin); - str->append(tmp.ptr()); + str->append(tmp.lex_cstring()); } else { diff --git a/sql/key.cc b/sql/key.cc index 53f897de15f..32b4bd9c167 100644 --- a/sql/key.cc +++ b/sql/key.cc @@ -393,7 +393,7 @@ void field_unpack(String *to, Field *field, const uchar *rec, uint max_length, if (max_length < field->pack_length()) tmp.length(MY_MIN(tmp.length(),max_length)); ErrConvString err(&tmp); - to->append(err.ptr()); + to->append(err.lex_cstring()); } else to->append(STRING_WITH_LEN("???")); diff --git a/sql/sql_class.h b/sql/sql_class.h index 8a0463f9f8e..1546e5e65b1 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -7558,10 +7558,10 @@ public: ErrConvDQName(const Database_qualified_name *name) :m_name(name) { } - const char *ptr() const + LEX_CSTRING lex_cstring() const override { - m_name->make_qname(err_buffer, sizeof(err_buffer)); - return err_buffer; + size_t length= m_name->make_qname(err_buffer, sizeof(err_buffer)); + return {err_buffer, length}; } }; diff --git a/sql/sql_error.cc b/sql/sql_error.cc index 9af57ea6c01..bb47502b3ce 100644 --- a/sql/sql_error.cc +++ b/sql/sql_error.cc @@ -864,11 +864,11 @@ extern "C" int my_wc_mb_utf8_null_terminated(CHARSET_INFO *cs, @param from_cs charset from convert @retval - result string + result string length */ -char *err_conv(char *buff, uint to_length, const char *from, - uint from_length, CHARSET_INFO *from_cs) +size_t err_conv(char *buff, uint to_length, const char *from, + uint from_length, CHARSET_INFO *from_cs) { char *to= buff; const char *from_start= from; @@ -919,7 +919,7 @@ char *err_conv(char *buff, uint to_length, const char *from, &errors); to[res]= 0; } - return buff; + return res; } diff --git a/sql/sql_error.h b/sql/sql_error.h index 318d5076534..a3782048c79 100644 --- a/sql/sql_error.h +++ b/sql/sql_error.h @@ -811,8 +811,8 @@ private: }; -extern char *err_conv(char *buff, uint to_length, const char *from, - uint from_length, CHARSET_INFO *from_cs); +extern size_t err_conv(char *buff, uint to_length, const char *from, + uint from_length, CHARSET_INFO *from_cs); class ErrBuff { @@ -824,31 +824,37 @@ public: err_buffer[0]= '\0'; } const char *ptr() const { return err_buffer; } - const char *set_longlong(const Longlong_hybrid &nr) const + LEX_CSTRING set_longlong(const Longlong_hybrid &nr) const { - return nr.is_unsigned() ? ullstr(nr.value(), err_buffer) : - llstr(nr.value(), err_buffer); + int radix= nr.is_unsigned() ? 10 : -10; + const char *end= longlong10_to_str(nr.value(), err_buffer, radix); + DBUG_ASSERT(end >= err_buffer); + return {err_buffer, (size_t) (end - err_buffer)}; } - const char *set_double(double nr) const + LEX_CSTRING set_double(double nr) const { - my_gcvt(nr, MY_GCVT_ARG_DOUBLE, sizeof(err_buffer), err_buffer, 0); - return err_buffer; + size_t length= my_gcvt(nr, MY_GCVT_ARG_DOUBLE, + sizeof(err_buffer), err_buffer, 0); + return {err_buffer, length}; } - const char *set_decimal(const decimal_t *d) const + LEX_CSTRING set_decimal(const decimal_t *d) const { - int len= sizeof(err_buffer); - decimal2string(d, err_buffer, &len, 0, 0, ' '); - return err_buffer; + int length= sizeof(err_buffer); + decimal2string(d, err_buffer, &length, 0, 0, ' '); + DBUG_ASSERT(length >= 0); + return {err_buffer, (size_t) length}; } - const char *set_str(const char *str, size_t len, CHARSET_INFO *cs) const + LEX_CSTRING set_str(const char *str, size_t len, CHARSET_INFO *cs) const { DBUG_ASSERT(len < UINT_MAX32); - return err_conv(err_buffer, (uint) sizeof(err_buffer), str, (uint) len, cs); + len= err_conv(err_buffer, (uint) sizeof(err_buffer), str, (uint) len, cs); + return {err_buffer, len}; } - const char *set_mysql_time(const MYSQL_TIME *ltime) const + LEX_CSTRING set_mysql_time(const MYSQL_TIME *ltime) const { - my_TIME_to_str(ltime, err_buffer, AUTO_SEC_PART_DIGITS); - return err_buffer; + int length= my_TIME_to_str(ltime, err_buffer, AUTO_SEC_PART_DIGITS); + DBUG_ASSERT(length >= 0); + return {err_buffer, (size_t) length}; } }; @@ -858,7 +864,11 @@ class ErrConv: public ErrBuff public: ErrConv() {} virtual ~ErrConv() {} - virtual const char *ptr() const = 0; + virtual LEX_CSTRING lex_cstring() const= 0; + inline const char *ptr() const + { + return lex_cstring().str; + } }; class ErrConvString : public ErrConv @@ -873,7 +883,7 @@ public: : ErrConv(), str(str_arg), len(strlen(str_arg)), cs(cs_arg) {} ErrConvString(const String *s) : ErrConv(), str(s->ptr()), len(s->length()), cs(s->charset()) {} - const char *ptr() const + LEX_CSTRING lex_cstring() const override { return set_str(str, len, cs); } @@ -884,7 +894,7 @@ class ErrConvInteger : public ErrConv, public Longlong_hybrid public: ErrConvInteger(const Longlong_hybrid &nr) : ErrConv(), Longlong_hybrid(nr) { } - const char *ptr() const + LEX_CSTRING lex_cstring() const override { return set_longlong(static_cast<Longlong_hybrid>(*this)); } @@ -895,7 +905,7 @@ class ErrConvDouble: public ErrConv double num; public: ErrConvDouble(double num_arg) : ErrConv(), num(num_arg) {} - const char *ptr() const + LEX_CSTRING lex_cstring() const override { return set_double(num); } @@ -906,7 +916,7 @@ class ErrConvTime : public ErrConv const MYSQL_TIME *ltime; public: ErrConvTime(const MYSQL_TIME *ltime_arg) : ErrConv(), ltime(ltime_arg) {} - const char *ptr() const + LEX_CSTRING lex_cstring() const override { return set_mysql_time(ltime); } @@ -917,7 +927,7 @@ class ErrConvDecimal : public ErrConv const decimal_t *d; public: ErrConvDecimal(const decimal_t *d_arg) : ErrConv(), d(d_arg) {} - const char *ptr() const + LEX_CSTRING lex_cstring() const override { return set_decimal(d); } diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 9e1d7502dcf..1474af92933 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -3480,11 +3480,11 @@ bool ha_connect::get_error_message(int error, String* buf) if (trace(1)) htrc("GEM(%d): %s\n", error, g->Message); - - buf->append(ErrConvString(g->Message, strlen(g->Message), - &my_charset_latin1).ptr()); + buf->append(ErrConvString(g->Message, + strlen(g->Message), + &my_charset_latin1).lex_cstring()); } else - buf->append("Cannot retrieve error message"); + buf->append(STRING_WITH_LEN("Cannot retrieve error message")); DBUG_RETURN(false); } // end of get_error_message |