diff options
author | unknown <bar@bar.mysql.r18.ru> | 2003-04-07 13:52:48 +0500 |
---|---|---|
committer | unknown <bar@bar.mysql.r18.ru> | 2003-04-07 13:52:48 +0500 |
commit | 4b721f06f833e85b64c7baa54fea3446b8fd8b2c (patch) | |
tree | 6a4024432837d56c5c8268c3ef1db0be099b0a15 /sql/protocol.cc | |
parent | 77370ca4b885a289532b1bf96685e88b0a298e37 (diff) | |
download | mariadb-git-4b721f06f833e85b64c7baa54fea3446b8fd8b2c.tar.gz |
New methods to store strings with "convert to" argimument
Diffstat (limited to 'sql/protocol.cc')
-rw-r--r-- | sql/protocol.cc | 71 |
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)); |