GetFileAttributes() returns INVALID_FILE_ATTRIBUTES with an error of
ERROR_ACCESS_DENIED if the file is in a "pending delete" state. I'll update
the retry logic in os_win.c in winDelete() to add this additional check. I
believe that should improve the situation (as long as the other application
which has the db journal file temporarily open closes it in the
MX_DELETION_ATTEMPTS * 100ms time frame.)
Of course, ERROR_ACCESS_DENIED can also be returned if you have insufficient
privileges to access the file, but I don't think retrying the delete in this
situation is bad either.
The return should also be modified to return SQLITE_OK only when
GetFileAttributes() returns INVALID_FILE_ATTRIBUTES with an error of
ERROR_FILE_NOT_FOUND. I'll make this change as well.
HTH.
-Shane
On 7/29/08, Jeremy Spiegel <[EMAIL PROTECTED]> wrote:
>
> Hi,
>
> winDelete in os_win.c has retry functionality to try multiple times to
> delete a file if a virus scanner or indexing program has a handle open
> on that file. We've seen SQLite failures that have been tracked down to
> other apps temporarily opening our db journal files, so we believe that
> the retry behavior could be very valuable to us.
>
> In order to check for failure, winDelete checks that DeleteFileW returns
> zero and that GetFileAttributesW doesn't return INVALID_FILE_ATTRIBUTES.
> However, when I try calling DeleteFileW on a file with a handle open on
> that file, I see DeleteFileW returning 1 (success) and I see
> GetFileAttributesW returning INVALID_FILE_ATTRIBUTES, I think because
> even though the file still exists it is in a "delete pending" state.
>
> The code below illustrates the problem. Thanks for any help you can
> provide!
>
> :) Jeremy Spiegel
>
>
> #include <stdio.h>
> #include <tchar.h>
> #include <windows.h>
>
> int _tmain(int argc, _TCHAR* argv[])
> {
> DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
> DWORD dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE |
> FILE_SHARE_DELETE;
> DWORD dwCreationDisposition = OPEN_ALWAYS;
> DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_TEMPORARY
> | FILE_ATTRIBUTE_HIDDEN
> | FILE_FLAG_DELETE_ON_CLOSE
> | FILE_FLAG_RANDOM_ACCESS;
>
> HANDLE h = CreateFileW(L"c:\\test.txt",
> dwDesiredAccess,
> dwShareMode,
> NULL,
> dwCreationDisposition,
> dwFlagsAndAttributes,
> NULL
> );
>
> if( h==INVALID_HANDLE_VALUE )
> printf("error\n");
>
> int rc = DeleteFileW( L"c:\\test.txt" );
> if ( rc == 0 )
> printf("DeleteFileW failed\n");
>
> if ( GetFileAttributesW( L"c:\\test.txt" ) != 0xffffffff )
> printf( "File still exists\n");
>
> HANDLE h2 = CreateFileW(L"c:\\test.txt",
> dwDesiredAccess,
> dwShareMode,
> NULL,
> dwCreationDisposition,
> dwFlagsAndAttributes,
> NULL
> );
>
> if ( h2 == INVALID_HANDLE_VALUE )
> printf( "Error: 0x%x", GetLastError() );
>
> CloseHandle(h);
> return 0;
> }
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users