Lightning.NET is a .NET library that provides a fast and easy-to-use interface to the Lightning Memory-Mapped Database (LMDB), a high-performance key-value store. This library enables .NET developers to leverage LMDB's efficiency and reliability in their applications.
Lightning.NET is available as a NuGet package. To install it, run the following command in the Package Manager Console:
Install-Package LightningDB
Alternatively, you can install it via the .NET CLI:
dotnet add package LightningDB
Here's a simple example demonstrating how to create an environment, open a database, and perform basic put and get operations:
using System; using System.Text; using LightningDB; class Program { static void Main() { // Specify the path to the database environment using var env = new LightningEnvironment("path_to_your_database"); env.Open(); // Begin a transaction and open (or create) a database using (var tx = env.BeginTransaction()) using (var db = tx.OpenDatabase(configuration: new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create })) { // Put a key-value pair into the database tx.Put(db, UTF8.GetBytes("hello"), UTF8.GetBytes("world")); tx.Commit(); } // Begin a read-only transaction to retrieve the value using (var tx = env.BeginTransaction(TransactionBeginFlags.ReadOnly)) using (var db = tx.OpenDatabase()) { var (resultCode, key, value) = tx.Get(db, Encoding.UTF8.GetBytes("hello")); if (resultCode == MDBResultCode.Success) { Console.WriteLine($"{UTF8.GetString(key)}: {UTF8.GetString(value)}"); } else { Console.WriteLine("Key not found."); } } } }
In this example:
LMDB supports storing multiple values for a single key when the database is configured with the Dupsort
flag. Here's how you can work with duplicate keys and use the cursor's NextDuplicate
function:
using System; using System.Text; using LightningDB; class Program { static void Main() { using var env = new LightningEnvironment("path_to_your_database"); env.Open(); // Configure the database to support duplicate keys var dbConfig = new DatabaseConfiguration { Flags = DatabaseOpenFlags.Create | DatabaseOpenFlags.DuplicatesSort }; // Begin a transaction and open the database using (var tx = env.BeginTransaction()) using (var db = tx.OpenDatabase(configuration: dbConfig)) { var key = Encoding.UTF8.GetBytes("fruit"); var value1 = Encoding.UTF8.GetBytes("apple"); var value2 = Encoding.UTF8.GetBytes("cherry"); var value3 = Encoding.UTF8.GetBytes("banana"); // Insert multiple values for the same key tx.Put(db, key, value1); tx.Put(db, key, value2); tx.Put(db, key, value3); tx.Commit(); } // Begin a read-only transaction to retrieve the values using (var tx = env.BeginTransaction(TransactionBeginFlags.ReadOnly)) using (var db = tx.OpenDatabase()) using (var cursor = tx.CreateCursor(db)) { var key = Encoding.UTF8.GetBytes("fruit"); // Position the cursor at the first occurrence of the key var result = cursor.Set(key); if(result == MDBResultCode.Success) { do { var current = cursor.GetCurrent(); var currentKey = current.key.AsSpan(); var currentValue = current.value.AsSpan(); Console.WriteLine($"{UTF8.GetString(currentKey)}: {UTF8.GetString(currentValue)}"); } // Move to the next duplicate value while (cursor.NextDuplicate().resultCode == MDBResultCode.Success); } else { Console.WriteLine("Key not found."); } //Or even simpler var values = cursor.AllValuesFor(key); foreach(var value in values) { Console.WriteLine($"fruit: {Encoding.UTF8.GetString(value.AsSpan())}"); } } } }
In this example:
DupSort
flag to allow multiple values for a single key.For more detailed examples and advanced usage, refer to the unit tests in the Lightning.NET repository.
The Official LMDB API documentation is also a valuable resource for understanding the underlying database engine.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4