summaryrefslogtreecommitdiff
path: root/sql/sql_string.cc
diff options
context:
space:
mode:
authorkonstantin@mysql.com <>2004-05-25 02:03:49 +0400
committerkonstantin@mysql.com <>2004-05-25 02:03:49 +0400
commitf207b33a7b85f03221fcec1afb662ede70b5e438 (patch)
tree39de3845fc8340f9a27f30803b9104e416c7ab62 /sql/sql_string.cc
parent1b61cb6d0f5dbea8c3901f509b2f99b4d8c618f4 (diff)
downloadmariadb-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.cc45
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);
+}