Ticket #108: flint_table.cc.patch

File flint_table.cc.patch, 2.8 KB (added by Charlie Hull, 18 years ago)

Patch to use Win32 system calls to fix the problem

  • flint_table.cc

     
    2323#include <config.h>
    2424
    2525#include "safeerrno.h"
    26 
     26#include "safewindows.h"
    2727// Define to use "dangerous" mode - in this mode we write modified btree
    2828// blocks back in place.  This is somewhat faster (especially once we're
    2929// I/O bound) but the database can't be safely searched during indexing
     
    102102
    103103static int sys_open_to_write_no_except(const string & name)
    104104{
     105#ifdef _MSC_VER
     106        /* open file using Windows API, as we may need to delete it while it is still open */
     107        HANDLE handleWin = CreateFile(name.c_str(),
     108                                                        GENERIC_WRITE,
     109                                                        FILE_SHARE_WRITE | FILE_SHARE_DELETE, /* FILE_SHARE_DELETE allows it to be deleted while open */
     110                                                        NULL,
     111                                                        CREATE_ALWAYS,
     112                                                        FILE_ATTRIBUTE_NORMAL,
     113                                                        NULL);
     114        if( handleWin == INVALID_HANDLE_VALUE)
     115        { /* Failed to open */
     116                switch(GetLastError()){
     117                        case ERROR_ALREADY_EXISTS: _set_errno(EEXIST); break;
     118                        case ERROR_ACCESS_DENIED: _set_errno(EACCES); break;
     119                        }
     120                return -1;                     
     121        }
     122 
     123        /* Now return a standard file descriptor */
     124        int fd = _open_osfhandle((intptr_t)handleWin, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY);
     125
     126#else
    105127    int fd = open(name.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666);
     128#endif 
    106129    return fd;
    107130}
    108131
     
    119142
    120143static int sys_open_for_readwrite(const string & name)
    121144{
     145#ifdef _MSC_VER
     146        /* open file using Windows API, as we may need to delete it while it is still open */
     147        HANDLE handleWin = CreateFile(name.c_str(),
     148                                                        GENERIC_READ | GENERIC_WRITE,
     149                                                        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, /* FILE_SHARE_DELETE allows it to be deleted while open */
     150                                                        NULL,
     151                                                        CREATE_ALWAYS,
     152                                                        FILE_ATTRIBUTE_NORMAL,
     153                                                        NULL);
     154        if( handleWin == INVALID_HANDLE_VALUE)
     155        { /* Failed to open */
     156                switch(GetLastError()){
     157                        case ERROR_ALREADY_EXISTS: _set_errno(EEXIST); break;
     158                        case ERROR_ACCESS_DENIED: _set_errno(EACCES); break;
     159                }
     160                return -1;                     
     161        }
     162 
     163        /* Now return a standard file descriptor */
     164        int fd = _open_osfhandle((intptr_t)handleWin, O_RDWR | O_CREAT | O_TRUNC | O_BINARY);
     165
     166#else
    122167    int fd = open(name.c_str(), O_RDWR | O_BINARY);
     168#endif 
    123169    if (fd < 0) {
    124170        string message = string("Couldn't open ")
    125171                + name + " read/write: " + strerror(errno);
     
    130176
    131177static void sys_unlink(const string &filename)
    132178{
     179#ifdef _MSC_VER
     180        if(DeleteFile(filename.c_str())) {
     181                switch(GetLastError()){
     182                        case ERROR_FILE_NOT_FOUND: _set_errno(ENOENT); break;
     183                        case ERROR_ACCESS_DENIED: _set_errno(EACCES); break;
     184                }
     185#else   
    133186    if (unlink(filename) == -1) {
     187#endif
    134188        string message = "Failed to unlink ";
    135189        message += filename;
    136190        message += ": ";