summaryrefslogtreecommitdiff
path: root/sql/ha_innodb.cc
diff options
context:
space:
mode:
authorunknown <monty@mishka.local>2004-09-09 15:58:55 +0300
committerunknown <monty@mishka.local>2004-09-09 15:58:55 +0300
commitb15004a800770c3bdfc85f69c86629573669e1d0 (patch)
tree368687b45835bc7b5a71ef90de23cb752f4a1865 /sql/ha_innodb.cc
parentac473c38136ea8fed453e316b052819cd86d08a8 (diff)
parentbc787254247cb66a5e1adc0af6834c10737ecc6e (diff)
downloadmariadb-git-b15004a800770c3bdfc85f69c86629573669e1d0.tar.gz
Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into mishka.local:/home/my/mysql-5.0 BitKeeper/etc/logging_ok: auto-union sql/mysql_priv.h: Auto merged sql/opt_range.cc: Auto merged sql/sp.cc: Auto merged sql/sql_acl.cc: Auto merged sql/sql_lex.cc: Auto merged
Diffstat (limited to 'sql/ha_innodb.cc')
-rw-r--r--sql/ha_innodb.cc83
1 files changed, 75 insertions, 8 deletions
diff --git a/sql/ha_innodb.cc b/sql/ha_innodb.cc
index 700b8fafe19..3003425a489 100644
--- a/sql/ha_innodb.cc
+++ b/sql/ha_innodb.cc
@@ -40,6 +40,7 @@ have disables the InnoDB inlining in this file. */
#include <m_ctype.h>
#include <hash.h>
#include <myisampack.h>
+#include <mysys_err.h>
#define MAX_ULONG_BIT ((ulong) 1 << (sizeof(ulong)*8-1))
@@ -117,6 +118,8 @@ my_bool innobase_log_archive = FALSE;/* unused */
my_bool innobase_use_native_aio = FALSE;
my_bool innobase_fast_shutdown = TRUE;
my_bool innobase_file_per_table = FALSE;
+my_bool innobase_locks_unsafe_for_binlog = FALSE;
+my_bool innobase_create_status_file = FALSE;
static char *internal_innobase_data_file_path = NULL;
@@ -134,6 +137,10 @@ char innodb_dummy_stmt_trx_handle = 'D';
static HASH innobase_open_tables;
+#ifdef __NETWARE__ /* some special cleanup for NetWare */
+bool nw_panic = FALSE;
+#endif
+
static mysql_byte* innobase_get_key(INNOBASE_SHARE *share,uint *length,
my_bool not_used __attribute__((unused)));
static INNOBASE_SHARE *get_share(const char *table_name);
@@ -292,8 +299,9 @@ convert_error_code_to_mysql(
} else if (error == (int) DB_CANNOT_DROP_CONSTRAINT) {
- return(HA_ERR_ROW_IS_REFERENCED);
-
+ return(HA_ERR_CANNOT_ADD_FOREIGN); /* TODO: This is a bit
+ misleading, a new MySQL error
+ code should be introduced */
} else if (error == (int) DB_COL_APPEARS_TWICE_IN_INDEX) {
return(HA_ERR_CRASHED);
@@ -419,6 +427,50 @@ innobase_mysql_print_thd(
}
/*************************************************************************
+Creates a temporary file. */
+extern "C"
+int
+innobase_mysql_tmpfile(void)
+/*========================*/
+ /* out: temporary file descriptor, or < 0 on error */
+{
+ char filename[FN_REFLEN];
+ int fd2 = -1;
+ File fd = create_temp_file(filename, NullS, "ib",
+#ifdef __WIN__
+ O_BINARY | O_TRUNC | O_SEQUENTIAL |
+ O_TEMPORARY | O_SHORT_LIVED |
+#endif /* __WIN__ */
+ O_CREAT | O_EXCL | O_RDWR,
+ MYF(MY_WME));
+ if (fd >= 0) {
+#ifndef __WIN__
+ /* On Windows, open files cannot be removed, but files can be
+ created with the O_TEMPORARY flag to the same effect
+ ("delete on close"). */
+ unlink(filename);
+#endif /* !__WIN__ */
+ /* Copy the file descriptor, so that the additional resources
+ allocated by create_temp_file() can be freed by invoking
+ my_close().
+
+ Because the file descriptor returned by this function
+ will be passed to fdopen(), it will be closed by invoking
+ fclose(), which in turn will invoke close() instead of
+ my_close(). */
+ fd2 = dup(fd);
+ if (fd2 < 0) {
+ DBUG_PRINT("error",("Got error %d on dup",fd2));
+ my_errno=errno;
+ my_error(EE_OUT_OF_FILERESOURCES,
+ MYF(ME_BELL+ME_WAITTANG), filename, my_errno);
+ }
+ my_close(fd, MYF(MY_WME));
+ }
+ return(fd2);
+}
+
+/*************************************************************************
Gets the InnoDB transaction handle for a MySQL handler object, creates
an InnoDB transaction struct if the corresponding MySQL thread struct still
lacks one. */
@@ -910,8 +962,10 @@ innobase_init(void)
srv_fast_shutdown = (ibool) innobase_fast_shutdown;
srv_file_per_table = (ibool) innobase_file_per_table;
+ srv_locks_unsafe_for_binlog = (ibool) innobase_locks_unsafe_for_binlog;
srv_max_n_open_files = (ulint) innobase_open_files;
+ srv_innodb_status = (ibool) innobase_create_status_file;
srv_print_verbose_log = mysql_embedded ? 0 : 1;
@@ -982,6 +1036,11 @@ innobase_end(void)
DBUG_ENTER("innobase_end");
+#ifdef __NETWARE__ /* some special cleanup for NetWare */
+ if (nw_panic) {
+ set_panic_flag_for_netware();
+ }
+#endif
if (innodb_inited)
{
innodb_inited= 0;
@@ -3645,11 +3704,19 @@ ha_innobase::create(
}
if (current_thd->query != NULL) {
-
- error = row_table_add_foreign_constraints(trx,
- current_thd->query, norm_name);
- error = convert_error_code_to_mysql(error, NULL);
+ LEX_STRING q;
+ if (thd->convert_string(&q, system_charset_info,
+ current_thd->query,
+ current_thd->query_length,
+ current_thd->charset())) {
+ error = HA_ERR_OUT_OF_MEM;
+ } else {
+ error = row_table_add_foreign_constraints(trx,
+ q.str, norm_name);
+
+ error = convert_error_code_to_mysql(error, NULL);
+ }
if (error) {
innobase_commit_low(trx);
@@ -4398,7 +4465,7 @@ ha_innobase::update_table_comment(
trx_search_latch_release_if_reserved(prebuilt->trx);
str = NULL;
- if (FILE* file = tmpfile()) {
+ if (FILE* file = os_file_create_tmpfile()) {
long flen;
/* output the data to a temporary file */
@@ -4460,7 +4527,7 @@ ha_innobase::get_foreign_key_create_info(void)
update_thd(current_thd);
- if (FILE* file = tmpfile()) {
+ if (FILE* file = os_file_create_tmpfile()) {
long flen;
prebuilt->trx->op_info = (char*)"getting info on foreign keys";