diff options
author | konstantin@mysql.com <> | 2004-05-25 02:03:49 +0400 |
---|---|---|
committer | konstantin@mysql.com <> | 2004-05-25 02:03:49 +0400 |
commit | f207b33a7b85f03221fcec1afb662ede70b5e438 (patch) | |
tree | 39de3845fc8340f9a27f30803b9104e416c7ab62 /sql/sql_string.cc | |
parent | 1b61cb6d0f5dbea8c3901f509b2f99b4d8c618f4 (diff) | |
download | mariadb-git-f207b33a7b85f03221fcec1afb662ede70b5e438.tar.gz |
Support for character set conversion in binary protocol: another go
after Monty's review.
- Item_param was rewritten.
- it turns out that we can't convert string data to character set of
connection on the fly, because they first should be written to the binary
log.
To support efficient conversion we need to rewrite prepared statements
binlogging code first.
Diffstat (limited to 'sql/sql_string.cc')
-rw-r--r-- | sql/sql_string.cc | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/sql/sql_string.cc b/sql/sql_string.cc index 8a093738e2b..fb2d1661357 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -450,22 +450,25 @@ bool String::append(const char *s,uint32 arg_length) bool String::append(const char *s,uint32 arg_length, CHARSET_INFO *cs) { - if (!arg_length) // Default argument - if (!(arg_length= (uint32) strlen(s))) + uint32 dummy_offset; + uint32 add_length; + + if (!arg_length && !(arg_length= (uint32)strlen(s))) return FALSE; - if (cs != str_charset && str_charset->mbmaxlen > 1) + + add_length= arg_length * str_charset->mbmaxlen; + if (realloc(str_length + add_length)) + return TRUE; + if (needs_conversion(arg_length, cs, str_charset, &dummy_offset)) { - uint32 add_length=arg_length * str_charset->mbmaxlen; - if (realloc(str_length+ add_length)) - return TRUE; str_length+= copy_and_convert(Ptr+str_length, add_length, str_charset, s, arg_length, cs); - return FALSE; } - if (realloc(str_length+arg_length)) - return TRUE; - memcpy(Ptr+str_length,s,arg_length); - str_length+=arg_length; + else + { + memcpy(Ptr + str_length, s, arg_length); + str_length+= arg_length; + } return FALSE; } @@ -858,3 +861,23 @@ void String::print(String *str) } } } + + +/* + Exchange state of this object and argument. + + SYNOPSIS + String::swap() + + RETURN + Target string will contain state of this object and vice versa. +*/ + +void String::swap(String &s) +{ + swap_variables(char *, Ptr, s.Ptr); + swap_variables(uint32, str_length, s.str_length); + swap_variables(uint32, Alloced_length, s.Alloced_length); + swap_variables(bool, alloced, s.alloced); + swap_variables(CHARSET_INFO*, str_charset, s.str_charset); +} |