Skip to content

Commit 1f5e9e9

Browse files
committed
Refactoring of OpenDatabase method signature
1 parent 89e0c24 commit 1f5e9e9

14 files changed

+170
-141
lines changed

src/LightningDB.Tests/CursorTests.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ private void PopulateCursorValues()
6565
public void CursorShouldBeCreated()
6666
{
6767
//arrange
68-
_db = _txn.OpenDatabase(flags: DatabaseOpenFlags.None);
68+
_db = _txn.OpenDatabase(options: new DatabaseOptions { Flags = DatabaseOpenFlags.None });
6969

7070
//act
7171

@@ -77,7 +77,7 @@ public void CursorShouldBeCreated()
7777
public void CursorShouldPutValues()
7878
{
7979
//arrange
80-
_db = _txn.OpenDatabase(flags: DatabaseOpenFlags.None);
80+
_db = _txn.OpenDatabase(options: new DatabaseOptions { Flags = DatabaseOpenFlags.None });
8181

8282
//act
8383

@@ -89,7 +89,7 @@ public void CursorShouldPutValues()
8989
public void CursorShouldMoveToLast()
9090
{
9191
//arrange
92-
_db = _txn.OpenDatabase(flags: DatabaseOpenFlags.None);
92+
_db = _txn.OpenDatabase(options: new DatabaseOptions { Flags = DatabaseOpenFlags.None });
9393
this.PopulateCursorValues();
9494

9595
//assert
@@ -110,7 +110,7 @@ public void CursorShouldMoveToLast()
110110
public void CursorShouldMoveToFirst()
111111
{
112112
//arrange
113-
_db = _txn.OpenDatabase(flags: DatabaseOpenFlags.None);
113+
_db = _txn.OpenDatabase(options: new DatabaseOptions { Flags = DatabaseOpenFlags.None });
114114
this.PopulateCursorValues();
115115

116116
//assert
@@ -131,7 +131,7 @@ public void CursorShouldMoveToFirst()
131131
public void ShouldIterateThroughCursor()
132132
{
133133
//arrange
134-
_db = _txn.OpenDatabase(flags: DatabaseOpenFlags.None);
134+
_db = _txn.OpenDatabase(options: new DatabaseOptions { Flags = DatabaseOpenFlags.None });
135135
this.PopulateCursorValues();
136136

137137
using (var cur = _txn.CreateCursor(_db))
@@ -162,7 +162,7 @@ public void ShouldIterateThroughCursor()
162162
public void ShouldIterateThroughCursorByExtensions()
163163
{
164164
//arrange
165-
_db = _txn.OpenDatabase(flags: DatabaseOpenFlags.None);
165+
_db = _txn.OpenDatabase(options: new DatabaseOptions { Flags = DatabaseOpenFlags.None });
166166
this.PopulateCursorValues();
167167

168168
using (var cur = _txn.CreateCursor(_db))
@@ -187,7 +187,7 @@ public void ShouldIterateThroughCursorByExtensions()
187187
public void CursorShouldDeleteElements()
188188
{
189189
//arrange
190-
_db = _txn.OpenDatabase(flags: DatabaseOpenFlags.None);
190+
_db = _txn.OpenDatabase(options: new DatabaseOptions { Flags = DatabaseOpenFlags.None });
191191
this.PopulateCursorValues();
192192

193193
using (var cur = _txn.CreateCursor(_db))
@@ -215,7 +215,7 @@ public void CursorShouldDeleteElements()
215215
public void ShouldIterateThroughCursorByEnumerator()
216216
{
217217
//arrange
218-
_db = _txn.OpenDatabase(flags: DatabaseOpenFlags.None);
218+
_db = _txn.OpenDatabase(options: new DatabaseOptions { Flags = DatabaseOpenFlags.None });
219219
this.PopulateCursorValues();
220220

221221
var i = 0;
@@ -234,7 +234,7 @@ public void ShouldIterateThroughCursorByEnumerator()
234234
public void ShouldPutMultiple()
235235
{
236236
//arrange
237-
_db = _txn.OpenDatabase(flags: DatabaseOpenFlags.DuplicatesFixed);
237+
_db = _txn.OpenDatabase(options: new DatabaseOptions { Flags = DatabaseOpenFlags.DuplicatesFixed });
238238

239239
var values = new[] { 1, 2, 3, 4, 5 };
240240
using (var cur = _txn.CreateCursor(_db))

src/LightningDB.Tests/DatabaseIOTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public void TryGetShouldReturnValueIfKeyExists()
157157
[TestCase("test")]
158158
public void CanCommitTransactionToNamedDatabase(string dbName)
159159
{
160-
using (var db = _txn.OpenDatabase(dbName, DatabaseOpenFlags.Create))
160+
using (var db = _txn.OpenDatabase(dbName, new DatabaseOptions { Flags = DatabaseOpenFlags.Create }))
161161
{
162162
_txn.Put(db, "key1", "value");
163163

src/LightningDB.Tests/DatabaseTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public void DatabaseShouldBeCreated()
4646
//arrange
4747

4848
//act
49-
_txn.OpenDatabase(dbName, DatabaseOpenFlags.Create);
49+
_txn.OpenDatabase(dbName, new DatabaseOptions { Flags = DatabaseOpenFlags.Create });
5050

5151
//assert
5252
}
@@ -59,7 +59,7 @@ public void DefaultDatabaseShouldBeOpened()
5959
//arrange
6060

6161
//act
62-
var db = _txn.OpenDatabase(null, DatabaseOpenFlags.None);
62+
var db = _txn.OpenDatabase(null, new DatabaseOptions { Flags = DatabaseOpenFlags.None });
6363

6464
//assert
6565
Assert.AreEqual(true, db.IsOpened);
@@ -70,7 +70,7 @@ public void DefaultDatabaseShouldBeClosed()
7070
{
7171
_env.Open();
7272
_txn = _env.BeginTransaction();
73-
var db = _txn.OpenDatabase(null, DatabaseOpenFlags.None);
73+
var db = _txn.OpenDatabase(null, new DatabaseOptions { Flags = DatabaseOpenFlags.None });
7474
//arrange
7575

7676
//act
@@ -89,7 +89,7 @@ public void DatabaseFromCommitedTransactionShouldBeAccessable()
8989
LightningDatabase db;
9090
using (var committed = _env.BeginTransaction())
9191
{
92-
db = committed.OpenDatabase(null, DatabaseOpenFlags.None);
92+
db = committed.OpenDatabase(null, new DatabaseOptions { Flags = DatabaseOpenFlags.None });
9393
committed.Commit();
9494
}
9595

src/LightningDB.Tests/EnvironmentTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public void CanCountEnvironmentEntries()
129129
_env.Open();
130130

131131
using (var txn = _env.BeginTransaction())
132-
using (var db = txn.OpenDatabase(null, DatabaseOpenFlags.None))
132+
using (var db = txn.OpenDatabase(null, new DatabaseOptions { Flags = DatabaseOpenFlags.None }))
133133
{
134134
for (var i = 0; i < entriesCount; i++)
135135
txn.Put(db, i.ToString(), i.ToString());
@@ -156,7 +156,7 @@ public void CanGetUsedSize()
156156
var initialUsedSize = _env.UsedSize;
157157

158158
using (var txn = _env.BeginTransaction())
159-
using (var db = txn.OpenDatabase(null, DatabaseOpenFlags.None))
159+
using (var db = txn.OpenDatabase(null, new DatabaseOptions { Flags = DatabaseOpenFlags.None }))
160160
{
161161
for (int i = 0; i < entriesCount; i++)
162162
txn.Put(db, i, i);

src/LightningDB.Tests/TransactionTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ public void ReadOnlyTransactionShouldChangeStateOnRenew()
162162
public void DefaultDatabaseShouldBeDropped()
163163
{
164164
_txn = _env.BeginTransaction();
165-
var db = _txn.OpenDatabase(null, DatabaseOpenFlags.None);
165+
var db = _txn.OpenDatabase(null, new DatabaseOptions { Flags = DatabaseOpenFlags.None });
166166
//arrange
167167

168168
//act
@@ -177,7 +177,7 @@ public void CanCountTransactionEntries()
177177
{
178178
//arrange
179179
_txn = _env.BeginTransaction();
180-
var db = _txn.OpenDatabase(null, DatabaseOpenFlags.None);
180+
var db = _txn.OpenDatabase(null, new DatabaseOptions { Flags = DatabaseOpenFlags.None });
181181

182182
const int entriesCount = 10;
183183
for (var i = 0; i < entriesCount; i++)
@@ -197,8 +197,8 @@ public void TransactionShouldSupportCustomComparer()
197197
Func<int, int, int> comparison = (l, r) => -Math.Sign(l - r);
198198

199199
_txn = _env.BeginTransaction();
200-
var db = _txn.OpenDatabase<int>(
201-
comparer: comparison);
200+
var db = _txn.OpenDatabase(
201+
options: new DatabaseOptions { Compare = b => b.FromFunc(comparison) });
202202

203203
var keysUnsorted = new int[] { 2, 10, 5 };
204204
var keysSorted = keysUnsorted.ToArray();
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
6+
namespace LightningDB
7+
{
8+
public class CompareFunctionBuilder
9+
{
10+
private static LightningCompareDelegate CreateComparisonFunction<TKey>(
11+
Func<TKey, TKey, int> comparer)
12+
{
13+
if (comparer == null)
14+
return null;
15+
16+
return (db, left, right) =>
17+
{
18+
var converter = db.Environment.ConverterStore.GetFromBytes<TKey>();
19+
20+
var leftTyped = converter.Convert(db, left);
21+
var rightTyped = converter.Convert(db, right);
22+
23+
return comparer.Invoke(leftTyped, rightTyped);
24+
};
25+
}
26+
27+
private static LightningCompareDelegate CreateComparisonFunction(
28+
Func<byte[], byte[], int> comparer)
29+
{
30+
if (comparer == null)
31+
return null;
32+
33+
return (db, left, right) => comparer.Invoke(left, right);
34+
}
35+
36+
private static LightningCompareDelegate CreateComparisonFunction<TKey>(
37+
IComparer<TKey> comparer)
38+
{
39+
if (comparer == null)
40+
return null;
41+
42+
return CreateComparisonFunction<TKey>(comparer.Compare);
43+
}
44+
45+
public LightningCompareDelegate FromFunc<TKey>(Func<TKey, TKey, int> comparer)
46+
{
47+
return CreateComparisonFunction(comparer);
48+
}
49+
50+
public LightningCompareDelegate FromFunc(Func<byte[], byte[], int> comparer)
51+
{
52+
return CreateComparisonFunction(comparer);
53+
}
54+
55+
public LightningCompareDelegate FromComparer<TKey>(IComparer<TKey> comparer)
56+
{
57+
return CreateComparisonFunction(comparer);
58+
}
59+
60+
public LightningCompareDelegate FromDelegate(LightningCompareDelegate comparer)
61+
{
62+
return comparer;
63+
}
64+
}
65+
}

src/LightningDB/DatabaseOptions.cs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using LightningDB.Native;
6+
7+
namespace LightningDB
8+
{
9+
public class DatabaseOptions
10+
{
11+
public DatabaseOptions()
12+
{
13+
Flags = LightningConfig.Database.DefaultOpenFlags;
14+
Encoding = LightningConfig.Database.DefaultEncoding;
15+
}
16+
17+
#region IDatabaseOptions Members
18+
19+
public Func<CompareFunctionBuilder, LightningCompareDelegate> Compare { get; set; }
20+
21+
public Encoding Encoding { get; set; }
22+
23+
public DatabaseOpenFlags Flags { get; set; }
24+
25+
#endregion
26+
27+
private static CompareFunction CreateNativeCompareFunction(
28+
LightningDatabase db, LightningCompareDelegate compare)
29+
{
30+
return (IntPtr left, IntPtr right) =>
31+
compare.Invoke(db, NativeMethods.ValueByteArrayFromPtr(left), NativeMethods.ValueByteArrayFromPtr(right));
32+
}
33+
34+
private static CompareFunction SetNativeCompareFunction(
35+
LightningTransaction tran, LightningDatabase db, LightningCompareDelegate compare)
36+
{
37+
var compareFunction = CreateNativeCompareFunction(db, compare);
38+
39+
NativeMethods.Execute(lib =>
40+
lib.mdb_set_compare(tran._handle, db._handle, compareFunction));
41+
42+
return compareFunction;
43+
}
44+
45+
internal void SetComparer(LightningTransaction tran, LightningDatabase db)
46+
{
47+
if (Compare == null)
48+
return;
49+
50+
var comparer = Compare.Invoke(new CompareFunctionBuilder());
51+
if (comparer == null)
52+
return;
53+
54+
var nativeComparer = SetNativeCompareFunction(tran, db, comparer);
55+
tran.SubTransactionsManager.StoreComparer(comparer);
56+
}
57+
}
58+
}

src/LightningDB/Factories/DatabaseManager.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,21 +39,19 @@ private static string FromInternalDatabaseName(string name)
3939
return name;
4040
}
4141

42-
private DatabaseHandleCacheEntry OpenDatabaseHandle(string name, LightningTransaction tran, DatabaseOpenFlags? flags)
42+
private DatabaseHandleCacheEntry OpenDatabaseHandle(string name, LightningTransaction tran, DatabaseOpenFlags flags)
4343
{
4444
name = FromInternalDatabaseName(name);
4545

4646
var handle = default(UInt32);
47-
NativeMethods.Execute(lib => lib.mdb_dbi_open(tran._handle, name, flags.Value, out handle));
47+
NativeMethods.Execute(lib => lib.mdb_dbi_open(tran._handle, name, flags, out handle));
4848

49-
return new DatabaseHandleCacheEntry(handle, flags.Value);
49+
return new DatabaseHandleCacheEntry(handle, flags);
5050
}
5151

52-
public LightningDatabase OpenDatabase(string name, LightningTransaction tran, DatabaseOpenFlags? flags, Encoding encoding)
52+
public LightningDatabase OpenDatabase(string name, LightningTransaction tran, DatabaseOpenFlags flags, Encoding encoding)
5353
{
5454
var internalName = ToInternalDatabaseName(name);
55-
if (!flags.HasValue)
56-
flags = LightningConfig.Database.DefaultOpenFlags;
5755

5856
var cacheEntry = _openedDatabases.AddOrUpdate(
5957
internalName,
@@ -65,16 +63,14 @@ public LightningDatabase OpenDatabase(string name, LightningTransaction tran, Da
6563
},
6664
(key, entry) =>
6765
{
68-
if (entry.OpenFlags != flags.Value)
66+
if (entry.OpenFlags != flags)
6967
entry = OpenDatabaseHandle(name, tran, flags);
7068

7169
return entry;
7270
});
7371

7472
_databasesForReuse.Add(cacheEntry.Handle);
7573

76-
encoding = encoding ?? LightningConfig.Database.DefaultEncoding;
77-
7874
return new LightningDatabase(internalName, tran, cacheEntry, encoding);
7975
}
8076

src/LightningDB/Factories/TransactionManager.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class TransactionManager
1616
private readonly ConcurrentDictionary<LightningTransaction, bool> _transactions;
1717

1818
//prevent delegated from being collected by GC by storing them in collection
19-
private readonly ConcurrentDictionary<CompareFunction, bool> _comparatorsStore;
19+
private readonly ConcurrentDictionary<LightningCompareDelegate, bool> _comparatorsStore;
2020

2121
public TransactionManager(LightningEnvironment environment, LightningTransaction parentTransaction)
2222
{
@@ -31,7 +31,7 @@ public TransactionManager(LightningEnvironment environment, LightningTransaction
3131
: IntPtr.Zero;
3232

3333
_transactions = new ConcurrentDictionary<LightningTransaction, bool>();
34-
_comparatorsStore = new ConcurrentDictionary<CompareFunction, bool>();
34+
_comparatorsStore = new ConcurrentDictionary<LightningCompareDelegate, bool>();
3535
}
3636

3737
private void EnsureEnvironmentOpened()
@@ -75,7 +75,7 @@ public void AbortAll()
7575
AbortAll(this);
7676
}
7777

78-
public void StoreComparer(CompareFunction comparer)
78+
public void StoreComparer(LightningCompareDelegate comparer)
7979
{
8080
_comparatorsStore.TryAdd(comparer, true);
8181
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
6+
namespace LightningDB
7+
{
8+
public delegate int LightningCompareDelegate(LightningDatabase db, byte[] left, byte[] right);
9+
}

0 commit comments

Comments
 (0)