diff --git a/RocksDbNative/RocksDbNative.csproj b/RocksDbNative/RocksDbNative.csproj index 57fb330..2b78995 100644 --- a/RocksDbNative/RocksDbNative.csproj +++ b/RocksDbNative/RocksDbNative.csproj @@ -2,7 +2,7 @@ RocksDbNative - netstandard1.6;net40;net45 + netstandard1.6;net471 $(RocksDbVersion).$(RocksDbNativeBuild) $(Version) $(Version) @@ -21,9 +21,9 @@ - + - @@ -33,36 +33,28 @@ SourceFiles="$(BaseIntermediateOutputPath)rocksdb-v$(RocksDbVersion)-%(NativeLib.RuntimeId).zip" DestinationFolder="$(BaseIntermediateOutputPath)rocksdb-$(RocksDbVersion)\runtimes\%(NativeLib.RuntimeId)\native\"> - + - - - + + - + true - PreserveNewest - - - - - true - build/net40 + runtimes/linux-x64/native - + + true - build/net45 + runtimes/win-x64/native + + \ No newline at end of file diff --git a/RocksDbNative/librocksdb.so b/RocksDbNative/librocksdb.so new file mode 100644 index 0000000..5d21308 Binary files /dev/null and b/RocksDbNative/librocksdb.so differ diff --git a/RocksDbNative/rocksdb.dll b/RocksDbNative/rocksdb.dll new file mode 100644 index 0000000..58b4610 Binary files /dev/null and b/RocksDbNative/rocksdb.dll differ diff --git a/RocksDbSharp/Native.Load.cs b/RocksDbSharp/Native.Load.cs index 8f2ed8c..22a94a4 100644 --- a/RocksDbSharp/Native.Load.cs +++ b/RocksDbSharp/Native.Load.cs @@ -15,7 +15,7 @@ static Native() { if (RuntimeInformation.ProcessArchitecture == Architecture.X86 && RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) throw new RocksDbSharpException("Rocksdb on windows is not supported for 32 bit applications"); - Instance = NativeImport.Auto.Import("rocksdb", "6.2.2", true); + Instance = NativeImport.Auto.Import("rocksdb", "6.6.3", true); } public Native() diff --git a/RocksDbSharp/Native.cs b/RocksDbSharp/Native.cs index 22034bd..8ff8fbe 100644 --- a/RocksDbSharp/Native.cs +++ b/RocksDbSharp/Native.cs @@ -215,6 +215,40 @@ public rocksdb_t_ptr rocksdb_open_for_read_only( return result; } + public abstract rocksdb_t_ptr rocksdb_open_as_secondary( + const_rocksdb_options_t_ptr options, + const_char_ptr name, + const_char_ptr secondary_path, + out const_char_ptr errptr); + + public rocksdb_t_ptr rocksdb_open_as_secondary( + const_rocksdb_options_t_ptr options, + const_char_ptr name, + const_char_ptr secondary_path) + { + var result = rocksdb_open_as_secondary(options, name, secondary_path, out char_ptr_ptr errptr); + if (errptr != IntPtr.Zero) + throw new RocksDbException(errptr); + return result; + } + + public abstract rocksdb_t_ptr rocksdb_open_as_secondary( + const_rocksdb_options_t_ptr options, + string name, + string secondary_path, + out const_char_ptr errptr); + + public rocksdb_t_ptr rocksdb_open_as_secondary( + const_rocksdb_options_t_ptr options, + string name, + string secondary_path) + { + var result = rocksdb_open_as_secondary(options, name, secondary_path, out char_ptr_ptr errptr); + if (errptr != IntPtr.Zero) + throw new RocksDbException(errptr); + return result; + } + public abstract rocksdb_backup_engine_t_ptr rocksdb_backup_engine_open( const_rocksdb_options_t_ptr options, const_char_ptr path, @@ -516,6 +550,65 @@ public rocksdb_t_ptr rocksdb_open_column_families( return result; } + public abstract rocksdb_t_ptr rocksdb_open_as_secondary_column_families( + const_rocksdb_options_t_ptr options, + const_char_ptr name, + const_char_ptr secondary_path, + int num_column_families, + const_char_ptr_ptr column_family_names, + const_rocksdb_options_t_ptr[] column_family_options, + rocksdb_column_family_handle_t_ptr[] column_family_handles, + out char_ptr_ptr errptr); + + public rocksdb_t_ptr rocksdb_open_as_secondary_column_families( + const_rocksdb_options_t_ptr options, + const_char_ptr name, + const_char_ptr secondary_path, + int num_column_families, + const_char_ptr_ptr column_family_names, + const_rocksdb_options_t_ptr[] column_family_options, + rocksdb_column_family_handle_t_ptr[] column_family_handles) + { + var result = rocksdb_open_as_secondary_column_families(options, name, secondary_path, num_column_families, column_family_names, column_family_options, column_family_handles, out char_ptr_ptr errptr); + if (errptr != IntPtr.Zero) + throw new RocksDbException(errptr); + return result; + } + + public abstract rocksdb_t_ptr rocksdb_open_as_secondary_column_families( + const_rocksdb_options_t_ptr options, + string name, + string secondary_path, + int num_column_families, + string[] column_family_names, + const_rocksdb_options_t_ptr[] column_family_options, + rocksdb_column_family_handle_t_ptr[] column_family_handles, + out char_ptr_ptr errptr); + + public rocksdb_t_ptr rocksdb_open_as_secondary_column_families( + const_rocksdb_options_t_ptr options, + string name, + string secondary_path, + int num_column_families, + string[] column_family_names, + const_rocksdb_options_t_ptr[] column_family_options, + rocksdb_column_family_handle_t_ptr[] column_family_handles) + { + var result = rocksdb_open_as_secondary_column_families(options, name, secondary_path, num_column_families, column_family_names, column_family_options, column_family_handles, out char_ptr_ptr errptr); + if (errptr != IntPtr.Zero) + throw new RocksDbException(errptr); + return result; + } + + public abstract void rocksdb_try_catch_up_with_primary(rocksdb_t_ptr db, out char_ptr_ptr errptr); + + public void rocksdb_try_catch_up_with_primary(rocksdb_t_ptr db) + { + rocksdb_try_catch_up_with_primary(db, out char_ptr_ptr errptr); + if (errptr != IntPtr.Zero) + throw new RocksDbException(errptr); + } + public abstract rocksdb_t_ptr rocksdb_open_for_read_only_column_families( const_rocksdb_options_t_ptr options, const_char_ptr name, diff --git a/RocksDbSharp/RocksDb.cs b/RocksDbSharp/RocksDb.cs index 770898b..6f1a907 100644 --- a/RocksDbSharp/RocksDb.cs +++ b/RocksDbSharp/RocksDb.cs @@ -51,6 +51,12 @@ public static RocksDb OpenReadOnly(OptionsHandle options, string path, bool erro return new RocksDb(db, optionsReferences: null, cfOptionsRefs: null); } + public static RocksDb OpenAsSecondary(OptionsHandle options, string path, string secondaryPath) + { + IntPtr db = Native.Instance.rocksdb_open_as_secondary(options.Handle, path, secondaryPath); + return new RocksDb(db, optionsReferences: null, cfOptionsRefs: null); + } + public static RocksDb OpenWithTtl(OptionsHandle options, string path, int ttlSeconds) { IntPtr db = Native.Instance.rocksdb_open_with_ttl(options.Handle, path, ttlSeconds); @@ -87,6 +93,21 @@ public static RocksDb OpenReadOnly(DbOptions options, string path, ColumnFamilie columnFamilies: cfHandleMap); } + public static RocksDb OpenAsSecondary(DbOptions options, string path, string secondaryPath, ColumnFamilies columnFamilies) + { + string[] cfnames = columnFamilies.Names.ToArray(); + IntPtr[] cfoptions = columnFamilies.OptionHandles.ToArray(); + IntPtr[] cfhandles = new IntPtr[cfnames.Length]; + IntPtr db = Native.Instance.rocksdb_open_as_secondary_column_families(options.Handle, path, secondaryPath, cfnames.Length, cfnames, cfoptions, cfhandles); + var cfHandleMap = new Dictionary(); + foreach (var pair in cfnames.Zip(cfhandles.Select(cfh => new ColumnFamilyHandleInternal(cfh)), (name, cfh) => new { Name = name, Handle = cfh })) + cfHandleMap.Add(pair.Name, pair.Handle); + return new RocksDb(db, + optionsReferences: options.References, + cfOptionsRefs: columnFamilies.Select(cfd => cfd.Options.References).ToArray(), + columnFamilies: cfHandleMap); + } + /// /// Usage: /// TRACE - + - + diff --git a/Versions.targets.include b/Versions.targets.include index fc811a6..3ee221e 100644 --- a/Versions.targets.include +++ b/Versions.targets.include @@ -1,6 +1,6 @@ - 6.2.2 + 6.6.3 0 0 diff --git a/tests/RocksDbSharpTest/FunctionalTests.cs b/tests/RocksDbSharpTest/FunctionalTests.cs index d90568e..2fb317c 100644 --- a/tests/RocksDbSharpTest/FunctionalTests.cs +++ b/tests/RocksDbSharpTest/FunctionalTests.cs @@ -465,6 +465,47 @@ public void FunctionalTest() Directory.Delete(dbname, true); } + // Test OpenAsSecondary + { + var primeDb = "test-prime"; + var secondaryDb = "test-secondary"; + + if (Directory.Exists(primeDb)) + Directory.Delete(primeDb, true); + + if (Directory.Exists(secondaryDb)) + Directory.Delete(secondaryDb, true); + + options = new RocksDbSharp.DbOptions() + .SetCreateIfMissing(true) + .SetCreateMissingColumnFamilies(true); + + using (var db = RocksDb.Open(options, primeDb)) + { + db.Put("one", "uno"); + } + + using (var db2 = RocksDb.OpenAsSecondary(options, primeDb, secondaryDb)) + { + Assert.Equal("uno", db2.Get("one")); + using (var db = RocksDb.Open(options, primeDb)) + { + db.Put("two", "dos"); + } + + Assert.Null(db2.Get("two")); + + db2.TryCatchUpWithPrimary(); + + Assert.Equal("dos", db2.Get("two")); + } + + if (Directory.Exists(primeDb)) + Directory.Delete(primeDb, true); + + if (Directory.Exists(secondaryDb)) + Directory.Delete(secondaryDb, true); + } } class IntegerStringComparator : StringComparatorBase