diff options
author | Gavin Andresen <gavinandresen@gmail.com> | 2012-12-21 14:41:48 -0500 |
---|---|---|
committer | Gavin Andresen <gavinandresen@gmail.com> | 2013-01-23 10:42:46 -0500 |
commit | b1024662eafddd5560fbfbac29333e5e967ca0f8 (patch) | |
tree | a8bdd5a1adf525847c8f7df4b2b62268f8d0a738 /src/leveldb/util | |
parent | 8aef119f43ee3b4e75e0f3bd7ea28cf7b29bb582 (diff) |
Port leveldb to MinGW32
Several changes to make the native windows leveldb code compile
with mingw32 and run on 32-bit Windows:
* Remove -std=c++0x dependency (modified code to use NULL instead of
nullptr)
* Link with -lshlwapi
* Only #define snprintf/etc if compiling with Visual Studio
* Do not link against DbgHelp.lib (wrote a CreateDir instead of using
DbgHelp's MakeSureDirectoryPathExists
* Define WINVER=0x0500 so MinGW32 can use the 64-bit-filesystem Windows
api calls
* Define __USE_MINGW_ANSI_STDIO=1 to use MinGW's printf (which supports
%ll)
I also cleaned up makefile.mingw, assuming that dependencies would be in
the standard /usr/local/{include,lib} by default but allowing overriding
with make DEPSDIR=... etc
Diffstat (limited to 'src/leveldb/util')
-rw-r--r-- | src/leveldb/util/env_win.cc | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/src/leveldb/util/env_win.cc b/src/leveldb/util/env_win.cc index 384331aec5..f1a7610624 100644 --- a/src/leveldb/util/env_win.cc +++ b/src/leveldb/util/env_win.cc @@ -20,9 +20,7 @@ #include <stdio.h> #include <errno.h> #include <io.h> -#include <dbghelp.h> #include <algorithm> -#pragma comment(lib,"DbgHelp.lib") #ifdef max #undef max @@ -908,18 +906,34 @@ uint64_t Win32Env::NowMicros() return (uint64_t)(GetTickCount64()*1000); } -Status Win32Env::CreateDir( const std::string& dirname ) +static Status CreateDirInner( const std::string& dirname ) { Status sRet; + DWORD attr = ::GetFileAttributes(dirname.c_str()); + if (attr == INVALID_FILE_ATTRIBUTES) { // doesn't exist: + std::size_t slash = dirname.find_last_of("\\"); + if (slash != std::string::npos){ + sRet = CreateDirInner(dirname.substr(0, slash)); + if (!sRet.ok()) return sRet; + } + BOOL result = ::CreateDirectory(dirname.c_str(), NULL); + if (result == FALSE) { + sRet = Status::IOError(dirname, "Could not create directory."); + return sRet; + } + } + return sRet; +} + +Status Win32Env::CreateDir( const std::string& dirname ) +{ std::string path = dirname; if(path[path.length() - 1] != '\\'){ path += '\\'; } ModifyPath(path); - if(!::MakeSureDirectoryPathExists( path.c_str() ) ){ - sRet = Status::IOError(dirname, "Could not create directory."); - } - return sRet; + + return CreateDirInner(path); } Status Win32Env::DeleteDir( const std::string& dirname ) |