oodrive / leveldb.net

LevelDB for Windows and .NET standard
Apache License 2.0
72 stars 18 forks source link

Add Snappy support for windows #11

Open mikhail-khalizev opened 2 years ago

mikhail-khalizev commented 2 years ago

Native library leveldb compiled without Snappy. As result when you open existence leveldb database, which is used Snappy, corrupted compressed block contents error occurs. So my suggestion to add Snappy support!

format.cc:

    case kSnappyCompression: {
      size_t ulength = 0;
      if (!port::Snappy_GetUncompressedLength(data, n, &ulength)) {          
        delete[] buf;
        return Status::Corruption("corrupted compressed block contents");   // <--- Always error
      }

port_win.h:

inline bool Snappy_GetUncompressedLength(const char* input, size_t length,
                                         size_t* result) {
#ifdef SNAPPY
  return snappy::GetUncompressedLength(input, length, result);
#else
  return false;     // <-- always false
#endif
}
mikhail-khalizev commented 2 years ago

This is leveldb.dll v1.23: leveldb-with-snappy-win-x64-release.zip

Workaround for current LevelDB.Net version:

            NativeLibrary.SetDllImportResolver(typeof(LevelDBInterop).Assembly, Resolver);
        private IntPtr Resolver(string libraryName, Assembly assembly, DllImportSearchPath? searchPath)
        {
            if (!string.Equals(libraryName, "leveldb.dll", StringComparison.OrdinalIgnoreCase)) 
                return default;

            var directory = Path.GetDirectoryName(GetType().Assembly.Location);
            if (string.IsNullOrEmpty(directory))
                return default;

            var filePath = Path.Combine(directory, libraryName);
            NativeLibrary.TryLoad(filePath, out var handle);
            return handle;
        }