summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.org>2015-03-16 12:14:31 +0400
committerAlexander Barkov <bar@mariadb.org>2015-03-16 12:14:31 +0400
commitf48dc5ccc7246c5ca9ebad2acc2d1d56a3470f9d (patch)
treedad0c76c6303556b7a92431957b08dec4ff8c559 /sql
parentc4b268add0475c6633f35eaf8cf4c7fbcad298f6 (diff)
downloadmariadb-git-f48dc5ccc7246c5ca9ebad2acc2d1d56a3470f9d.tar.gz
Moving the conversion code from String::well_formed_copy()
to my_convert_fix() - a new function in /strings.
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_string.cc71
-rw-r--r--sql/sql_string.h7
2 files changed, 6 insertions, 72 deletions
diff --git a/sql/sql_string.cc b/sql/sql_string.cc
index a0b63956ed0..1b8ea936c0d 100644
--- a/sql/sql_string.cc
+++ b/sql/sql_string.cc
@@ -914,8 +914,6 @@ String_copier::well_formed_copy(CHARSET_INFO *to_cs,
const char *from, uint from_length,
uint nchars)
{
- uint res;
-
if ((to_cs == &my_charset_bin) ||
(from_cs == &my_charset_bin) ||
(to_cs == from_cs) ||
@@ -923,73 +921,10 @@ String_copier::well_formed_copy(CHARSET_INFO *to_cs,
{
m_cannot_convert_error_pos= NULL;
return to_cs->cset->copy_fix(to_cs, to, to_length, from, from_length,
- nchars, this);
- }
- else
- {
- int cnvres;
- my_wc_t wc;
- my_charset_conv_mb_wc mb_wc= from_cs->cset->mb_wc;
- my_charset_conv_wc_mb wc_mb= to_cs->cset->wc_mb;
- const uchar *from_end= (const uchar*) from + from_length;
- uchar *to_end= (uchar*) to + to_length;
- char *to_start= to;
- m_well_formed_error_pos= NULL;
- m_cannot_convert_error_pos= NULL;
-
- for ( ; nchars; nchars--)
- {
- const char *from_prev= from;
- if ((cnvres= (*mb_wc)(from_cs, &wc, (uchar*) from, from_end)) > 0)
- from+= cnvres;
- else if (cnvres == MY_CS_ILSEQ)
- {
- if (!m_well_formed_error_pos)
- m_well_formed_error_pos= from;
- from++;
- wc= '?';
- }
- else if (cnvres > MY_CS_TOOSMALL)
- {
- /*
- A correct multibyte sequence detected
- But it doesn't have Unicode mapping.
- */
- if (!m_cannot_convert_error_pos)
- m_cannot_convert_error_pos= from;
- from+= (-cnvres);
- wc= '?';
- }
- else
- {
- if ((uchar *) from >= from_end)
- break; // End of line
- // Incomplete byte sequence
- if (!m_well_formed_error_pos)
- m_well_formed_error_pos= from;
- from++;
- wc= '?';
- }
-outp:
- if ((cnvres= (*wc_mb)(to_cs, wc, (uchar*) to, to_end)) > 0)
- to+= cnvres;
- else if (cnvres == MY_CS_ILUNI && wc != '?')
- {
- if (!m_cannot_convert_error_pos)
- m_cannot_convert_error_pos= from_prev;
- wc= '?';
- goto outp;
- }
- else
- {
- from= from_prev;
- break;
- }
- }
- m_source_end_pos= from;
- res= (uint) (to - to_start);
+ nchars, &m_native_copy_status);
}
- return res;
+ return my_convert_fix(to_cs, to, to_length, from_cs, from, from_length,
+ nchars, this);
}
diff --git a/sql/sql_string.h b/sql/sql_string.h
index d89adb6bf51..4c02a46cf67 100644
--- a/sql/sql_string.h
+++ b/sql/sql_string.h
@@ -43,14 +43,13 @@ inline uint32 copy_and_convert(char *to, uint32 to_length,
}
-class String_copier: private MY_STRCOPY_STATUS
+class String_copier: private MY_STRCONV_STATUS
{
- const char *m_cannot_convert_error_pos;
public:
const char *source_end_pos() const
- { return m_source_end_pos; }
+ { return m_native_copy_status.m_source_end_pos; }
const char *well_formed_error_pos() const
- { return m_well_formed_error_pos; }
+ { return m_native_copy_status.m_well_formed_error_pos; }
const char *cannot_convert_error_pos() const
{ return m_cannot_convert_error_pos; }
const char *most_important_error_pos() const