mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
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()
This commit is contained in:
@ -134,12 +134,12 @@ void
|
||||
os_io_init_simple(void);
|
||||
/*===================*/
|
||||
/***************************************************************************
|
||||
Creates a temporary file. In case of error, causes abnormal termination. */
|
||||
Creates a temporary file. */
|
||||
|
||||
FILE*
|
||||
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. */
|
||||
|
||||
|
@ -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*
|
||||
os_file_create_tmpfile(void)
|
||||
/*========================*/
|
||||
/* out: temporary file handle, or NULL */
|
||||
/* out: temporary file handle, or NULL on error */
|
||||
{
|
||||
FILE* file;
|
||||
#ifdef __WIN__
|
||||
FILE* file = NULL;
|
||||
int fd = -1;
|
||||
char* name;
|
||||
file = NULL;
|
||||
if (NULL == (name = tempnam(fil_path_to_mysql_datadir, "ib"))
|
||||
|| -1 == (fd = _open(name, _O_CREAT | _O_EXCL | _O_RDWR
|
||||
| _O_SEQUENTIAL | _O_SHORT_LIVED | _O_TEMPORARY))
|
||||
|| NULL == (file = fdopen(fd, "w+b"))) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr, " InnoDB: Error: unable to create"
|
||||
" temporary file %s\n", name ? name : "name");
|
||||
if (fd != -1) {
|
||||
_close(fd);
|
||||
#ifdef UNIV_HOTBACKUP
|
||||
int tries;
|
||||
for (tries = 10; tries--; ) {
|
||||
char* name = tempnam(fil_path_to_mysql_datadir, "ib");
|
||||
if (!name) {
|
||||
break;
|
||||
}
|
||||
|
||||
fd = open(name,
|
||||
# ifdef __WIN__
|
||||
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 /* __WIN__ */
|
||||
file = tmpfile();
|
||||
if (file == NULL) {
|
||||
#else /* UNIV_HOTBACKUP */
|
||||
fd = innobase_mysql_tmpfile();
|
||||
#endif /* UNIV_HOTBACKUP */
|
||||
|
||||
if (fd >= 0) {
|
||||
file = fdopen(fd, "w+b");
|
||||
}
|
||||
|
||||
if (!file) {
|
||||
ut_print_timestamp(stderr);
|
||||
fputs(" InnoDB: Error: unable to create temporary file\n",
|
||||
stderr);
|
||||
if (fd >= 0) {
|
||||
close(fd);
|
||||
}
|
||||
}
|
||||
#endif /* __WIN__ */
|
||||
|
||||
return(file);
|
||||
}
|
||||
|
||||
|
@ -406,6 +406,30 @@ innobase_mysql_print_thd(
|
||||
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
|
||||
an InnoDB transaction struct if the corresponding MySQL thread struct still
|
||||
|
Reference in New Issue
Block a user