Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Initial 3-clause BSD licensed C# LevelDB binding

  • Loading branch information...
commit 8f2f6ac0ad968bd7d4726d64fcbccb5b5fcc61c3 0 parents
@meebey authored
3  .gitignore
@@ -0,0 +1,3 @@
+bin/
+*.pidb
+*.userprefs
26 AssemblyInfo.cs
@@ -0,0 +1,26 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("leveldb-sharp")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Copyright (c) 2011 The LevelDB Authors, Copyright (c) 2012 Mirco Bauer <meebey@meebey.net>")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.2")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
28 LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2012 Mirco Bauer <meebey@meebey.net>
+Copyright (c) 2011 The LevelDB Authors
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
343 Native.cs
@@ -0,0 +1,343 @@
+// leveldb-sharp
+//
+// Copyright (c) 2012 Mirco Bauer <meebey@meebey.net>
+// Copyright (c) 2011 The LevelDB Authors
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+using System;
+using System.Text;
+using System.Runtime.InteropServices;
+
+namespace LevelDB
+{
+ public static class Native
+ {
+ static void CheckError(string error)
+ {
+ if (String.IsNullOrEmpty(error)) {
+ return;
+ }
+ throw new ApplicationException(error);
+ }
+
+ static UIntPtr GetStringLength(string value)
+ {
+ return new UIntPtr((uint) Encoding.UTF8.GetByteCount(value));
+ }
+
+ // extern leveldb_t* leveldb_open(const leveldb_options_t* options, const char* name, char** errptr);
+ [DllImport("leveldb")]
+ public static extern IntPtr leveldb_open(IntPtr options, string name, out string error);
+ public static IntPtr leveldb_open(IntPtr options, string name)
+ {
+ string error;
+ var db = leveldb_open(options, name, out error);
+ CheckError(error);
+ return db;
+ }
+
+ [DllImport("leveldb")]
+ public static extern void leveldb_close(IntPtr db);
+
+ // extern void leveldb_put(leveldb_t* db, const leveldb_writeoptions_t* options, const char* key, size_t keylen, const char* val, size_t vallen, char** errptr);
+ [DllImport("leveldb")]
+ public static extern void leveldb_put(IntPtr db,
+ IntPtr writeOptions,
+ string key,
+ UIntPtr keyLength,
+ string value,
+ UIntPtr valueLength,
+ out string error);
+ public static void leveldb_put(IntPtr db,
+ IntPtr writeOptions,
+ string key,
+ string value)
+ {
+ string error;
+ var keyLength = GetStringLength(key);
+ var valueLength = GetStringLength(value);
+ Native.leveldb_put(db, writeOptions,
+ key, keyLength,
+ value, valueLength, out error);
+ CheckError(error);
+ }
+
+ [DllImport("leveldb")]
+ public static extern void leveldb_delete(IntPtr db, IntPtr options, string key, UIntPtr keylen, out string error);
+
+ [DllImport("leveldb")]
+ public static extern void leveldb_write(IntPtr db, IntPtr options, IntPtr batch, out string error);
+
+ [DllImport("leveldb")]
+ public static extern IntPtr leveldb_get(IntPtr db,
+ IntPtr readOptions,
+ string key,
+ UIntPtr keyLength,
+ out UIntPtr valueLength,
+ out string error);
+ public static string leveldb_get(IntPtr db,
+ IntPtr readOptions,
+ string key)
+ {
+ UIntPtr valueLength;
+ string error;
+ var keyLength = GetStringLength(key);
+ var valuePtr = leveldb_get(db, readOptions, key, keyLength,
+ out valueLength, out error);
+ CheckError(error);
+ if (valuePtr == IntPtr.Zero || valueLength == UIntPtr.Zero) {
+ return null;
+ }
+ return Marshal.PtrToStringAnsi(valuePtr, (int) valueLength);
+ }
+
+ [DllImport("leveldb")]
+ public static extern IntPtr leveldb_create_iterator(IntPtr db, IntPtr readOptions);
+
+ /* Options */
+ [DllImport("leveldb")]
+ public static extern IntPtr leveldb_options_create();
+
+ [DllImport("leveldb")]
+ public static extern void leveldb_options_destroy(IntPtr options);
+
+ [DllImport("leveldb")]
+ public static extern void leveldb_options_set_comparator(IntPtr options, IntPtr comparator);
+
+ /// <summary>
+ /// If true, the database will be created if it is missing.
+ /// Default: false
+ /// </summary>
+ [DllImport("leveldb")]
+ public static extern void leveldb_options_set_create_if_missing(IntPtr options, char value);
+
+ /// <summary>
+ /// If true, an error is raised if the database already exists.
+ /// Default: false
+ /// </summary>
+ [DllImport("leveldb")]
+ public static extern void leveldb_options_set_error_if_exists(IntPtr options, char value);
+
+ /// <summary>
+ /// If true, the implementation will do aggressive checking of the
+ /// data it is processing and will stop early if it detects any
+ /// errors. This may have unforeseen ramifications: for example, a
+ /// corruption of one DB entry may cause a large number of entries to
+ /// become unreadable or for the entire DB to become unopenable.
+ /// Default: false
+ /// </summary>
+ [DllImport("leveldb")]
+ public static extern void leveldb_options_set_paranoid_checks(IntPtr options, char value);
+
+ /// <summary>
+ /// Number of open files that can be used by the DB. You may need to
+ /// increase this if your database has a large working set (budget
+ /// one open file per 2MB of working set).
+ ///
+ /// Default: 1000
+ /// </summary>
+ // extern void leveldb_options_set_max_open_files(leveldb_options_t*, int);
+ [DllImport("leveldb")]
+ public static extern void leveldb_options_set_max_open_files(IntPtr options, int value);
+
+ // extern void leveldb_options_set_compression(leveldb_options_t*, int);
+ [DllImport("leveldb")]
+ public static extern void leveldb_options_set_compression(IntPtr options, int value);
+
+ /// <summary>
+ /// Control over blocks (user data is stored in a set of blocks, and
+ /// a block is the unit of reading from disk).
+ ///
+ /// If non-NULL, use the specified cache for blocks.
+ /// If NULL, leveldb will automatically create and use an 8MB internal cache.
+ /// Default: NULL
+ /// </summary>
+ // extern void leveldb_options_set_cache(leveldb_options_t*, leveldb_cache_t*);
+ [DllImport("leveldb")]
+ public static extern void leveldb_options_set_cache(IntPtr options, IntPtr cache);
+ public static void leveldb_options_set_cache_size(IntPtr options, int capacity)
+ {
+ var cache = leveldb_cache_create_lru((UIntPtr) capacity);
+ leveldb_options_set_cache(options, cache);
+ }
+
+ /// <summary>
+ /// Approximate size of user data packed per block. Note that the
+ /// block size specified here corresponds to uncompressed data. The
+ /// actual size of the unit read from disk may be smaller if
+ /// compression is enabled. This parameter can be changed dynamically.
+ ///
+ /// Default: 4K
+ /// </summary>
+ // extern void leveldb_options_set_block_size(leveldb_options_t*, size_t);
+
+ /// <summary>
+ /// Amount of data to build up in memory (backed by an unsorted log
+ /// on disk) before converting to a sorted on-disk file.
+ ///
+ /// Larger values increase performance, especially during bulk loads.
+ /// Up to two write buffers may be held in memory at the same time,
+ /// so you may wish to adjust this parameter to control memory usage.
+ /// Also, a larger write buffer will result in a longer recovery time
+ /// the next time the database is opened.
+ ///
+ /// Default: 4MB
+ /// </summary>
+ // extern void leveldb_options_set_write_buffer_size(leveldb_options_t*, size_t);
+
+ // TODO:
+ /*
+ extern void leveldb_options_set_write_buffer_size(leveldb_options_t*, size_t);
+ extern void leveldb_options_set_cache(leveldb_options_t*, leveldb_cache_t*);
+ extern void leveldb_options_set_block_size(leveldb_options_t*, size_t);
+ extern void leveldb_options_set_block_restart_interval(leveldb_options_t*, int);
+ enum {
+ leveldb_no_compression = 0,
+ leveldb_snappy_compression = 1
+ };
+ */
+
+ [DllImport("leveldb")]
+ public static extern IntPtr leveldb_readoptions_create();
+
+ [DllImport("leveldb")]
+ public static extern void leveldb_readoptions_destroy(IntPtr readOptions);
+ /*
+ extern void leveldb_readoptions_set_verify_checksums(
+ leveldb_readoptions_t*,
+ unsigned char);
+ extern void leveldb_readoptions_set_snapshot(
+ leveldb_readoptions_t*,
+ const leveldb_snapshot_t*);
+ */
+
+ // extern void leveldb_readoptions_set_fill_cache(leveldb_readoptions_t*, unsigned char);
+ [DllImport("leveldb")]
+ public static extern void leveldb_readoptions_set_fill_cache(IntPtr readOptions, bool value);
+
+ [DllImport("leveldb")]
+ public static extern IntPtr leveldb_writeoptions_create();
+
+ [DllImport("leveldb")]
+ public static extern void leveldb_writeoptions_destroy(IntPtr writeOptions);
+ /*
+ extern void leveldb_writeoptions_set_sync(
+ leveldb_writeoptions_t*, unsigned char);
+ */
+
+#region Iterator
+ // extern void leveldb_iter_seek_to_first(leveldb_iterator_t*);
+ [DllImport("leveldb")]
+ public static extern void leveldb_iter_seek_to_first(IntPtr iter);
+
+ // extern void leveldb_iter_seek_to_last(leveldb_iterator_t*);
+ [DllImport("leveldb")]
+ public static extern void leveldb_iter_seek_to_last(IntPtr iter);
+
+ // extern void leveldb_iter_seek(leveldb_iterator_t*, const char* k, size_t klen);
+ [DllImport("leveldb")]
+ public static extern void leveldb_iter_seek(IntPtr iter, string key, UIntPtr keyLength);
+ public static void leveldb_iter_seek(IntPtr iter, string key)
+ {
+ var keyLength = GetStringLength(key);
+ leveldb_iter_seek(iter, key, keyLength);
+ }
+
+ // extern unsigned char leveldb_iter_valid(const leveldb_iterator_t*);
+ [DllImport("leveldb")]
+ public static extern bool leveldb_iter_valid(IntPtr iter);
+
+ // extern void leveldb_iter_prev(leveldb_iterator_t*);
+ [DllImport("leveldb")]
+ public static extern void leveldb_iter_prev(IntPtr iter);
+
+ // extern void leveldb_iter_next(leveldb_iterator_t*);
+ [DllImport("leveldb")]
+ public static extern void leveldb_iter_next(IntPtr iter);
+
+ // extern const char* leveldb_iter_key(const leveldb_iterator_t*, size_t* klen);
+ [DllImport("leveldb")]
+ public static extern IntPtr leveldb_iter_key(IntPtr iter, out UIntPtr keyLength);
+ public static string leveldb_iter_key(IntPtr iter)
+ {
+ UIntPtr keyLength;
+ var keyPtr = leveldb_iter_key(iter, out keyLength);
+ if (keyPtr == IntPtr.Zero || keyLength == UIntPtr.Zero) {
+ return null;
+ }
+ return Marshal.PtrToStringAnsi(keyPtr, (int) keyLength);
+ }
+
+ // extern const char* leveldb_iter_value(const leveldb_iterator_t*, size_t* vlen);
+ [DllImport("leveldb")]
+ public static extern IntPtr leveldb_iter_value(IntPtr iter, out UIntPtr valueLength);
+ public static string leveldb_iter_value(IntPtr iter)
+ {
+ UIntPtr valueLength;
+ var valuePtr = leveldb_iter_value(iter, out valueLength);
+ if (valuePtr == IntPtr.Zero || valueLength == UIntPtr.Zero) {
+ return null;
+ }
+ return Marshal.PtrToStringAnsi(valuePtr, (int) valueLength);
+ }
+
+ // extern void leveldb_iter_destroy(leveldb_iterator_t*);
+ [DllImport("leveldb")]
+ public static extern void leveldb_iter_destroy(IntPtr iter);
+
+ /*
+extern void leveldb_iter_get_error(const leveldb_iterator_t*, char** errptr);
+ */
+#endregion
+
+#region Cache
+ // extern leveldb_cache_t* leveldb_cache_create_lru(size_t capacity);
+ [DllImport("leveldb")]
+ public static extern IntPtr leveldb_cache_create_lru(UIntPtr capacity);
+
+ // extern void leveldb_cache_destroy(leveldb_cache_t* cache);
+ [DllImport("leveldb")]
+ public static extern void leveldb_cache_destroy(IntPtr cache);
+#endregion
+
+ public static void Dump(IntPtr db)
+ {
+ var options = Native.leveldb_readoptions_create();
+ IntPtr iter = Native.leveldb_create_iterator(db, options);
+ for (Native.leveldb_iter_seek_to_first(iter);
+ Native.leveldb_iter_valid(iter);
+ Native.leveldb_iter_next(iter)) {
+ string key = Native.leveldb_iter_key(iter);
+ string value = Native.leveldb_iter_value(iter);
+ Console.WriteLine("'{0}' => '{1}'", key, value);
+ }
+ Native.leveldb_iter_destroy(iter);
+ }
+ }
+}
57 leveldb-sharp.csproj
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>9.0.21022</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{8DD96596-38AC-46DD-80C1-75D9EBE585EA}</ProjectGuid>
+ <OutputType>Library</OutputType>
+ <RootNamespace>LevelDB</RootNamespace>
+ <AssemblyName>leveldb-sharp</AssemblyName>
+ <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+ <SignAssembly>true</SignAssembly>
+ <AssemblyOriginatorKeyFile>leveldb-sharp.snk</AssemblyOriginatorKeyFile>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug</OutputPath>
+ <DefineConstants>DEBUG;</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>none</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release</OutputPath>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="AssemblyInfo.cs" />
+ <Compile Include="Native.cs" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <ProjectExtensions>
+ <MonoDevelop>
+ <Properties>
+ <Policies>
+ <TextStylePolicy NoTabsAfterNonTabs="True" RemoveTrailingWhitespace="True" inheritsSet="VisualStudio" inheritsScope="text/plain" scope="text/plain" />
+ <StandardHeader Text=" Copyright (c) ${Year}, ${CopyrightHolder}&#xA; All rights reserved.&#xA;&#xA; Redistribution and use in source and binary forms, with or without&#xA; modification, are permitted provided that the following conditions are&#xA; met:&#xA;&#xA; * Redistributions of source code must retain the above copyright&#xA; notice, this list of conditions and the following disclaimer.&#xA; * Redistributions in binary form must reproduce the above&#xA; copyright notice, this list of conditions and the following disclaimer&#xA; in the documentation and/or other materials provided with the&#xA; distribution.&#xA; * Neither the name of Google Inc. nor the names of its&#xA; contributors may be used to endorse or promote products derived from&#xA; this software without specific prior written permission.&#xA;&#xA; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS&#xA; &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT&#xA; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR&#xA; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT&#xA; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,&#xA; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT&#xA; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,&#xA; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY&#xA; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT&#xA; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE&#xA; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." IncludeInNewFiles="True" />
+ </Policies>
+ </Properties>
+ </MonoDevelop>
+ </ProjectExtensions>
+ <ItemGroup>
+ <None Include="leveldb-sharp.dll.config">
+ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ </None>
+ </ItemGroup>
+</Project>
4 leveldb-sharp.dll.config
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+ <dllmap dll="leveldb" target="libleveldb.so" />
+</configuration>
20 leveldb-sharp.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "leveldb-sharp", "leveldb-sharp.csproj", "{8DD96596-38AC-46DD-80C1-75D9EBE585EA}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8DD96596-38AC-46DD-80C1-75D9EBE585EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8DD96596-38AC-46DD-80C1-75D9EBE585EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8DD96596-38AC-46DD-80C1-75D9EBE585EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8DD96596-38AC-46DD-80C1-75D9EBE585EA}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = leveldb-sharp.csproj
+ EndGlobalSection
+EndGlobal
BIN  leveldb-sharp.snk
Binary file not shown
Please sign in to comment.
Something went wrong with that request. Please try again.