Skip to content

Commit 23e233c

Browse files
committed
Added extensions w/o db param using default db opened automatically
Default Encoding and DatabaseOpenFlags added to global config. Some additional refactoring
1 parent 2d7f1e1 commit 23e233c

File tree

6 files changed

+276
-20
lines changed

6 files changed

+276
-20
lines changed

src/LightningDB/DatabaseOpenFlags.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public enum DatabaseOpenFlags
1212
/// No special options.
1313
/// </summary>
1414
None = 0,
15-
15+
1616
/// <summary>
1717
/// MDB_REVERSEKEY. Keys are strings to be compared in reverse order, from the end of the strings to the beginning. By default, Keys are treated as strings and compared from beginning to end.
1818
/// </summary>

src/LightningDB/LightningConfig.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,36 @@ static Environment()
5959
/// </summary>
6060
public static bool AutoReduceMapSizeIn32BitProcess { get; set; }
6161
}
62+
63+
/// <summary>
64+
/// Basic environment conviguration
65+
/// </summary>
66+
public static class Database
67+
{
68+
private static Encoding _defaultEncoding;
69+
70+
static Database()
71+
{
72+
DefaultOpenFlags = DatabaseOpenFlags.None;
73+
DefaultEncoding = Encoding.UTF8;
74+
}
75+
76+
/// <summary>
77+
/// Default database open flags
78+
/// </summary>
79+
public static DatabaseOpenFlags DefaultOpenFlags { get; set; }
80+
81+
public static Encoding DefaultEncoding
82+
{
83+
get { return _defaultEncoding; }
84+
set
85+
{
86+
if (value == null)
87+
throw new ArgumentNullException("value");
88+
89+
_defaultEncoding = value;
90+
}
91+
}
92+
}
6293
}
6394
}

src/LightningDB/LightningDatabase.cs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,31 +19,25 @@ public class LightningDatabase : IDisposable
1919
private readonly string _name;
2020
private bool _shouldDispose;
2121

22-
/// <summary>
23-
/// Creates a LightningDatabase instance.
24-
/// </summary>
25-
/// <param name="name">Database name.</param>
26-
/// <param name="flags">Database open flags.</param>
27-
/// <param name="tran">Active transaction.</param>
28-
public LightningDatabase(string name, DatabaseOpenFlags flags, LightningTransaction tran)
29-
: this (name, flags, tran, Encoding.UTF8)
30-
{
31-
}
32-
3322
/// <summary>
3423
/// Creates a LightningDatabase instance.
3524
/// </summary>
3625
/// <param name="name">Database name.</param>
3726
/// <param name="flags">Database open flags/</param>
3827
/// <param name="tran">Active transaction.</param>
3928
/// <param name="encoding">Default strings encoding.</param>
40-
public LightningDatabase(string name, DatabaseOpenFlags flags, LightningTransaction tran, Encoding encoding)
29+
public LightningDatabase(string name, LightningTransaction tran, DatabaseOpenFlags? flags, Encoding encoding = null)
4130
{
4231
if (tran == null)
4332
throw new ArgumentNullException("tran");
4433

34+
if (!flags.HasValue)
35+
flags = LightningConfig.Database.DefaultOpenFlags;
36+
37+
encoding = encoding ?? LightningConfig.Database.DefaultEncoding;
38+
4539
UInt32 handle = default(UInt32);
46-
NativeMethods.Execute(lib => lib.mdb_dbi_open(tran._handle, name, flags, out handle));
40+
NativeMethods.Execute(lib => lib.mdb_dbi_open(tran._handle, name, flags.Value, out handle));
4741

4842
_name = name ?? DefaultDatabaseName;
4943

@@ -52,10 +46,12 @@ public LightningDatabase(string name, DatabaseOpenFlags flags, LightningTransact
5246

5347
this.IsOpened = true;
5448
this.Encoding = encoding;
55-
this.OpenFlags = flags;
49+
this.OpenFlags = flags.Value;
5650
this.Environment = tran.Environment;
5751
}
5852

53+
internal bool IsReleased { get { return !_shouldDispose; } }
54+
5955
/// <summary>
6056
/// Is database opened.
6157
/// </summary>

src/LightningDB/LightningEnvironment.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Concurrent;
33
using System.Collections.Generic;
4+
using System.Text;
45
using LightningDB.Converters;
56
using LightningDB.Native;
67

@@ -272,20 +273,23 @@ internal void ReleaseDatabase(LightningDatabase db)
272273
}
273274

274275
//TODO: Upgrade db flags?
275-
internal LightningDatabase OpenDatabase(string name, DatabaseOpenFlags flags, LightningTransaction tran)
276+
internal LightningDatabase OpenDatabase(string name, LightningTransaction tran, DatabaseOpenFlags? flags, Encoding encoding)
276277
{
277278
var internalName = name ?? LightningDatabase.DefaultDatabaseName;
278279
var db = _openedDatabases.GetOrAdd(internalName, n =>
279280
{
280-
var ldb = new LightningDatabase(name, flags, tran);
281+
var ldb = new LightningDatabase(name, tran, flags, encoding);
281282
_databasesForReuse.Add(ldb._handle);
282283

283284
return ldb;
284285
});
285286

286-
if (db.OpenFlags != flags)
287+
if (db.OpenFlags != flags.GetValueOrDefault())
287288
throw new InvalidOperationException("Database " + internalName + " already opened with different flags");
288289

290+
if (db.Encoding != (encoding ?? LightningConfig.Database.DefaultEncoding))
291+
throw new InvalidOperationException("Can not change encoding of already opened database");
292+
289293
return db;
290294
}
291295

src/LightningDB/LightningTransaction.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Text;
23
using LightningDB.Native;
34

45
namespace LightningDB
@@ -15,6 +16,8 @@ public class LightningTransaction : IClosingEventSource, IDisposable
1516

1617
internal IntPtr _handle;
1718

19+
private LightningDatabase _defaultDatabase;
20+
1821
/// <summary>
1922
/// Created new instance of LightningTransaction
2023
/// </summary>
@@ -102,10 +105,22 @@ public LightningTransaction BeginTransaction()
102105
/// </summary>
103106
/// <param name="name">Database name (optional). If null then the default name is used.</param>
104107
/// <param name="flags">Database open options (optionsl).</param>
108+
/// <param name="encoding">Database keys encoding.</param>
105109
/// <returns>Created database wrapper.</returns>
106-
public LightningDatabase OpenDatabase(string name = null, DatabaseOpenFlags flags = DatabaseOpenFlags.None)
110+
public LightningDatabase OpenDatabase(string name = null, DatabaseOpenFlags? flags = null, Encoding encoding = null)
107111
{
108-
return this.Environment.OpenDatabase(name, flags, this);
112+
if (name == null && (!flags.HasValue || flags.Value == LightningConfig.Database.DefaultOpenFlags))
113+
{
114+
if (_defaultDatabase == null || _defaultDatabase.IsReleased)
115+
_defaultDatabase = this.Environment.OpenDatabase(name, this, flags, encoding);
116+
117+
if (_defaultDatabase.Encoding != (encoding ?? LightningConfig.Database.DefaultEncoding))
118+
throw new InvalidOperationException("Can not change encoding of already opened database");
119+
120+
return _defaultDatabase;
121+
}
122+
123+
return this.Environment.OpenDatabase(name, this, flags, encoding);
109124
}
110125

111126
/// <summary>

0 commit comments

Comments
 (0)