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