diff options
author | unknown <monty@tramp.mysql.fi> | 2000-10-03 14:18:03 +0300 |
---|---|---|
committer | unknown <monty@tramp.mysql.fi> | 2000-10-03 14:18:03 +0300 |
commit | 63b7b45ff7f79a08a673e8b759a69f5ee7e67902 (patch) | |
tree | c02cc6a9c6585038615c596332aae70354b44aac /mysys/mf_cache.c | |
parent | 27a17a6ef909533820b2137ab598fb7df220876d (diff) | |
download | mariadb-git-63b7b45ff7f79a08a673e8b759a69f5ee7e67902.tar.gz |
First part of automatic repair of MyISAM tables.
Error on full disk on repair.
SIGHUP signal handling.
Update with keys on timestamp
Portability fixes
Docs/manual.texi:
Added documentation about automatic repair of MyISAM tables
client/mysql.cc:
Remove usage of tempnam.
include/my_sys.h:
Added create_temp_file
include/myisam.h:
Fix for disk full on repair
myisam/mi_check.c:
Fix for disk full on repair
myisam/sort.c:
Fix for disk full on repair & removed usage of tempnam()
mysys/mf_cache.c:
Remove usage of tempnam()
mysys/mf_dirname.c:
Changed convert_dirname to return end 0
mysys/my_fopen.c:
Security fixes
mysys/my_tempnam.c:
remove blanks
readline/bind.c:
Portability fixes
readline/complete.c:
Portability fixes
readline/histexpand.c:
Portability fixes
readline/input.c:
Portability fixes
readline/search.c:
Portability fixes
readline/shell.c:
Portability fixes
readline/terminal.c:
Portability fixes
readline/tilde.c:
Portability fixes
readline/undo.c:
Portability fixes
regex/cname.h:
Portability fixes
regex/debug.c:
Portability fixes
regex/main.c:
Portability fixes
regex/regcomp.c:
Portability fixes
regex/regerror.c:
Portability fixes
sql/filesort.cc:
Remove dummy code
sql/ha_myisam.cc:
Automatic repair of MyISAM tables
sql/ha_myisam.h:
Automatic repair of MyISAM tables
sql/handler.cc:
Automatic repair of MyISAM tables
sql/handler.h:
Automatic repair of MyISAM tables
sql/key.cc:
Fix for UPDATE with key on timestamp column
sql/mysql_priv.h:
Automatic repair of MyISAM tables
sql/mysqld.cc:
Automatic repair of MyISAM tables & signal SIGHUP handling
sql/sql_base.cc:
Automatic repair of MyISAM tables
sql/sql_class.cc:
Automatic repair of MyISAM tables
sql/sql_class.h:
Fix for insert with reference to columns
sql/sql_insert.cc:
Fix for insert with reference to columns
sql/table.cc:
Automatic repair of MyISAM tables
BitKeeper/etc/logging_ok:
Logging to logging@openlogging.org accepted
Diffstat (limited to 'mysys/mf_cache.c')
-rw-r--r-- | mysys/mf_cache.c | 97 |
1 files changed, 73 insertions, 24 deletions
diff --git a/mysys/mf_cache.c b/mysys/mf_cache.c index c40cfa386d3..9017bf4f18c 100644 --- a/mysys/mf_cache.c +++ b/mysys/mf_cache.c @@ -1,15 +1,15 @@ /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB - + This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - + You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, @@ -18,66 +18,115 @@ /* Open a temporary file and cache it with io_cache. Delete it on close */ #include "mysys_priv.h" +#include <m_string.h> +#include "my_static.h" +#include "mysys_err.h" +#include <paths.h> + +#define TMP_EXT ".tmp" /* Extension of tempfile */ +#if ! defined(P_tmpdir) +#define P_tmpdir "" +#endif + +#ifdef HAVE_TEMPNAM +#ifndef MSDOS +extern char **environ; +#endif +#endif /* - ** Open a cached tempfile by IO_CACHE + Remove an open tempfile so that it doesn't survive + if we crash; If the operating system doesn't support + this, just remember the file name for later removal + */ + +static my_bool cache_remove_open_tmp(IO_CACHE *cache, const char *name) +{ +#if O_TEMPORARY == 0 +#if !defined(CANT_DELETE_OPEN_FILES) + /* The following should always succeed */ + (void) my_delete(name,MYF(MY_WME | ME_NOINPUT)); +#else + int length; + if (!(cache->file_name= + (char*) my_malloc((length=strlen(name)+1),MYF(MY_WME))) + { + my_close(cache->file,MYF(0)); + cache->file = -1; + errno=my_error=ENOMEM; + return 1; + } + memcpy(cache->file_name,name,length); +#endif +#endif /* O_TEMPORARY == 0 */ + return 0; +} + + /* + ** Open tempfile cached by IO_CACHE ** Should be used when no seeks are done (only reinit_io_buff) ** Return 0 if cache is inited ok ** The actual file is created when the IO_CACHE buffer gets filled + ** If dir is not given, use TMPDIR. */ my_bool open_cached_file(IO_CACHE *cache, const char* dir, const char *prefix, uint cache_size, myf cache_myflags) { DBUG_ENTER("open_cached_file"); - + cache->dir= dir ? my_strdup(dir,MYF(cache_myflags & MY_WME)) : (char*) 0; + cache->prefix= (prefix ? my_strdup(prefix,MYF(cache_myflags & MY_WME)) : + (char*) 0); + cache->file_name=0; cache->buffer=0; /* Mark that not open */ - if (!(cache->file_name=my_tempnam(dir,prefix,MYF(MY_WME)))) - DBUG_RETURN(1); if (!init_io_cache(cache,-1,cache_size,WRITE_CACHE,0L,0, MYF(cache_myflags | MY_NABP))) { DBUG_RETURN(0); } - (*free)(cache->file_name); /* my_tempnam uses malloc() */ - cache->file_name=0; + my_free(cache->dir, MYF(MY_ALLOW_ZERO_PTR)); + my_free(cache->prefix,MYF(MY_ALLOW_ZERO_PTR)); DBUG_RETURN(0); } + /* Create the temporary file */ my_bool real_open_cached_file(IO_CACHE *cache) { + char name_buff[FN_REFLEN]; + int error=1; DBUG_ENTER("real_open_cached_file"); - if ((cache->file=my_create(cache->file_name,0, - (int) (O_RDWR | O_BINARY | O_TRUNC | O_TEMPORARY | - O_SHORT_LIVED), - MYF(MY_WME))) >= 0) + if ((cache->file=create_temp_file(name_buff, cache->dir, cache->prefix, + (O_RDWR | O_BINARY | O_TRUNC | + O_TEMPORARY | O_SHORT_LIVED), + MYF(MY_WME))) >= 0) { -#if O_TEMPORARY == 0 && !defined(CANT_DELETE_OPEN_FILES) - VOID(my_delete(cache->file_name,MYF(MY_WME | ME_NOINPUT))); -#endif - DBUG_RETURN(0); + error=0; + cache_remove_open_tmp(cache, name_buff); } - DBUG_RETURN(1); + DBUG_RETURN(error); } void close_cached_file(IO_CACHE *cache) { DBUG_ENTER("close_cached_file"); - if (my_b_inited(cache)) { - VOID(end_io_cache(cache)); + (void) end_io_cache(cache); if (cache->file >= 0) { - VOID(my_close(cache->file,MYF(MY_WME))); + (void) my_close(cache->file,MYF(0)); #ifdef CANT_DELETE_OPEN_FILES - VOID(my_delete(cache->file_name,MYF(MY_WME | ME_NOINPUT))); + if (cache->file_name) + { + (void) my_delete(cache->file_name,MYF(MY_WME | ME_NOINPUT)); + my_free(cache->file_name,MYF(0)); + } #endif } - if (cache->file_name) - (*free)(cache->file_name); /* my_tempnam uses malloc() */ + my_free(cache->dir,MYF(MY_ALLOW_ZERO_PTR)); + my_free(cache->prefix,MYF(MY_ALLOW_ZERO_PTR)); } DBUG_VOID_RETURN; } |