mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +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);
|
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#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");
|
|
||||||
if (fd != -1) {
|
|
||||||
_close(fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 /* 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(
|
|||||||
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
|
||||||
|
Reference in New Issue
Block a user