mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
Merge abarkov@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/usr/home/bar/mysql-4.1.b5439
This commit is contained in:
commit
dbfc9b741d
4 changed files with 75 additions and 1 deletions
|
@ -788,6 +788,11 @@ extern my_bool init_compiled_charsets(myf flags);
|
|||
extern void add_compiled_collation(CHARSET_INFO *cs);
|
||||
extern ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to,
|
||||
const char *from, ulong length);
|
||||
#ifdef __WIN__
|
||||
#define BACKSLASH_MBTAIL
|
||||
/* File system character set */
|
||||
extern CHARSET_INFO *fs_character_set(void);
|
||||
#endif
|
||||
|
||||
#ifdef __WIN__
|
||||
extern my_bool have_tcpip; /* Is set if tcpip is used */
|
||||
|
|
|
@ -637,3 +637,29 @@ ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to,
|
|||
*to= 0;
|
||||
return (ulong) (to - to_start);
|
||||
}
|
||||
|
||||
|
||||
#ifdef BACKSLASH_MBTAIL
|
||||
static CHARSET_INFO *fs_cset_cache= NULL;
|
||||
|
||||
CHARSET_INFO *fs_character_set()
|
||||
{
|
||||
if (!fs_cset_cache)
|
||||
{
|
||||
char buf[10]= "cp";
|
||||
GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_IDEFAULTANSICODEPAGE,
|
||||
buf+2, sizeof(buf)-3);
|
||||
/*
|
||||
We cannot call get_charset_by_name here
|
||||
because fs_character_set() is executed before
|
||||
LOCK_THD_charset mutex initialization, which
|
||||
is used inside get_charset_by_name.
|
||||
As we're now interested in cp932 only,
|
||||
let's just detect it using strcmp().
|
||||
*/
|
||||
fs_cset_cache= !strcmp(buf, "cp932") ?
|
||||
&my_charset_cp932_japanese_ci : &my_charset_bin;
|
||||
}
|
||||
return fs_cset_cache;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -22,6 +22,9 @@
|
|||
uint dirname_length(const char *name)
|
||||
{
|
||||
register my_string pos,gpos;
|
||||
#ifdef BASKSLASH_MBTAIL
|
||||
CHARSET_INFO *fs= fs_character_set();
|
||||
#endif
|
||||
#ifdef FN_DEVCHAR
|
||||
if ((pos=(char*)strrchr(name,FN_DEVCHAR)) == 0)
|
||||
#endif
|
||||
|
@ -29,12 +32,22 @@ uint dirname_length(const char *name)
|
|||
|
||||
gpos= pos++;
|
||||
for ( ; *pos ; pos++) /* Find last FN_LIBCHAR */
|
||||
{
|
||||
#ifdef BASKSLASH_MBTAIL
|
||||
uint l;
|
||||
if (use_mb(fs) && (l= my_ismbchar(fs, pos, pos + 3)))
|
||||
{
|
||||
pos+= l - 1;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
if (*pos == FN_LIBCHAR || *pos == '/'
|
||||
#ifdef FN_C_AFTER_DIR
|
||||
|| *pos == FN_C_AFTER_DIR || *pos == FN_C_AFTER_DIR_2
|
||||
#endif
|
||||
)
|
||||
gpos=pos;
|
||||
}
|
||||
return ((uint) (uint) (gpos+1-(char*) name));
|
||||
}
|
||||
|
||||
|
@ -85,6 +98,9 @@ uint dirname_part(my_string to, const char *name)
|
|||
char *convert_dirname(char *to, const char *from, const char *from_end)
|
||||
{
|
||||
char *to_org=to;
|
||||
#ifdef BACKSLASH_MBTAIL
|
||||
CHARSET_INFO *fs= fs_character_set();
|
||||
#endif
|
||||
|
||||
/* We use -2 here, becasue we need place for the last FN_LIBCHAR */
|
||||
if (!from_end || (from_end - from) > FN_REFLEN-2)
|
||||
|
@ -103,7 +119,22 @@ char *convert_dirname(char *to, const char *from, const char *from_end)
|
|||
*to++= FN_C_AFTER_DIR;
|
||||
#endif
|
||||
else
|
||||
*to++= *from;
|
||||
{
|
||||
#ifdef BACKSLASH_MBTAIL
|
||||
uint l;
|
||||
if (use_mb(fs) && (l= my_ismbchar(fs, from, from + 3)))
|
||||
{
|
||||
memmove(to, from, l);
|
||||
to+= l;
|
||||
from+= l - 1;
|
||||
to_org= to; /* Don't look inside mbchar */
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
*to++= *from;
|
||||
}
|
||||
}
|
||||
}
|
||||
*to=0;
|
||||
}
|
||||
|
|
|
@ -124,6 +124,9 @@ uint cleanup_dirname(register my_string to, const char *from)
|
|||
reg4 my_string start;
|
||||
char parent[5], /* for "FN_PARENTDIR" */
|
||||
buff[FN_REFLEN+1],*end_parentdir;
|
||||
#ifdef BACKSLASH_MBTAIL
|
||||
CHARSET_INFO *fs= fs_character_set();
|
||||
#endif
|
||||
DBUG_ENTER("cleanup_dirname");
|
||||
DBUG_PRINT("enter",("from: '%s'",from));
|
||||
|
||||
|
@ -141,6 +144,15 @@ uint cleanup_dirname(register my_string to, const char *from)
|
|||
length=(uint) (strmov(parent+1,FN_PARENTDIR)-parent);
|
||||
for (pos=start ; (*pos= *from_ptr++) != 0 ; pos++)
|
||||
{
|
||||
#ifdef BACKSLASH_MBTAIL
|
||||
uint l;
|
||||
if (use_mb(fs) && (l= my_ismbchar(fs, from_ptr - 1, from_ptr + 2)))
|
||||
{
|
||||
for (l-- ; l ; *++pos= *from_ptr++, l--);
|
||||
start= pos + 1; /* Don't look inside multi-byte char */
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
if (*pos == '/')
|
||||
*pos = FN_LIBCHAR;
|
||||
if (*pos == FN_LIBCHAR)
|
||||
|
|
Loading…
Reference in a new issue