Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -287,3 +287,4 @@ __pycache__/
*.btm.cs
*.odx.cs
*.xsd.cs
.DS_Store
65 changes: 65 additions & 0 deletions Tests/CustomMergeOperatorTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using RocksDbSharp;

namespace Tests;

[TestClass]
public class CustomMergeOperatorTests
{
[TestMethod]
public void CustomMergeOperatorAppendsMultipleValues()
{
var mergeOp = MergeOperators.Create(
"StringAppend",
(ReadOnlySpan<byte> key, MergeOperators.OperandsEnumerator operands, out bool success) =>
{
var result = new List<byte>();
for (int i = 0; i < operands.Count; i++)
{
result.AddRange(operands.Get(i).ToArray());
}
success = true;
return result.ToArray();
},
(ReadOnlySpan<byte> key, bool hasExisting, ReadOnlySpan<byte> existing,
MergeOperators.OperandsEnumerator operands, out bool success) =>
{
var result = hasExisting ? existing.ToArray().ToList() : new List<byte>();
for (int i = 0; i < operands.Count; i++)
{
result.AddRange(operands.Get(i).ToArray());
}
success = true;
return result.ToArray();
});

var opts = new ColumnFamilyOptions().SetMergeOperator(mergeOp);
var dbPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
try
{
using var db = RocksDb.Open(new DbOptions().SetCreateIfMissing(),
dbPath,
new ColumnFamilies(opts));

db.Merge("key"u8.ToArray(), "hello"u8.ToArray());
db.Merge("key"u8.ToArray(), "world"u8.ToArray());

var value = db.Get("key"u8.ToArray());

Assert.IsNotNull(value);
Assert.AreEqual("helloworld", Encoding.UTF8.GetString(value));
}
finally
{
if (Directory.Exists(dbPath))
{
Directory.Delete(dbPath, recursive: true);
}
}
}
}
4 changes: 2 additions & 2 deletions build-codegen/Generate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,15 @@ private static string ManualEnumName(NativeEnum nativeEnum)
}
if (funcName == "rocksdb_mergeoperator_create_full_merge" && arg.Name == "success")
{
yield return ("out unsigned_char_ptr", "default");
yield return ("out byte", "default");
}
if (funcName == "rocksdb_mergeoperator_create_full_merge" && arg.Name == "new_value_length")
{
yield return ("out size_t_ptr", "default");
}
if (funcName == "rocksdb_mergeoperator_create_partial_merge" && arg.Name == "success")
{
yield return ("out unsigned_char_ptr", "default");
yield return ("out byte", "default");
}
if (funcName == "rocksdb_mergeoperator_create_partial_merge" && arg.Name == "new_value_length")
{
Expand Down
12 changes: 6 additions & 6 deletions csharp/src/MergeOperator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ namespace RocksDbSharp
public interface MergeOperator
{
string Name { get; }
IntPtr PartialMerge(IntPtr key, UIntPtr keyLength, IntPtr operandsList, IntPtr operandsListLength, int numOperands, out IntPtr success, out IntPtr newValueLength);
IntPtr FullMerge(IntPtr key, UIntPtr keyLength, IntPtr existingValue, UIntPtr existingValueLength, IntPtr operandsList, IntPtr operandsListLength, int numOperands, out IntPtr success, out IntPtr newValueLength);
IntPtr PartialMerge(IntPtr key, UIntPtr keyLength, IntPtr operandsList, IntPtr operandsListLength, int numOperands, out byte success, out IntPtr newValueLength);
IntPtr FullMerge(IntPtr key, UIntPtr keyLength, IntPtr existingValue, UIntPtr existingValueLength, IntPtr operandsList, IntPtr operandsListLength, int numOperands, out byte success, out IntPtr newValueLength);
void DeleteValue(IntPtr value, UIntPtr valueLength);
}

Expand Down Expand Up @@ -81,7 +81,7 @@ public MergeOperatorImpl(string name, PartialMergeFunc partialMerge, FullMergeFu
FullMerge = fullMerge;
}

unsafe IntPtr MergeOperator.PartialMerge(IntPtr key, UIntPtr keyLength, IntPtr operandsList, IntPtr operandsListLength, int numOperands, out IntPtr success, out IntPtr newValueLength)
unsafe IntPtr MergeOperator.PartialMerge(IntPtr key, UIntPtr keyLength, IntPtr operandsList, IntPtr operandsListLength, int numOperands, out byte success, out IntPtr newValueLength)
{
var keySpan = new ReadOnlySpan<byte>((void*)key, (int)keyLength);
var operandsListSpan = new ReadOnlySpan<IntPtr>((void*)operandsList, numOperands);
Expand All @@ -94,12 +94,12 @@ unsafe IntPtr MergeOperator.PartialMerge(IntPtr key, UIntPtr keyLength, IntPtr o
Marshal.Copy(value, 0, ret, value.Length);
newValueLength = (IntPtr)value.Length;

success = (IntPtr)Convert.ToInt32(_success);
success = (byte)(_success ? 1 : 0);

return ret;
}

unsafe IntPtr MergeOperator.FullMerge(IntPtr key, UIntPtr keyLength, IntPtr existingValue, UIntPtr existingValueLength, IntPtr operandsList, IntPtr operandsListLength, int numOperands, out IntPtr success, out IntPtr newValueLength)
unsafe IntPtr MergeOperator.FullMerge(IntPtr key, UIntPtr keyLength, IntPtr existingValue, UIntPtr existingValueLength, IntPtr operandsList, IntPtr operandsListLength, int numOperands, out byte success, out IntPtr newValueLength)
{
var keySpan = new ReadOnlySpan<byte>((void*)key, (int)keyLength);
var operandsListSpan = new ReadOnlySpan<IntPtr>((void*)operandsList, numOperands);
Expand All @@ -114,7 +114,7 @@ unsafe IntPtr MergeOperator.FullMerge(IntPtr key, UIntPtr keyLength, IntPtr exis
Marshal.Copy(value, 0, ret, value.Length);
newValueLength = (IntPtr)value.Length;

success = (IntPtr)Convert.ToInt32(_success);
success = (byte)(_success ? 1 : 0);

return ret;
}
Expand Down
4 changes: 2 additions & 2 deletions csharp/src/Native.cs
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,8 @@ namespace RocksDbSharp
public delegate int CompareDelegate(void_ptr p0, const_char_ptr a, size_t alen, const_char_ptr b, size_t blen);
public delegate int CompareTsDelegate(void_ptr p0, const_char_ptr a_ts, size_t a_tslen, const_char_ptr b_ts, size_t b_tslen);
public delegate int CompareWithoutTsDelegate(void_ptr p0, const_char_ptr a, size_t alen, bool a_has_ts, const_char_ptr b, size_t blen, bool b_has_ts);
public delegate char_ptr FullMergeDelegate(void_ptr p0, const_char_ptr key, size_t key_length, const_char_ptr existing_value, size_t existing_value_length, const_char_ptr_const_ptr operands_list, const_size_t_ptr operands_list_length, int num_operands, out unsigned_char_ptr success, out size_t_ptr new_value_length);
public delegate char_ptr PartialMergeDelegate(void_ptr p0, const_char_ptr key, size_t key_length, const_char_ptr_const_ptr operands_list, const_size_t_ptr operands_list_length, int num_operands, out unsigned_char_ptr success, out size_t_ptr new_value_length);
public delegate char_ptr FullMergeDelegate(void_ptr p0, const_char_ptr key, size_t key_length, const_char_ptr existing_value, size_t existing_value_length, const_char_ptr_const_ptr operands_list, const_size_t_ptr operands_list_length, int num_operands, out byte success, out size_t_ptr new_value_length);
public delegate char_ptr PartialMergeDelegate(void_ptr p0, const_char_ptr key, size_t key_length, const_char_ptr_const_ptr operands_list, const_size_t_ptr operands_list_length, int num_operands, out byte success, out size_t_ptr new_value_length);
public delegate void DeleteValueDelegate(void_ptr p0, const_char_ptr value, size_t value_length);
public delegate char_ptr TransformDelegate(void_ptr p0, const_char_ptr key, size_t length, size_t_ptr dst_length);
public delegate char InDomainDelegate(void_ptr p0, const_char_ptr key, size_t length);
Expand Down
4 changes: 2 additions & 2 deletions csharp/src/Options/ColumnFamilyOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -323,13 +323,13 @@ private static MergeOperator GetMergeOperatorFromPtr(IntPtr getMergeOperatorPtr)
return getMergeOperator();
}

private unsafe static IntPtr MergeOperator_PartialMerge(IntPtr state, IntPtr key, UIntPtr keyLength, IntPtr operandsList, IntPtr operandsListLength, int numOperands, out IntPtr success, out IntPtr newValueLength)
private unsafe static IntPtr MergeOperator_PartialMerge(IntPtr state, IntPtr key, UIntPtr keyLength, IntPtr operandsList, IntPtr operandsListLength, int numOperands, out byte success, out IntPtr newValueLength)
{
var mergeOperator = GetMergeOperatorFromPtr((*((OptionsBase.MergeOperatorState*)state)).GetMergeOperatorPtr);
return mergeOperator.PartialMerge(key, keyLength, operandsList, operandsListLength, numOperands, out success, out newValueLength);
}

private unsafe static IntPtr MergeOperator_FullMerge(IntPtr state, IntPtr key, UIntPtr keyLength, IntPtr existingValue, UIntPtr existingValueLength, IntPtr operandsList, IntPtr operandsListLength, int numOperands, out IntPtr success, out IntPtr newValueLength)
private unsafe static IntPtr MergeOperator_FullMerge(IntPtr state, IntPtr key, UIntPtr keyLength, IntPtr existingValue, UIntPtr existingValueLength, IntPtr operandsList, IntPtr operandsListLength, int numOperands, out byte success, out IntPtr newValueLength)
{
var mergeOperator = GetMergeOperatorFromPtr((*((OptionsBase.MergeOperatorState*)state)).GetMergeOperatorPtr);
return mergeOperator.FullMerge(key, keyLength, existingValue, existingValueLength, operandsList, operandsListLength, numOperands, out success, out newValueLength);
Expand Down