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