Commit 29f3f4a2 authored by unknown's avatar unknown
Browse files

added function mysql_set_character_set (reviewed by Monty)

as a work around for #8317 and #9637

This function sends SET NAMES command and changes mysql->charset
so mysql_real_escape_string will work as expected.


libmysql/libmysql.def:
  added new function mysql_set_character_set
parent cbbc4ff6
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -1509,6 +1509,36 @@ const char * STDCALL mysql_character_set_name(MYSQL *mysql)
  return mysql->charset->csname;
}

int STDCALL mysql_set_character_set(MYSQL *mysql, char *cs_name)
{
  struct charset_info_st *cs;
  const char *save_csdir = charsets_dir;

  if (mysql->options.charset_dir)
    charsets_dir = mysql->options.charset_dir; 

  if ( (cs = get_charset_by_csname(cs_name, MY_CS_PRIMARY, MYF(0))) )
  {
    char buff[MY_CS_NAME_SIZE + 10];
    charsets_dir = save_csdir;
    sprintf(buff, "SET NAMES %s", cs_name);
    if (!mysql_query(mysql, buff)) {
      mysql->charset = cs;
    } 
  } else {
    char cs_dir_name[FN_REFLEN];
    get_charsets_dir(cs_dir_name);
    mysql->net.last_errno=CR_CANT_READ_CHARSET;
    strmov(mysql->net.sqlstate, unknown_sqlstate);
    my_snprintf(mysql->net.last_error, sizeof(mysql->net.last_error)-1,
                ER(mysql->net.last_errno),
                cs_name,
                cs_dir_name);

  }
  charsets_dir = save_csdir;
  return mysql->net.last_errno;
}

uint STDCALL mysql_thread_safe(void)
{
+1 −0
Original line number Diff line number Diff line
@@ -146,4 +146,5 @@ EXPORTS
	mysql_rpl_query_type
	mysql_slave_query
	mysql_embedded
	mysql_set_character_set
	get_defaults_files