summaryrefslogtreecommitdiff
path: root/sql/protocol.cc
diff options
context:
space:
mode:
authorunknown <bar@bar.mysql.r18.ru>2003-04-07 13:52:48 +0500
committerunknown <bar@bar.mysql.r18.ru>2003-04-07 13:52:48 +0500
commit4b721f06f833e85b64c7baa54fea3446b8fd8b2c (patch)
tree6a4024432837d56c5c8268c3ef1db0be099b0a15 /sql/protocol.cc
parent77370ca4b885a289532b1bf96685e88b0a298e37 (diff)
downloadmariadb-git-4b721f06f833e85b64c7baa54fea3446b8fd8b2c.tar.gz
New methods to store strings with "convert to" argimument
Diffstat (limited to 'sql/protocol.cc')
-rw-r--r--sql/protocol.cc71
1 files changed, 56 insertions, 15 deletions
diff --git a/sql/protocol.cc b/sql/protocol.cc
index 2d53d545066..f82981bd309 100644
--- a/sql/protocol.cc
+++ b/sql/protocol.cc
@@ -526,13 +526,16 @@ bool Protocol::send_fields(List<Item> *list, uint flag)
if (thd->client_capabilities & CLIENT_PROTOCOL_41)
{
- if (prot.store(field.db_name, (uint) strlen(field.db_name), cs) ||
- prot.store(field.table_name, (uint) strlen(field.table_name), cs) ||
- prot.store(field.org_table_name,
- (uint) strlen(field.org_table_name), cs) ||
- prot.store(field.col_name, (uint) strlen(field.col_name), cs) ||
- prot.store(field.org_col_name,
- (uint) strlen(field.org_col_name), cs) ||
+ if (prot.store(field.db_name, (uint) strlen(field.db_name),
+ cs, thd->charset()) ||
+ prot.store(field.table_name, (uint) strlen(field.table_name),
+ cs, thd->charset()) ||
+ prot.store(field.org_table_name, (uint) strlen(field.org_table_name),
+ cs, thd->charset()) ||
+ prot.store(field.col_name, (uint) strlen(field.col_name),
+ cs, thd->charset()) ||
+ prot.store(field.org_col_name, (uint) strlen(field.org_col_name),
+ cs, thd->charset()) ||
packet->realloc(packet->length()+12))
goto err;
/* Store fixed length fields */
@@ -549,8 +552,10 @@ bool Protocol::send_fields(List<Item> *list, uint flag)
}
else
{
- if (prot.store(field.table_name, (uint) strlen(field.table_name), cs) ||
- prot.store(field.col_name, (uint) strlen(field.col_name), cs) ||
+ if (prot.store(field.table_name, (uint) strlen(field.table_name),
+ cs, thd->charset()) ||
+ prot.store(field.col_name, (uint) strlen(field.col_name),
+ cs, thd->charset()) ||
packet->realloc(packet->length()+10))
goto err;
pos= (char*) packet->ptr()+packet->length();
@@ -694,7 +699,8 @@ bool Protocol_simple::store_null()
#endif
-bool Protocol_simple::store(const char *from, uint length, CHARSET_INFO *cs)
+bool Protocol_simple::store(const char *from, uint length,
+ CHARSET_INFO *fromcs, CHARSET_INFO *tocs)
{
#ifndef DEBUG_OFF
DBUG_ASSERT(field_types == 0 ||
@@ -703,12 +709,34 @@ bool Protocol_simple::store(const char *from, uint length, CHARSET_INFO *cs)
field_types[field_pos] <= MYSQL_TYPE_GEOMETRY));
field_pos++;
#endif
- if (!my_charset_same(cs, this->thd->charset()) &&
- (cs != &my_charset_bin) &&
- (this->thd->charset() != &my_charset_bin) &&
- (this->thd->variables.convert_result_charset))
+ if (!my_charset_same(fromcs, tocs) &&
+ (fromcs != &my_charset_bin) &&
+ (tocs != &my_charset_bin))
{
- convert.copy(from, length, cs, this->thd->charset());
+ convert.copy(from, length, fromcs, tocs);
+ return net_store_data(convert.ptr(), convert.length());
+ }
+ else
+ return net_store_data(from, length);
+}
+
+
+bool Protocol_simple::store(const char *from, uint length,
+ CHARSET_INFO *fromcs)
+{
+ CHARSET_INFO *tocs= this->thd->result_charset(fromcs);
+#ifndef DEBUG_OFF
+ DBUG_ASSERT(field_types == 0 ||
+ field_types[field_pos] == MYSQL_TYPE_DECIMAL ||
+ (field_types[field_pos] >= MYSQL_TYPE_ENUM &&
+ field_types[field_pos] <= MYSQL_TYPE_GEOMETRY));
+ field_pos++;
+#endif
+ if (!my_charset_same(fromcs, tocs) &&
+ (fromcs != &my_charset_bin) &&
+ (tocs != &my_charset_bin))
+ {
+ convert.copy(from, length, fromcs, tocs);
return net_store_data(convert.ptr(), convert.length());
}
else
@@ -923,6 +951,19 @@ bool Protocol_prep::store(const char *from,uint length, CHARSET_INFO *cs)
return net_store_data(from, length);
}
+bool Protocol_prep::store(const char *from,uint length,
+ CHARSET_INFO *fromcs, CHARSET_INFO *tocs)
+{
+#ifndef DEBUG_OFF
+ DBUG_ASSERT(field_types == 0 ||
+ field_types[field_pos] == MYSQL_TYPE_DECIMAL ||
+ (field_types[field_pos] >= MYSQL_TYPE_ENUM &&
+ field_types[field_pos] <= MYSQL_TYPE_GEOMETRY));
+#endif
+ field_pos++;
+ return net_store_data(from, length);
+}
+
bool Protocol_prep::store_null()
{
uint offset= (field_pos+2)/8+1, bit= (1 << ((field_pos+2) & 7));