diff options
Diffstat (limited to 'libmysql')
-rw-r--r-- | libmysql/Makefile.am | 4 | ||||
-rw-r--r-- | libmysql/Makefile.shared | 1 | ||||
-rw-r--r-- | libmysql/libmysql.c | 77 | ||||
-rw-r--r-- | libmysql/libmysql.def | 3 |
4 files changed, 45 insertions, 40 deletions
diff --git a/libmysql/Makefile.am b/libmysql/Makefile.am index 0670a0befa8..4bd9eddafb0 100644 --- a/libmysql/Makefile.am +++ b/libmysql/Makefile.am @@ -23,8 +23,8 @@ target = libmysqlclient.la target_defs = -DUNDEF_THREADS_HACK -DDONT_USE_RAID @LIB_EXTRA_CCFLAGS@ LIBS = @CLIENT_LIBS@ -INCLUDES = -I$(top_srcdir)/include $(openssl_includes) @ZLIB_INCLUDES@ \ - -I$(top_builddir)/include +INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include \ + $(openssl_includes) @ZLIB_INCLUDES@ include $(srcdir)/Makefile.shared diff --git a/libmysql/Makefile.shared b/libmysql/Makefile.shared index d006363a1d3..a4d616f936a 100644 --- a/libmysql/Makefile.shared +++ b/libmysql/Makefile.shared @@ -84,6 +84,7 @@ CLEANFILES = $(target_libadd) $(SHLIBOBJS) \ DEFS = -DDEFAULT_CHARSET_HOME="\"$(MYSQLBASEdir)\"" \ -DDATADIR="\"$(MYSQLDATAdir)\"" \ -DDEFAULT_HOME_ENV=MYSQL_HOME \ + -DDEFAULT_GROUP_SUFFIX_ENV=MYSQL_GROUP_SUFFIX \ -DSHAREDIR="\"$(MYSQLSHAREdir)\"" $(target_defs) # The automatic dependencies miss this diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 8ee11519615..3931d7947aa 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -1495,40 +1495,22 @@ const char * STDCALL mysql_character_set_name(MYSQL *mysql) return mysql->charset->csname; } - -int STDCALL mysql_set_character_set(MYSQL *mysql, char *cs_name) +void STDCALL mysql_get_character_set_info(MYSQL *mysql, MY_CHARSET_INFO *csinfo) { - struct charset_info_st *cs; - const char *save_csdir= charsets_dir; + csinfo->number = mysql->charset->number; + csinfo->state = mysql->charset->state; + csinfo->csname = mysql->charset->csname; + csinfo->name = mysql->charset->name; + csinfo->comment = mysql->charset->comment; + csinfo->mbminlen = mysql->charset->mbminlen; + csinfo->mbmaxlen = mysql->charset->mbmaxlen; 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; - } - } + csinfo->dir = mysql->options.charset_dir; 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; + csinfo->dir = charsets_dir; } - uint STDCALL mysql_thread_safe(void) { #ifdef THREAD @@ -1616,6 +1598,8 @@ ulong STDCALL mysql_real_escape_string(MYSQL *mysql, char *to,const char *from, ulong length) { + if (mysql->server_status & SERVER_STATUS_NO_BACKSLASH_ESCAPES) + return escape_quotes_for_mysql(mysql->charset, to, 0, from, length); return escape_string_for_mysql(mysql->charset, to, 0, from, length); } @@ -1752,6 +1736,7 @@ static int stmt_read_row_unbuffered(MYSQL_STMT *stmt, unsigned char **row); static int stmt_read_row_buffered(MYSQL_STMT *stmt, unsigned char **row); static int stmt_read_row_from_cursor(MYSQL_STMT *stmt, unsigned char **row); static int stmt_read_row_no_data(MYSQL_STMT *stmt, unsigned char **row); +static int stmt_read_row_no_result_set(MYSQL_STMT *stmt, unsigned char **row); /* This function is used in mysql_stmt_store_result if @@ -1847,6 +1832,16 @@ static void net_clear_error(NET *net) } } +static void stmt_clear_error(MYSQL_STMT *stmt) +{ + if (stmt->last_errno) + { + stmt->last_errno= 0; + stmt->last_error[0]= '\0'; + strmov(stmt->sqlstate, not_error_sqlstate); + } +} + /* Set statement error code, sqlstate, and error message from given errcode and sqlstate. @@ -2004,7 +1999,7 @@ mysql_stmt_init(MYSQL *mysql) stmt->list.data= stmt; stmt->state= MYSQL_STMT_INIT_DONE; stmt->mysql= mysql; - stmt->read_row_func= stmt_read_row_no_data; + stmt->read_row_func= stmt_read_row_no_result_set; stmt->prefetch_rows= DEFAULT_PREFETCH_ROWS; /* The rest of statement members was bzeroed inside malloc */ @@ -2726,7 +2721,6 @@ stmt_read_row_from_cursor(MYSQL_STMT *stmt, unsigned char **row) set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate); return 1; } - stmt->server_status= mysql->server_status; if (cli_read_binary_rows(stmt)) return 1; stmt->server_status= mysql->server_status; @@ -2748,6 +2742,13 @@ static int stmt_read_row_no_data(MYSQL_STMT *stmt __attribute__((unused)), unsigned char **row __attribute__((unused))) { + return MYSQL_NO_DATA; +} + +static int +stmt_read_row_no_result_set(MYSQL_STMT *stmt __attribute__((unused)), + unsigned char **row __attribute__((unused))) +{ set_stmt_error(stmt, CR_NO_RESULT_SET, unknown_sqlstate); return 1; } @@ -3579,7 +3580,7 @@ static void fetch_string_with_conversion(MYSQL_BIND *param, char *value, case MYSQL_TYPE_TIMESTAMP: { MYSQL_TIME *tm= (MYSQL_TIME *)buffer; - (void) str_to_datetime(value, length, tm, 0, &err); + (void) str_to_datetime(value, length, tm, TIME_FUZZY_DATE, &err); *param->error= test(err) && (param->buffer_type == MYSQL_TYPE_DATE && tm->time_type != MYSQL_TIMESTAMP_DATE); break; @@ -3697,7 +3698,8 @@ static void fetch_long_with_conversion(MYSQL_BIND *param, MYSQL_FIELD *field, case MYSQL_TYPE_DATETIME: { int error; - value= number_to_datetime(value, (MYSQL_TIME *) buffer, 1, &error); + value= number_to_datetime(value, (MYSQL_TIME *) buffer, TIME_FUZZY_DATE, + &error); *param->error= test(error); break; } @@ -4569,7 +4571,8 @@ int STDCALL mysql_stmt_fetch(MYSQL_STMT *stmt) ((rc= stmt_fetch_row(stmt, row)) && rc != MYSQL_DATA_TRUNCATED)) { stmt->state= MYSQL_STMT_PREPARE_DONE; /* XXX: this is buggy */ - stmt->read_row_func= stmt_read_row_no_data; + stmt->read_row_func= (rc == MYSQL_NO_DATA) ? + stmt_read_row_no_data : stmt_read_row_no_result_set; } else { @@ -4886,13 +4889,12 @@ static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags) { MYSQL *mysql= stmt->mysql; MYSQL_DATA *result= &stmt->result; - my_bool has_cursor= stmt->read_row_func == stmt_read_row_from_cursor; /* Reset stored result set if so was requested or it's a part of cursor fetch. */ - if (result->data && (has_cursor || (flags & RESET_STORE_RESULT))) + if (result->data && (flags & RESET_STORE_RESULT)) { /* Result buffered */ free_root(&result->alloc, MYF(MY_KEEP_PREALLOC)); @@ -4907,7 +4909,7 @@ static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags) for (; param < param_end; param++) param->long_data_used= 0; } - stmt->read_row_func= stmt_read_row_no_data; + stmt->read_row_func= stmt_read_row_no_result_set; if (mysql) { if ((int) stmt->state > (int) MYSQL_STMT_PREPARE_DONE) @@ -4923,7 +4925,7 @@ static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags) mysql->status= MYSQL_STATUS_READY; } } - if (has_cursor || (flags & RESET_SERVER_SIDE)) + if (flags & RESET_SERVER_SIDE) { /* Reset the server side statement and close the server side @@ -4939,6 +4941,7 @@ static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags) stmt->state= MYSQL_STMT_INIT_DONE; return 1; } + stmt_clear_error(stmt); } } stmt->state= MYSQL_STMT_PREPARE_DONE; diff --git a/libmysql/libmysql.def b/libmysql/libmysql.def index 2da88c271ba..a469c67c466 100644 --- a/libmysql/libmysql.def +++ b/libmysql/libmysql.def @@ -149,5 +149,6 @@ EXPORTS mysql_server_init mysql_server_end mysql_set_character_set - get_defaults_files + mysql_get_character_set_info + get_defaults_options modify_defaults_file |