From 796dc568f62e5ce592bd2b54949a8280f4b982c0 Mon Sep 17 00:00:00 2001 From: Corey Kaylor Date: Tue, 23 Dec 2025 15:04:56 -0500 Subject: [PATCH 1/2] Adding more explicit nullable types --- src/LightningDB.Tests/EnvironmentTests.cs | 8 ++++---- src/LightningDB.Tests/LightningDB.Tests.csproj | 1 + src/LightningDB.Tests/TestBase.cs | 2 +- src/LightningDB.Tests/TestHelperExtensions.cs | 4 ++-- src/LightningDB/DatabaseConfiguration.cs | 8 ++++---- src/LightningDB/LightningDB.csproj | 2 ++ src/LightningDB/LightningDatabase.cs | 4 ++-- src/LightningDB/LightningEnvironment.cs | 10 +++++----- src/LightningDB/LightningExtensions.cs | 8 ++++---- src/LightningDB/LightningTransaction.cs | 10 +++++----- src/LightningDB/LightningVersionInfo.cs | 2 +- src/LightningDB/Native/Lmdb.cs | 4 ++-- 12 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/LightningDB.Tests/EnvironmentTests.cs b/src/LightningDB.Tests/EnvironmentTests.cs index 6eaa820..49a12c1 100644 --- a/src/LightningDB.Tests/EnvironmentTests.cs +++ b/src/LightningDB.Tests/EnvironmentTests.cs @@ -263,7 +263,7 @@ public void can_copy_to_file_stream() var tempFilePath = Path.Combine(TempPath(), "env_copy.mdb"); // Ensure directory exists - Directory.CreateDirectory(Path.GetDirectoryName(tempFilePath)); + Directory.CreateDirectory(Path.GetDirectoryName(tempFilePath)!); // Create a FileStream to the destination file using (var fileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.ReadWrite)) @@ -310,7 +310,7 @@ public void can_copy_with_compaction_to_file_stream() var tempFilePath = Path.Combine(TempPath(), "env_copy_compact.mdb"); // Ensure directory exists - Directory.CreateDirectory(Path.GetDirectoryName(tempFilePath)); + Directory.CreateDirectory(Path.GetDirectoryName(tempFilePath)!); // Create a FileStream to the destination file using (var fileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.ReadWrite)) @@ -360,8 +360,8 @@ public void stream_throws_exception_for_null_argument() using var env = CreateEnvironment(); env.Open(); - // Null FileStream - Should.Throw(() => env.CopyToStream(null)); + // Null FileStream - intentionally passing null to verify exception behavior + Should.Throw(() => env.CopyToStream(null!)); } public void stream_throws_exception_for_read_only_file_stream() diff --git a/src/LightningDB.Tests/LightningDB.Tests.csproj b/src/LightningDB.Tests/LightningDB.Tests.csproj index 864c4ad..895c219 100644 --- a/src/LightningDB.Tests/LightningDB.Tests.csproj +++ b/src/LightningDB.Tests/LightningDB.Tests.csproj @@ -3,6 +3,7 @@ net8.0;net9.0;net10.0 13 + enable LightningDB.Tests LightningDB.Tests true diff --git a/src/LightningDB.Tests/TestBase.cs b/src/LightningDB.Tests/TestBase.cs index 05bd58f..212c7e8 100644 --- a/src/LightningDB.Tests/TestBase.cs +++ b/src/LightningDB.Tests/TestBase.cs @@ -13,7 +13,7 @@ protected string TempPath(string seed = "") Directory.CreateDirectory(path); return path; } - protected LightningEnvironment CreateEnvironment(string path = null, EnvironmentConfiguration config = null) => + protected LightningEnvironment CreateEnvironment(string? path = null, EnvironmentConfiguration? config = null) => new(path ?? TempPath(), config); public static void CleanupSession() diff --git a/src/LightningDB.Tests/TestHelperExtensions.cs b/src/LightningDB.Tests/TestHelperExtensions.cs index 9498b6e..e404955 100644 --- a/src/LightningDB.Tests/TestHelperExtensions.cs +++ b/src/LightningDB.Tests/TestHelperExtensions.cs @@ -31,11 +31,11 @@ public static bool ContainsKey(this LightningTransaction tx, LightningDatabase d return tx.ContainsKey(db, enc.GetBytes(key)); } - public static bool TryGet(this LightningTransaction tx, LightningDatabase db, string key, out string value) + public static bool TryGet(this LightningTransaction tx, LightningDatabase db, string key, out string? value) { var enc = System.Text.Encoding.UTF8; var found = tx.TryGet(db, enc.GetBytes(key), out var result); - value = enc.GetString(result); + value = result is not null ? enc.GetString(result) : null; return found; } diff --git a/src/LightningDB/DatabaseConfiguration.cs b/src/LightningDB/DatabaseConfiguration.cs index ca7a3f5..d825796 100644 --- a/src/LightningDB/DatabaseConfiguration.cs +++ b/src/LightningDB/DatabaseConfiguration.cs @@ -12,8 +12,8 @@ namespace LightningDB; /// public class DatabaseConfiguration { - private IComparer _comparer; - private IComparer _duplicatesComparer; + private IComparer? _comparer; + private IComparer? _duplicatesComparer; public DatabaseConfiguration() { @@ -51,12 +51,12 @@ internal IDisposable ConfigureDatabase(LightningTransaction tx, LightningDatabas private int Compare(ref MDBValue left, ref MDBValue right) { - return _comparer.Compare(left, right); + return _comparer!.Compare(left, right); } private int IsDuplicate(ref MDBValue left, ref MDBValue right) { - return _duplicatesComparer.Compare(left, right); + return _duplicatesComparer!.Compare(left, right); } /// diff --git a/src/LightningDB/LightningDB.csproj b/src/LightningDB/LightningDB.csproj index 44cefc5..8bcdd14 100644 --- a/src/LightningDB/LightningDB.csproj +++ b/src/LightningDB/LightningDB.csproj @@ -6,6 +6,7 @@ Ilya Lukyanov;Corey Kaylor netstandard2.0;net8.0;net9.0;net10.0 14 + enable LightningDB LightningDB lightningdb.png @@ -34,5 +35,6 @@ + diff --git a/src/LightningDB/LightningDatabase.cs b/src/LightningDB/LightningDatabase.cs index 6b15e4b..8d4371a 100644 --- a/src/LightningDB/LightningDatabase.cs +++ b/src/LightningDB/LightningDatabase.cs @@ -24,7 +24,7 @@ public sealed class LightningDatabase : IDisposable /// Active transaction. /// Options for the database, like encoding, option flags, and comparison logic. /// Close database handle on dispose - internal LightningDatabase(string name, LightningTransaction transaction, DatabaseConfiguration configuration, + internal LightningDatabase(string? name, LightningTransaction transaction, DatabaseConfiguration configuration, bool closeOnDispose) { if (transaction == null) @@ -55,7 +55,7 @@ internal LightningDatabase(string name, LightningTransaction transaction, Databa /// /// Database name. /// - public string Name { get; } + public string? Name { get; } /// /// Environment in which the database was opened. diff --git a/src/LightningDB/LightningEnvironment.cs b/src/LightningDB/LightningEnvironment.cs index 10f41f8..4339897 100644 --- a/src/LightningDB/LightningEnvironment.cs +++ b/src/LightningDB/LightningEnvironment.cs @@ -20,8 +20,8 @@ public sealed class LightningEnvironment : IDisposable /// Creates a new instance of LightningEnvironment. /// /// Directory for storing database files. - /// Configuration for the environment. - public LightningEnvironment(string path, EnvironmentConfiguration configuration = null) + /// Configuration for the environment. If null, default configuration is used. + public LightningEnvironment(string path, EnvironmentConfiguration? configuration = null) { if (string.IsNullOrWhiteSpace(path)) throw new ArgumentException("Invalid directory name"); @@ -225,7 +225,7 @@ public void Open(EnvironmentOpenFlags openFlags = EnvironmentOpenFlags.None, Uni /// Cursors may not span transactions; each cursor must be opened and closed within a single transaction. /// /// - /// If this parameter is non-NULL, the new transaction will be a nested transaction, with the transaction indicated by parent as its parent. + /// If this parameter is non-null, the new transaction will be a nested transaction, with the transaction indicated by parent as its parent. /// Transactions may be nested to any level. /// A parent transaction may not issue any other operations besides BeginTransaction, Abort, or Commit while it has active child transactions. /// @@ -235,7 +235,7 @@ public void Open(EnvironmentOpenFlags openFlags = EnvironmentOpenFlags.None, Uni /// /// New LightningTransaction /// - public LightningTransaction BeginTransaction(LightningTransaction parent = null, TransactionBeginFlags beginFlags = LightningTransaction.DefaultTransactionBeginFlags) + public LightningTransaction BeginTransaction(LightningTransaction? parent = null, TransactionBeginFlags beginFlags = LightningTransaction.DefaultTransactionBeginFlags) { if (!IsOpened) throw new InvalidOperationException("Environment must be opened before starting a transaction"); @@ -245,7 +245,7 @@ public LightningTransaction BeginTransaction(LightningTransaction parent = null, /// /// Create a transaction for use with the environment. - /// The transaction handle may be discarded usingAbort() or Commit(). + /// The transaction handle may be discarded using Abort() or Commit(). /// Note: /// Transactions may not span threads; a transaction must only be used by a single thread. Also, a thread may only have a single transaction. /// Cursors may not span transactions; each cursor must be opened and closed within a single transaction. diff --git a/src/LightningDB/LightningExtensions.cs b/src/LightningDB/LightningExtensions.cs index 8288b39..11141ab 100644 --- a/src/LightningDB/LightningExtensions.cs +++ b/src/LightningDB/LightningExtensions.cs @@ -52,7 +52,7 @@ public static (MDBResultCode resultCode, MDBValue key, MDBValue value) ThrowOnRe private static string mdb_strerror(int err) { var ptr = Lmdb.mdb_strerror(err); - return Marshal.PtrToStringAnsi(ptr); + return Marshal.PtrToStringAnsi(ptr) ?? $"Unknown error {err}"; } /// @@ -124,11 +124,11 @@ private static IEnumerable AllValuesForImpl(this LightningCursor curso /// A byte array containing the value found in the database, if it exists. /// True if key exists, false if not. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool TryGet(this LightningTransaction tx, LightningDatabase db, byte[] key, out byte[] value) + public static bool TryGet(this LightningTransaction tx, LightningDatabase db, byte[] key, out byte[]? value) { return TryGet(tx, db, key.AsSpan(), out value); } - + /// /// Tries to get a value by its key. /// @@ -138,7 +138,7 @@ public static bool TryGet(this LightningTransaction tx, LightningDatabase db, by /// A byte array containing the value found in the database, if it exists. /// True if key exists, false if not. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool TryGet(this LightningTransaction tx, LightningDatabase db, ReadOnlySpan key, out byte[] value) + public static bool TryGet(this LightningTransaction tx, LightningDatabase db, ReadOnlySpan key, out byte[]? value) { var (resultCode, _, mdbValue) = tx.Get(db, key); if (resultCode == MDBResultCode.Success) diff --git a/src/LightningDB/LightningTransaction.cs b/src/LightningDB/LightningTransaction.cs index dd53d0a..4067844 100644 --- a/src/LightningDB/LightningTransaction.cs +++ b/src/LightningDB/LightningTransaction.cs @@ -41,7 +41,7 @@ public sealed class LightningTransaction : IDisposable /// Environment. /// Parent transaction or null. /// Transaction open options. - internal LightningTransaction(LightningEnvironment environment, LightningTransaction parent, TransactionBeginFlags flags) + internal LightningTransaction(LightningEnvironment environment, LightningTransaction? parent, TransactionBeginFlags flags) { Environment = environment ?? throw new ArgumentNullException(nameof(environment)); ParentTransaction = parent; @@ -71,11 +71,11 @@ public LightningTransaction BeginTransaction(TransactionBeginFlags beginFlags = /// /// Opens a database in context of this transaction. /// - /// Database name (optional). If null then the default name is used. + /// Database name (optional). If null then the default/unnamed database is used. /// Database open options. /// Close database handle on dispose /// Created database wrapper. - public LightningDatabase OpenDatabase(string name = null, DatabaseConfiguration configuration = null, bool closeOnDispose = false) + public LightningDatabase OpenDatabase(string? name = null, DatabaseConfiguration? configuration = null, bool closeOnDispose = false) { configuration ??= new DatabaseConfiguration(); var db = new LightningDatabase(name, this, configuration, closeOnDispose); @@ -376,7 +376,7 @@ public Stats GetStats(LightningDatabase db) /// /// Parent transaction of this transaction. /// - public LightningTransaction ParentTransaction { get; } + public LightningTransaction? ParentTransaction { get; } /// /// Whether this transaction is read-only. @@ -475,7 +475,7 @@ public override int GetHashCode() return _originalHandle.GetHashCode(); } - public override bool Equals(object obj) + public override bool Equals(object? obj) { var tran = obj as LightningTransaction; return tran != null && _handle.Equals(tran._handle); diff --git a/src/LightningDB/LightningVersionInfo.cs b/src/LightningDB/LightningVersionInfo.cs index 658956a..ce5b73a 100644 --- a/src/LightningDB/LightningVersionInfo.cs +++ b/src/LightningDB/LightningVersionInfo.cs @@ -42,5 +42,5 @@ private LightningVersionInfo() /// /// Version string. /// - public string Version { get; private set; } + public string? Version { get; private set; } } \ No newline at end of file diff --git a/src/LightningDB/Native/Lmdb.cs b/src/LightningDB/Native/Lmdb.cs index f47e79c..5278a3b 100644 --- a/src/LightningDB/Native/Lmdb.cs +++ b/src/LightningDB/Native/Lmdb.cs @@ -168,7 +168,7 @@ public static partial class Lmdb /// A result code indicating success or failure [LibraryImport(MDB_DLL_NAME, StringMarshalling = StringMarshalling.Utf8)] [UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])] - public static partial MDBResultCode mdb_dbi_open(nint txn, string name, DatabaseOpenFlags flags, out uint db); + public static partial MDBResultCode mdb_dbi_open(nint txn, string? name, DatabaseOpenFlags flags, out uint db); /// /// Closes a database handle in the environment. @@ -817,7 +817,7 @@ internal static MDBResultCode mdb_env_open(nint env, string path, EnvironmentOpe /// Address where the database handle will be stored /// A result code indicating success or failure [DllImport(MDB_DLL_NAME, CallingConvention = CallingConvention.Cdecl)] - public static extern MDBResultCode mdb_dbi_open(nint txn, string name, DatabaseOpenFlags flags, out uint db); + public static extern MDBResultCode mdb_dbi_open(nint txn, string? name, DatabaseOpenFlags flags, out uint db); /// /// Closes a database handle in the environment. From 1f019f8234e88f9ab0023029862a9260559f8a2d Mon Sep 17 00:00:00 2001 From: Corey Kaylor Date: Wed, 24 Dec 2025 07:50:55 -0500 Subject: [PATCH 2/2] Adding overloads for non-nullable and no argument for null params --- src/LightningDB.Tests/DatabaseTests.cs | 2 +- src/LightningDB.Tests/EnvironmentTests.cs | 8 +-- src/LightningDB.Tests/TestBase.cs | 2 +- src/LightningDB.Tests/TestHelperExtensions.cs | 4 +- src/LightningDB/LightningEnvironment.cs | 61 ++++++++++++------- src/LightningDB/LightningTransaction.cs | 44 +++++++++++-- 6 files changed, 88 insertions(+), 33 deletions(-) diff --git a/src/LightningDB.Tests/DatabaseTests.cs b/src/LightningDB.Tests/DatabaseTests.cs index ee53b2d..8ef2103 100644 --- a/src/LightningDB.Tests/DatabaseTests.cs +++ b/src/LightningDB.Tests/DatabaseTests.cs @@ -203,7 +203,7 @@ public void can_get_database_flags() // Test default database (should have no special flags) using (var txn = env.BeginTransaction()) { - using var db = txn.OpenDatabase(null, new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create }); + using var db = txn.OpenDatabase(new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create }); var flags = db.GetFlags(txn); flags.ShouldBe(DatabaseOpenFlags.None); diff --git a/src/LightningDB.Tests/EnvironmentTests.cs b/src/LightningDB.Tests/EnvironmentTests.cs index 49a12c1..ff9b25a 100644 --- a/src/LightningDB.Tests/EnvironmentTests.cs +++ b/src/LightningDB.Tests/EnvironmentTests.cs @@ -115,7 +115,7 @@ public void can_put_multiple_key_value_pairs_and_flush_successfully() env.Open(); using var tx = env.BeginTransaction(); - using var db = tx.OpenDatabase(null, new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create }); + using var db = tx.OpenDatabase(new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create }); for (int i = 0; i < 5; i++) { @@ -250,7 +250,7 @@ public void can_copy_to_file_stream() // Add some data to the source environment using (var tx = sourceEnv.BeginTransaction()) - using (var db = tx.OpenDatabase(null, new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create })) + using (var db = tx.OpenDatabase(new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create })) { for (int i = 0; i < 5; i++) { @@ -286,7 +286,7 @@ public void can_copy_with_compaction_to_file_stream() // Add some data to the source environment and then delete half of it to create free space using (var tx = sourceEnv.BeginTransaction()) - using (var db = tx.OpenDatabase(null, new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create })) + using (var db = tx.OpenDatabase(new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create })) { for (int i = 0; i < 10; i++) { @@ -333,7 +333,7 @@ public void can_get_environment_file_stream() // Add some data to make sure the file has content using (var tx = env.BeginTransaction()) - using (var db = tx.OpenDatabase(null, new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create })) + using (var db = tx.OpenDatabase(new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create })) { tx.Put(db, "testkey", "testvalue"); tx.Commit(); diff --git a/src/LightningDB.Tests/TestBase.cs b/src/LightningDB.Tests/TestBase.cs index 212c7e8..79086d5 100644 --- a/src/LightningDB.Tests/TestBase.cs +++ b/src/LightningDB.Tests/TestBase.cs @@ -14,7 +14,7 @@ protected string TempPath(string seed = "") return path; } protected LightningEnvironment CreateEnvironment(string? path = null, EnvironmentConfiguration? config = null) => - new(path ?? TempPath(), config); + config is null ? new(path ?? TempPath()) : new(path ?? TempPath(), config); public static void CleanupSession() { diff --git a/src/LightningDB.Tests/TestHelperExtensions.cs b/src/LightningDB.Tests/TestHelperExtensions.cs index e404955..5fd17a4 100644 --- a/src/LightningDB.Tests/TestHelperExtensions.cs +++ b/src/LightningDB.Tests/TestHelperExtensions.cs @@ -52,7 +52,7 @@ public static void RunCursorScenario(this LightningEnvironment env, DatabaseOpenFlags flags = DatabaseOpenFlags.Create, TransactionBeginFlags transactionFlags = TransactionBeginFlags.None) { using var tx = env.BeginTransaction(transactionFlags); - using var db = tx.OpenDatabase(configuration: new DatabaseConfiguration { Flags = flags }); + using var db = tx.OpenDatabase(new DatabaseConfiguration { Flags = flags }); using var cursor = tx.CreateCursor(db); scenario(tx, db, cursor); } @@ -62,7 +62,7 @@ public static void RunTransactionScenario(this LightningEnvironment env, DatabaseOpenFlags flags = DatabaseOpenFlags.Create, TransactionBeginFlags transactionFlags = TransactionBeginFlags.None) { using var tx = env.BeginTransaction(transactionFlags); - using var db = tx.OpenDatabase(configuration: new DatabaseConfiguration { Flags = flags }); + using var db = tx.OpenDatabase(new DatabaseConfiguration { Flags = flags }); scenario(tx, db); } } \ No newline at end of file diff --git a/src/LightningDB/LightningEnvironment.cs b/src/LightningDB/LightningEnvironment.cs index 4339897..36b3b7a 100644 --- a/src/LightningDB/LightningEnvironment.cs +++ b/src/LightningDB/LightningEnvironment.cs @@ -17,23 +17,37 @@ public sealed class LightningEnvironment : IDisposable internal nint _handle; /// - /// Creates a new instance of LightningEnvironment. + /// Creates a new instance of LightningEnvironment with default configuration. /// /// Directory for storing database files. - /// Configuration for the environment. If null, default configuration is used. - public LightningEnvironment(string path, EnvironmentConfiguration? configuration = null) + public LightningEnvironment(string path) { if (string.IsNullOrWhiteSpace(path)) throw new ArgumentException("Invalid directory name"); - var config = configuration ?? _config; - mdb_env_create(out _handle).ThrowOnError(); - config.Configure(this); - _config = config; + _config.Configure(this); Path = path; + } + /// + /// Creates a new instance of LightningEnvironment. + /// + /// Directory for storing database files. + /// Configuration for the environment. + public LightningEnvironment(string path, EnvironmentConfiguration configuration) + { + if (string.IsNullOrWhiteSpace(path)) + throw new ArgumentException("Invalid directory name"); + if (configuration == null) + throw new ArgumentNullException(nameof(configuration)); + + mdb_env_create(out _handle).ThrowOnError(); + configuration.Configure(this); + _config = configuration; + + Path = path; } /// @@ -218,47 +232,52 @@ public void Open(EnvironmentOpenFlags openFlags = EnvironmentOpenFlags.None, Uni } /// - /// Create a transaction for use with the environment. + /// Create a top-level transaction for use with the environment. /// The transaction handle may be discarded using Abort() or Commit(). /// Note: /// Transactions may not span threads; a transaction must only be used by a single thread. Also, a thread may only have a single transaction. /// Cursors may not span transactions; each cursor must be opened and closed within a single transaction. /// - /// - /// If this parameter is non-null, the new transaction will be a nested transaction, with the transaction indicated by parent as its parent. - /// Transactions may be nested to any level. - /// A parent transaction may not issue any other operations besides BeginTransaction, Abort, or Commit while it has active child transactions. - /// /// /// Special options for this transaction. /// /// /// New LightningTransaction /// - public LightningTransaction BeginTransaction(LightningTransaction? parent = null, TransactionBeginFlags beginFlags = LightningTransaction.DefaultTransactionBeginFlags) + public LightningTransaction BeginTransaction(TransactionBeginFlags beginFlags = LightningTransaction.DefaultTransactionBeginFlags) { - if (!IsOpened) - throw new InvalidOperationException("Environment must be opened before starting a transaction"); - - return new LightningTransaction(this, parent, beginFlags); + return BeginTransactionImpl(null, beginFlags); } /// - /// Create a transaction for use with the environment. + /// Create a nested transaction for use with the environment. /// The transaction handle may be discarded using Abort() or Commit(). /// Note: /// Transactions may not span threads; a transaction must only be used by a single thread. Also, a thread may only have a single transaction. /// Cursors may not span transactions; each cursor must be opened and closed within a single transaction. /// + /// + /// The parent transaction. The new transaction will be a nested transaction. + /// Transactions may be nested to any level. + /// A parent transaction may not issue any other operations besides BeginTransaction, Abort, or Commit while it has active child transactions. + /// /// /// Special options for this transaction. /// /// /// New LightningTransaction /// - public LightningTransaction BeginTransaction(TransactionBeginFlags beginFlags) + public LightningTransaction BeginTransaction(LightningTransaction parent, TransactionBeginFlags beginFlags = LightningTransaction.DefaultTransactionBeginFlags) + { + return BeginTransactionImpl(parent, beginFlags); + } + + private LightningTransaction BeginTransactionImpl(LightningTransaction? parent, TransactionBeginFlags beginFlags) { - return BeginTransaction(null, beginFlags); + if (!IsOpened) + throw new InvalidOperationException("Environment must be opened before starting a transaction"); + + return new LightningTransaction(this, parent, beginFlags); } /// diff --git a/src/LightningDB/LightningTransaction.cs b/src/LightningDB/LightningTransaction.cs index 4067844..20afd6e 100644 --- a/src/LightningDB/LightningTransaction.cs +++ b/src/LightningDB/LightningTransaction.cs @@ -69,15 +69,51 @@ public LightningTransaction BeginTransaction(TransactionBeginFlags beginFlags = } /// - /// Opens a database in context of this transaction. + /// Opens the default (unnamed) database in context of this transaction with default configuration. + /// + /// Close database handle on dispose + /// Created database wrapper. + public LightningDatabase OpenDatabase(bool closeOnDispose = false) + { + return OpenDatabaseImpl(null, new DatabaseConfiguration(), closeOnDispose); + } + + /// + /// Opens the default (unnamed) database in context of this transaction. /// - /// Database name (optional). If null then the default/unnamed database is used. /// Database open options. /// Close database handle on dispose /// Created database wrapper. - public LightningDatabase OpenDatabase(string? name = null, DatabaseConfiguration? configuration = null, bool closeOnDispose = false) + public LightningDatabase OpenDatabase(DatabaseConfiguration configuration, bool closeOnDispose = false) + { + return OpenDatabaseImpl(null, configuration, closeOnDispose); + } + + /// + /// Opens a named database in context of this transaction with default configuration. + /// + /// Database name. + /// Close database handle on dispose + /// Created database wrapper. + public LightningDatabase OpenDatabase(string name, bool closeOnDispose = false) + { + return OpenDatabaseImpl(name, new DatabaseConfiguration(), closeOnDispose); + } + + /// + /// Opens a named database in context of this transaction. + /// + /// Database name. + /// Database open options. + /// Close database handle on dispose + /// Created database wrapper. + public LightningDatabase OpenDatabase(string name, DatabaseConfiguration configuration, bool closeOnDispose = false) + { + return OpenDatabaseImpl(name, configuration, closeOnDispose); + } + + private LightningDatabase OpenDatabaseImpl(string? name, DatabaseConfiguration configuration, bool closeOnDispose) { - configuration ??= new DatabaseConfiguration(); var db = new LightningDatabase(name, this, configuration, closeOnDispose); return db; }