mirror of
https://github.com/MariaDB/server.git
synced 2025-12-03 05:41:09 +03:00
make it return an error (except if certain errno), test this error in callers. Do a single my_sync_dir() in my_rename() if possible. include/my_global.h: better have a symbol name talking about the feature, use it in the code of the feature, and define the symbol once depending on the platform, rather than have the platform "tested" in the code of the feature several times. include/my_sys.h: my_sync_dir() now can return error mysys/my_create.c: my_sync_dir() can now return an error mysys/my_delete.c: my_sync_dir() can now return an error mysys/my_rename.c: my_sync_dir() can now return an error. Do a single sync if "from" and "to" are the same directory. #ifdef here to not even compile dirname_part() if useless. mysys/my_sync.c: more comments. A compilation error if no way to make my_sync() work (I guess we don't want to ship a binary which cannot do any sync at all; users of strange OSes compile from source and can remove the #error). my_sync_dir() now returns an error (except for certain errno values considered ok; EIO "input/output error" is not ok). sql/unireg.cc: my_sync_dir() now returns an error which must be tested
89 lines
2.8 KiB
C
89 lines
2.8 KiB
C
/* Copyright (C) 2000 MySQL AB
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
#include "mysys_priv.h"
|
|
#include "mysys_err.h"
|
|
|
|
int my_delete(const char *name, myf MyFlags)
|
|
{
|
|
int err;
|
|
DBUG_ENTER("my_delete");
|
|
DBUG_PRINT("my",("name %s MyFlags %d", name, MyFlags));
|
|
|
|
if ((err = unlink(name)) == -1)
|
|
{
|
|
my_errno=errno;
|
|
if (MyFlags & (MY_FAE+MY_WME))
|
|
my_error(EE_DELETE,MYF(ME_BELL+ME_WAITTANG+(MyFlags & ME_NOINPUT)),
|
|
name,errno);
|
|
}
|
|
else if ((MyFlags & MY_SYNC_DIR) &&
|
|
my_sync_dir_by_file(name, MyFlags))
|
|
err= -1;
|
|
DBUG_RETURN(err);
|
|
} /* my_delete */
|
|
|
|
#if defined(__WIN__) && defined(__NT__)
|
|
/*
|
|
Delete file which is possibly not closed.
|
|
|
|
This function is intended to be used exclusively as a temporal solution
|
|
for Win NT in case when it is needed to delete a not closed file (note
|
|
that the file must be opened everywhere with FILE_SHARE_DELETE mode).
|
|
Deleting not-closed files can not be supported on Win 98|ME (and because
|
|
of that is considered harmful).
|
|
|
|
The function deletes the file with its preliminary renaming. This is
|
|
because when not-closed share-delete file is deleted it still lives on
|
|
a disk until it will not be closed everwhere. This may conflict with an
|
|
attempt to create a new file with the same name. The deleted file is
|
|
renamed to <name>.<num>.deleted where <name> - the initial name of the
|
|
file, <num> - a hexadecimal number chosen to make the temporal name to
|
|
be unique.
|
|
*/
|
|
int nt_share_delete(const char *name, myf MyFlags)
|
|
{
|
|
char buf[MAX_PATH + 20];
|
|
ulong cnt;
|
|
DBUG_ENTER("nt_share_delete");
|
|
DBUG_PRINT("my",("name %s MyFlags %d", name, MyFlags));
|
|
|
|
for (cnt= GetTickCount(); cnt; cnt--)
|
|
{
|
|
sprintf(buf, "%s.%08X.deleted", name, cnt);
|
|
if (MoveFile(name, buf))
|
|
break;
|
|
|
|
if ((errno= GetLastError()) == ERROR_ALREADY_EXISTS)
|
|
continue;
|
|
|
|
DBUG_PRINT("warning", ("Failed to rename %s to %s, errno: %d",
|
|
name, buf, errno));
|
|
break;
|
|
}
|
|
|
|
if (DeleteFile(buf))
|
|
DBUG_RETURN(0);
|
|
|
|
my_errno= GetLastError();
|
|
if (MyFlags & (MY_FAE+MY_WME))
|
|
my_error(EE_DELETE, MYF(ME_BELL + ME_WAITTANG + (MyFlags & ME_NOINPUT)),
|
|
name, my_errno);
|
|
|
|
DBUG_RETURN(-1);
|
|
}
|
|
#endif
|