Skip to content

Commit 796dc56

Browse files
committed
Adding more explicit nullable types
1 parent b8a00ef commit 796dc56

12 files changed

+33
-30
lines changed

src/LightningDB.Tests/EnvironmentTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ public void can_copy_to_file_stream()
263263
var tempFilePath = Path.Combine(TempPath(), "env_copy.mdb");
264264

265265
// Ensure directory exists
266-
Directory.CreateDirectory(Path.GetDirectoryName(tempFilePath));
266+
Directory.CreateDirectory(Path.GetDirectoryName(tempFilePath)!);
267267

268268
// Create a FileStream to the destination file
269269
using (var fileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.ReadWrite))
@@ -310,7 +310,7 @@ public void can_copy_with_compaction_to_file_stream()
310310
var tempFilePath = Path.Combine(TempPath(), "env_copy_compact.mdb");
311311

312312
// Ensure directory exists
313-
Directory.CreateDirectory(Path.GetDirectoryName(tempFilePath));
313+
Directory.CreateDirectory(Path.GetDirectoryName(tempFilePath)!);
314314

315315
// Create a FileStream to the destination file
316316
using (var fileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.ReadWrite))
@@ -360,8 +360,8 @@ public void stream_throws_exception_for_null_argument()
360360
using var env = CreateEnvironment();
361361
env.Open();
362362

363-
// Null FileStream
364-
Should.Throw<ArgumentNullException>(() => env.CopyToStream(null));
363+
// Null FileStream - intentionally passing null to verify exception behavior
364+
Should.Throw<ArgumentNullException>(() => env.CopyToStream(null!));
365365
}
366366

367367
public void stream_throws_exception_for_read_only_file_stream()

src/LightningDB.Tests/LightningDB.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<PropertyGroup>
44
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
55
<LangVersion>13</LangVersion>
6+
<Nullable>enable</Nullable>
67
<AssemblyName>LightningDB.Tests</AssemblyName>
78
<PackageId>LightningDB.Tests</PackageId>
89
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>

src/LightningDB.Tests/TestBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ protected string TempPath(string seed = "")
1313
Directory.CreateDirectory(path);
1414
return path;
1515
}
16-
protected LightningEnvironment CreateEnvironment(string path = null, EnvironmentConfiguration config = null) =>
16+
protected LightningEnvironment CreateEnvironment(string? path = null, EnvironmentConfiguration? config = null) =>
1717
new(path ?? TempPath(), config);
1818

1919
public static void CleanupSession()

src/LightningDB.Tests/TestHelperExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ public static bool ContainsKey(this LightningTransaction tx, LightningDatabase d
3131
return tx.ContainsKey(db, enc.GetBytes(key));
3232
}
3333

34-
public static bool TryGet(this LightningTransaction tx, LightningDatabase db, string key, out string value)
34+
public static bool TryGet(this LightningTransaction tx, LightningDatabase db, string key, out string? value)
3535
{
3636
var enc = System.Text.Encoding.UTF8;
3737
var found = tx.TryGet(db, enc.GetBytes(key), out var result);
38-
value = enc.GetString(result);
38+
value = result is not null ? enc.GetString(result) : null;
3939
return found;
4040
}
4141

src/LightningDB/DatabaseConfiguration.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ namespace LightningDB;
1212
/// </summary>
1313
public class DatabaseConfiguration
1414
{
15-
private IComparer<MDBValue> _comparer;
16-
private IComparer<MDBValue> _duplicatesComparer;
15+
private IComparer<MDBValue>? _comparer;
16+
private IComparer<MDBValue>? _duplicatesComparer;
1717

1818
public DatabaseConfiguration()
1919
{
@@ -51,12 +51,12 @@ internal IDisposable ConfigureDatabase(LightningTransaction tx, LightningDatabas
5151

5252
private int Compare(ref MDBValue left, ref MDBValue right)
5353
{
54-
return _comparer.Compare(left, right);
54+
return _comparer!.Compare(left, right);
5555
}
5656

5757
private int IsDuplicate(ref MDBValue left, ref MDBValue right)
5858
{
59-
return _duplicatesComparer.Compare(left, right);
59+
return _duplicatesComparer!.Compare(left, right);
6060
}
6161

6262
/// <summary>

src/LightningDB/LightningDB.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<Authors>Ilya Lukyanov;Corey Kaylor</Authors>
77
<TargetFrameworks>netstandard2.0;net8.0;net9.0;net10.0</TargetFrameworks>
88
<LangVersion>14</LangVersion>
9+
<Nullable>enable</Nullable>
910
<AssemblyName>LightningDB</AssemblyName>
1011
<PackageId>LightningDB</PackageId>
1112
<PackageIcon>lightningdb.png</PackageIcon>
@@ -34,5 +35,6 @@
3435

3536
<ItemGroup>
3637
<PackageReference Include="System.Memory" Version="4.6.0" Condition="'$(TargetFramework)' == 'netstandard2.0'" />
38+
<PackageReference Include="PolySharp" Version="1.14.1" PrivateAssets="all" Condition="'$(TargetFramework)' == 'netstandard2.0'" />
3739
</ItemGroup>
3840
</Project>

src/LightningDB/LightningDatabase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public sealed class LightningDatabase : IDisposable
2424
/// <param name="transaction">Active transaction.</param>
2525
/// <param name="configuration">Options for the database, like encoding, option flags, and comparison logic.</param>
2626
/// <param name="closeOnDispose">Close database handle on dispose</param>
27-
internal LightningDatabase(string name, LightningTransaction transaction, DatabaseConfiguration configuration,
27+
internal LightningDatabase(string? name, LightningTransaction transaction, DatabaseConfiguration configuration,
2828
bool closeOnDispose)
2929
{
3030
if (transaction == null)
@@ -55,7 +55,7 @@ internal LightningDatabase(string name, LightningTransaction transaction, Databa
5555
/// <summary>
5656
/// Database name.
5757
/// </summary>
58-
public string Name { get; }
58+
public string? Name { get; }
5959

6060
/// <summary>
6161
/// Environment in which the database was opened.

src/LightningDB/LightningEnvironment.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ public sealed class LightningEnvironment : IDisposable
2020
/// Creates a new instance of LightningEnvironment.
2121
/// </summary>
2222
/// <param name="path">Directory for storing database files.</param>
23-
/// <param name="configuration">Configuration for the environment.</param>
24-
public LightningEnvironment(string path, EnvironmentConfiguration configuration = null)
23+
/// <param name="configuration">Configuration for the environment. If null, default configuration is used.</param>
24+
public LightningEnvironment(string path, EnvironmentConfiguration? configuration = null)
2525
{
2626
if (string.IsNullOrWhiteSpace(path))
2727
throw new ArgumentException("Invalid directory name");
@@ -225,7 +225,7 @@ public void Open(EnvironmentOpenFlags openFlags = EnvironmentOpenFlags.None, Uni
225225
/// Cursors may not span transactions; each cursor must be opened and closed within a single transaction.
226226
/// </summary>
227227
/// <param name="parent">
228-
/// If this parameter is non-NULL, the new transaction will be a nested transaction, with the transaction indicated by parent as its parent.
228+
/// If this parameter is non-null, the new transaction will be a nested transaction, with the transaction indicated by parent as its parent.
229229
/// Transactions may be nested to any level.
230230
/// A parent transaction may not issue any other operations besides BeginTransaction, Abort, or Commit while it has active child transactions.
231231
/// </param>
@@ -235,7 +235,7 @@ public void Open(EnvironmentOpenFlags openFlags = EnvironmentOpenFlags.None, Uni
235235
/// <returns>
236236
/// New LightningTransaction
237237
/// </returns>
238-
public LightningTransaction BeginTransaction(LightningTransaction parent = null, TransactionBeginFlags beginFlags = LightningTransaction.DefaultTransactionBeginFlags)
238+
public LightningTransaction BeginTransaction(LightningTransaction? parent = null, TransactionBeginFlags beginFlags = LightningTransaction.DefaultTransactionBeginFlags)
239239
{
240240
if (!IsOpened)
241241
throw new InvalidOperationException("Environment must be opened before starting a transaction");
@@ -245,7 +245,7 @@ public LightningTransaction BeginTransaction(LightningTransaction parent = null,
245245

246246
/// <summary>
247247
/// Create a transaction for use with the environment.
248-
/// The transaction handle may be discarded usingAbort() or Commit().
248+
/// The transaction handle may be discarded using Abort() or Commit().
249249
/// Note:
250250
/// Transactions may not span threads; a transaction must only be used by a single thread. Also, a thread may only have a single transaction.
251251
/// Cursors may not span transactions; each cursor must be opened and closed within a single transaction.

src/LightningDB/LightningExtensions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static (MDBResultCode resultCode, MDBValue key, MDBValue value) ThrowOnRe
5252
private static string mdb_strerror(int err)
5353
{
5454
var ptr = Lmdb.mdb_strerror(err);
55-
return Marshal.PtrToStringAnsi(ptr);
55+
return Marshal.PtrToStringAnsi(ptr) ?? $"Unknown error {err}";
5656
}
5757

5858
/// <summary>
@@ -124,11 +124,11 @@ private static IEnumerable<MDBValue> AllValuesForImpl(this LightningCursor curso
124124
/// <param name="value">A byte array containing the value found in the database, if it exists.</param>
125125
/// <returns>True if key exists, false if not.</returns>
126126
[MethodImpl(MethodImplOptions.AggressiveInlining)]
127-
public static bool TryGet(this LightningTransaction tx, LightningDatabase db, byte[] key, out byte[] value)
127+
public static bool TryGet(this LightningTransaction tx, LightningDatabase db, byte[] key, out byte[]? value)
128128
{
129129
return TryGet(tx, db, key.AsSpan(), out value);
130130
}
131-
131+
132132
/// <summary>
133133
/// Tries to get a value by its key.
134134
/// </summary>
@@ -138,7 +138,7 @@ public static bool TryGet(this LightningTransaction tx, LightningDatabase db, by
138138
/// <param name="value">A byte array containing the value found in the database, if it exists.</param>
139139
/// <returns>True if key exists, false if not.</returns>
140140
[MethodImpl(MethodImplOptions.AggressiveInlining)]
141-
public static bool TryGet(this LightningTransaction tx, LightningDatabase db, ReadOnlySpan<byte> key, out byte[] value)
141+
public static bool TryGet(this LightningTransaction tx, LightningDatabase db, ReadOnlySpan<byte> key, out byte[]? value)
142142
{
143143
var (resultCode, _, mdbValue) = tx.Get(db, key);
144144
if (resultCode == MDBResultCode.Success)

src/LightningDB/LightningTransaction.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public sealed class LightningTransaction : IDisposable
4141
/// <param name="environment">Environment.</param>
4242
/// <param name="parent">Parent transaction or null.</param>
4343
/// <param name="flags">Transaction open options.</param>
44-
internal LightningTransaction(LightningEnvironment environment, LightningTransaction parent, TransactionBeginFlags flags)
44+
internal LightningTransaction(LightningEnvironment environment, LightningTransaction? parent, TransactionBeginFlags flags)
4545
{
4646
Environment = environment ?? throw new ArgumentNullException(nameof(environment));
4747
ParentTransaction = parent;
@@ -71,11 +71,11 @@ public LightningTransaction BeginTransaction(TransactionBeginFlags beginFlags =
7171
/// <summary>
7272
/// Opens a database in context of this transaction.
7373
/// </summary>
74-
/// <param name="name">Database name (optional). If null then the default name is used.</param>
74+
/// <param name="name">Database name (optional). If null then the default/unnamed database is used.</param>
7575
/// <param name="configuration">Database open options.</param>
7676
/// <param name="closeOnDispose">Close database handle on dispose</param>
7777
/// <returns>Created database wrapper.</returns>
78-
public LightningDatabase OpenDatabase(string name = null, DatabaseConfiguration configuration = null, bool closeOnDispose = false)
78+
public LightningDatabase OpenDatabase(string? name = null, DatabaseConfiguration? configuration = null, bool closeOnDispose = false)
7979
{
8080
configuration ??= new DatabaseConfiguration();
8181
var db = new LightningDatabase(name, this, configuration, closeOnDispose);
@@ -376,7 +376,7 @@ public Stats GetStats(LightningDatabase db)
376376
/// <summary>
377377
/// Parent transaction of this transaction.
378378
/// </summary>
379-
public LightningTransaction ParentTransaction { get; }
379+
public LightningTransaction? ParentTransaction { get; }
380380

381381
/// <summary>
382382
/// Whether this transaction is read-only.
@@ -475,7 +475,7 @@ public override int GetHashCode()
475475
return _originalHandle.GetHashCode();
476476
}
477477

478-
public override bool Equals(object obj)
478+
public override bool Equals(object? obj)
479479
{
480480
var tran = obj as LightningTransaction;
481481
return tran != null && _handle.Equals(tran._handle);

0 commit comments

Comments
 (0)