Commit 2c900be0 authored by unknown's avatar unknown

InnoDB: Use create_temp_file() when available


innobase/include/os0file.h:
  Improve the comment of os_file_create_tmpfile()
innobase/os/os0file.c:
  os_file_create_tmpfile(): Use create_temp_file()
  via innobase_mysql_tmpfile() unless UNIV_HOTBACKUP is defined
sql/ha_innodb.cc:
  Added innobase_mysql_tmpfile(), a wrapper around create_temp_file()
parent fc4364e3
...@@ -134,12 +134,12 @@ void ...@@ -134,12 +134,12 @@ void
os_io_init_simple(void); os_io_init_simple(void);
/*===================*/ /*===================*/
/*************************************************************************** /***************************************************************************
Creates a temporary file. In case of error, causes abnormal termination. */ Creates a temporary file. */
FILE* FILE*
os_file_create_tmpfile(void); os_file_create_tmpfile(void);
/*========================*/ /*========================*/
/* out: temporary file handle, or NULL */ /* out: temporary file handle, or NULL on error */
/******************************************************************** /********************************************************************
A simple function to open or create a file. */ A simple function to open or create a file. */
......
...@@ -371,39 +371,71 @@ os_io_init_simple(void) ...@@ -371,39 +371,71 @@ os_io_init_simple(void)
} }
} }
#ifndef UNIV_HOTBACKUP
/*************************************************************************
Creates a temporary file. This function is defined in ha_innodb.cc. */
int
innobase_mysql_tmpfile(void);
/*========================*/
/* out: temporary file descriptor, or < 0 on error */
#endif /* !UNIV_HOTBACKUP */
/*************************************************************************** /***************************************************************************
Creates a temporary file. In case of error, causes abnormal termination. */ Creates a temporary file. */
FILE* FILE*
os_file_create_tmpfile(void) os_file_create_tmpfile(void)
/*========================*/ /*========================*/
/* out: temporary file handle, or NULL */ /* out: temporary file handle, or NULL on error */
{ {
FILE* file; FILE* file = NULL;
#ifdef __WIN__
int fd = -1; int fd = -1;
char* name; #ifdef UNIV_HOTBACKUP
file = NULL; int tries;
if (NULL == (name = tempnam(fil_path_to_mysql_datadir, "ib")) for (tries = 10; tries--; ) {
|| -1 == (fd = _open(name, _O_CREAT | _O_EXCL | _O_RDWR char* name = tempnam(fil_path_to_mysql_datadir, "ib");
| _O_SEQUENTIAL | _O_SHORT_LIVED | _O_TEMPORARY)) if (!name) {
|| NULL == (file = fdopen(fd, "w+b"))) { break;
ut_print_timestamp(stderr); }
fprintf(stderr, " InnoDB: Error: unable to create"
" temporary file %s\n", name ? name : "name"); fd = open(name,
if (fd != -1) { # ifdef __WIN__
_close(fd); O_SEQUENTIAL | O_SHORT_LIVED | O_TEMPORARY |
# endif /* __WIN__ */
O_CREAT | O_EXCL | O_RDWR,
S_IREAD | S_IWRITE);
if (fd >= 0) {
# ifndef __WIN__
unlink(name);
# endif /* !__WIN__ */
free(name);
break;
} }
ut_print_timestamp(stderr);
fprintf(stderr, " InnoDB: Warning: "
"unable to create temporary file %s, retrying\n",
name);
free(name);
} }
free(name); #else /* UNIV_HOTBACKUP */
#else /* __WIN__ */ fd = innobase_mysql_tmpfile();
file = tmpfile(); #endif /* UNIV_HOTBACKUP */
if (file == NULL) {
if (fd >= 0) {
file = fdopen(fd, "w+b");
}
if (!file) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: unable to create temporary file\n", fputs(" InnoDB: Error: unable to create temporary file\n",
stderr); stderr);
if (fd >= 0) {
close(fd);
}
} }
#endif /* __WIN__ */
return(file); return(file);
} }
......
...@@ -406,6 +406,30 @@ innobase_mysql_print_thd( ...@@ -406,6 +406,30 @@ innobase_mysql_print_thd(
putc('\n', f); putc('\n', f);
} }
/*************************************************************************
Creates a temporary file. */
extern "C"
int
innobase_mysql_tmpfile(void)
/*========================*/
/* out: temporary file descriptor, or < 0 on error */
{
char filename[FN_REFLEN];
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));
#ifndef __WIN__
if (fd >= 0) {
unlink(filename);
}
#endif /* !__WIN__ */
return(fd);
}
/************************************************************************* /*************************************************************************
Gets the InnoDB transaction handle for a MySQL handler object, creates Gets the InnoDB transaction handle for a MySQL handler object, creates
an InnoDB transaction struct if the corresponding MySQL thread struct still an InnoDB transaction struct if the corresponding MySQL thread struct still
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment