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 /mysys | |
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 'mysys')
-rw-r--r-- | mysys/charset.c | 58 | ||||
-rw-r--r-- | mysys/my_chsize.c | 2 | ||||
-rw-r--r-- | mysys/my_compress.c | 2 | ||||
-rw-r--r-- | mysys/my_handler.c | 8 |
4 files changed, 64 insertions, 6 deletions
diff --git a/mysys/charset.c b/mysys/charset.c index e58c851cf7c..c80b00db397 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -622,3 +622,61 @@ CHARSET_INFO *get_charset_by_csname(const char *cs_name, DBUG_RETURN(cs); } + + +ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, + const char *from, ulong length) +{ + const char *to_start= to; + const char *end; +#ifdef USE_MB + my_bool use_mb_flag= use_mb(charset_info); +#endif + for (end= from + length; from != end; from++) + { +#ifdef USE_MB + int l; + if (use_mb_flag && (l= my_ismbchar(charset_info, from, end))) + { + while (l--) + *to++= *from++; + from--; + continue; + } +#endif + switch (*from) { + case 0: /* Must be escaped for 'mysql' */ + *to++= '\\'; + *to++= '0'; + break; + case '\n': /* Must be escaped for logs */ + *to++= '\\'; + *to++= 'n'; + break; + case '\r': + *to++= '\\'; + *to++= 'r'; + break; + case '\\': + *to++= '\\'; + *to++= '\\'; + break; + case '\'': + *to++= '\\'; + *to++= '\''; + break; + case '"': /* Better safe than sorry */ + *to++= '\\'; + *to++= '"'; + break; + case '\032': /* This gives problems on Win32 */ + *to++= '\\'; + *to++= 'Z'; + break; + default: + *to++= *from; + } + } + *to= 0; + return (ulong) (to - to_start); +} diff --git a/mysys/my_chsize.c b/mysys/my_chsize.c index 653ea569172..cf26428d65f 100644 --- a/mysys/my_chsize.c +++ b/mysys/my_chsize.c @@ -89,7 +89,7 @@ int my_chsize(File fd, my_off_t newlength, int filler, myf MyFlags) We should never come here on any modern machine */ VOID(my_seek(fd, newlength, MY_SEEK_SET, MYF(MY_WME+MY_FAE))); - swap(my_off_t, newlength, oldsize); + swap_variables(my_off_t, newlength, oldsize); } #endif diff --git a/mysys/my_compress.c b/mysys/my_compress.c index dd076311188..0e37d2fef9b 100644 --- a/mysys/my_compress.c +++ b/mysys/my_compress.c @@ -68,7 +68,7 @@ byte *my_compress_alloc(const byte *packet, ulong *len, ulong *complen) DBUG_PRINT("note",("Packet got longer on compression; Not compressed")); return 0; } - swap(ulong, *len, *complen); /* *len is now packet length */ + swap_variables(ulong, *len, *complen); /* *len is now packet length */ return compbuf; } diff --git a/mysys/my_handler.c b/mysys/my_handler.c index 35f620ccbcb..de0fba56d21 100644 --- a/mysys/my_handler.c +++ b/mysys/my_handler.c @@ -331,7 +331,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, if (keyseg->flag & HA_REVERSE_SORT) { - swap(uchar*,a,b); + swap_variables(uchar*, a, b); swap_flag=1; /* Remember swap of a & b */ end= a+ (int) (end-b); } @@ -356,8 +356,8 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, if (*b != '-') return -1; a++; b++; - swap(uchar*,a,b); - swap(int,alength,blength); + swap_variables(uchar*, a, b); + swap_variables(int, alength, blength); swap_flag=1-swap_flag; alength--; blength--; end=a+alength; @@ -385,7 +385,7 @@ int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a, } if (swap_flag) /* Restore pointers */ - swap(uchar*,a,b); + swap_variables(uchar*, a, b); break; } #ifdef HAVE_LONG_LONG |