Skip to content

v0.21.0

Latest

Choose a tag to compare

@CoreyKaylor CoreyKaylor released this 24 Dec 13:28
· 2 commits to main since this release

Breaking Changes

API Signature Changes (nullable annotations and overload refactoring):

  • LightningEnvironment.BeginTransaction() - The parent parameter is no longer a nullable default. Use:
    • BeginTransaction() or BeginTransaction(TransactionBeginFlags) for top-level transactions
    • BeginTransaction(LightningTransaction parent, ...) for nested transactions
  • LightningTransaction.OpenDatabase() - Refactored from single method with nullable defaults to explicit overloads:
    • OpenDatabase() - default unnamed database
    • OpenDatabase(DatabaseConfiguration) - unnamed with config
    • OpenDatabase(string name) - named database
    • OpenDatabase(string name, DatabaseConfiguration) - named with config
  • LightningEnvironment constructor - Now requires explicit overload:
    • LightningEnvironment(string path) - default config
    • LightningEnvironment(string path, EnvironmentConfiguration) - custom config (no longer nullable)
  • ParentTransaction property is now explicitly nullable (LightningTransaction?)
  • TryGet extension now returns string? for the out parameter

MDBValue is now a readonly struct - This improves performance but may affect code that mutated the struct.

New Features

Built-in Comparers (LightningDB.Comparers namespace):

  • BitwiseComparer / ReverseBitwiseComparer - Lexicographic byte comparison
  • SignedIntegerComparer / ReverseSignedIntegerComparer - 4/8-byte signed integers
  • UnsignedIntegerComparer / ReverseUnsignedIntegerComparer - 4/8-byte unsigned integers
  • Utf8StringComparer / ReverseUtf8StringComparer - Ordinal UTF-8 strings
  • LengthComparer / ReverseLengthComparer - Sort by length first, then content
  • LengthOnlyComparer - Sort by length only
  • GuidComparer / ReverseGuidComparer - Optimized 16-byte GUID comparison
  • HashCodeComparer - Hash-based comparison for large values

MDBValue Enhancements (thanks @sebastienros ):

  • Read() - Read unmanaged type directly from buffer
  • Cast() - Cast buffer to ReadOnlySpan
  • CopyTo(Span) - Copy buffer contents
  • AsWritableSpan() - Get writable span

Performance Improvements

  • MDBValue optimized with [MethodImpl(MethodImplOptions.AggressiveInlining)]
  • [SkipLocalsInit] attribute on .NET 5+ for reduced initialization overhead
  • Optimized span creation using MemoryMarshal.CreateReadOnlySpan

Infrastructure

  • Added GitHub Actions benchmark workflows for performance regression tracking