BTDB 34.1.5

dotnet add package BTDB --version 34.1.5
                    
NuGet\Install-Package BTDB -Version 34.1.5
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="BTDB" Version="34.1.5" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="BTDB" Version="34.1.5" />
                    
Directory.Packages.props
<PackageReference Include="BTDB" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add BTDB --version 34.1.5
                    
#r "nuget: BTDB, 34.1.5"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package BTDB@34.1.5
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=BTDB&version=34.1.5
                    
Install as a Cake Addin
#tool nuget:?package=BTDB&version=34.1.5
                    
Install as a Cake Tool

BTDB

BTDB Logo

Currently this project these parts:

  • Key Value Database
  • Wrapped Dynamic IL generation with debugging + extensions
  • IOC Container (SourceGenerator based)
  • Object Database with Relations
  • Snappy Compression
  • Event Storage
  • Bon (Binary object notation)
  • Incremental SourceGenerator for IOC Container factory generation

All code written in C# 12 and licensed under very permissive MIT license. Targeting .Net 9.0, main code has just 2 dependencies (Microsoft.Extensions.Primitives, Microsoft.Extensions.ObjectPool). Code is tested using xUnit Framework. Used in production on Windows and Linux, on MacOS works as well. Please is you find it useful or have questions, write me e-mail boris.letocha@gmail.com so I know that it is used. It is available in Nuget http://www.nuget.org/packages/BTDB. Source code drops are Github releases.


Breaking changes

33.9.0

ObjectDB

Removed method RelationInfo.GetProperties(Type type) which was used a long time ago to support so-called "apart fields". It returns an empty list, so it should be easy to remove.

33.0.0

KeyValueDB

Nearly all IKeyValueDBTransaction methods moved into IKeyValueDBCursor. IKeyValueDBTransaction has method CreateCursor() to create IKeyValueDBCursor. Created cursor must not be used after transaction Commit. And all cursors must be disposed before transaction is disposed. It makes implementation of custom transaction wrappers more difficult, look at KeyValueDBTransactionWithCount for example.

ObjectDB

Positive breaking change is that DB could be modified in parallel to enumeration. It is possible due to KeyValueDB has now Cursors which correctly update their position even when DB is modified. It is even possible to delete current object in enumeration and enumeration will still continue correctly. Relations cannot return IEnumerator<T> anymore, it must be replaced by IEnumerable<T>. Also IOrderedDictionaryEnumerator is now inherited from IDisposable and must be disposed. Forgetting dispose will cause exception during transaction disposal.


Key Value Database

Features

  • This is Key Value store written in C# with implementation on native heap (has also prefix compression). InMemory version uses managed heap.
  • It is easily embeddable.
  • One storage is just one directory.
  • It has ACID properties with MVCC.
  • At one time there could be multiple read only transactions and one read/write transaction.
  • Export/Import to stream - could be used for compaction, snapshotting
  • Automatic compaction
  • Customizable compression (key index file could be Brotli compressed)
  • Relatively Fast DB Open due to key index file - though it still needs to load all keys to memory
  • Inspired by Bitcask [https://github.com/basho/bitcask/blob/develop/doc/bitcask-intro.pdf]

Design limits

  • All keys data needs to fit in RAM
  • Maximum Key length is limited by 31bits (2GB).
  • Maximum value length is limited by 31bits (2GB).

Sample code

using (var fileCollection = new InMemoryFileCollection())
using (IKeyValueDB db = new KeyValueDB(fileCollection))
{
    using (var tr = db.StartTransaction())
    {
        tr.CreateOrUpdateKeyValue(new byte[] { 1 }, new byte[100000]);
        tr.Commit();
    }
}

Roadmap

  • Everything is there just use it

Wrapped Dynamic IL generation with debugging + extensions

This help you to write fluent code which generates IL code in runtime. It is used in Object Database part.

Sample code

var method = ILBuilder.Instance.NewMethod<Func<Nested>>("SampleCall");
var il = method.Generator;
var local = il.DeclareLocal(typeof(Nested), "n");
il
    .Newobj(() => new Nested())
    .Dup()
    .Stloc(local)
    .Ldstr("Test")
    .Call(() => ((Nested)null).Fun(""))
    .Ldloc(local)
    .Ret();
var action = method.Create();

Roadmap

  • Add support for all IL instructions as needed
  • Deprecate this by replacing its usages by Source Generator

Object Database

Features

  • Builds on top of Key Value Database and Reflection.Emit extensions.
  • It stores Plain .Net Objects and only their public properties with getters and setters.
  • All ACID and MVCC properties are preserved of course.
  • Automatic upgrading of model on read with dynamically generated optimal IL code.
  • Automatic versioning of model changes.
  • Enumeration of all objects
  • Each object type could store its "singleton" - very useful for root objects
  • Relations - Table with primary key and multiple secondary keys
  • By default objects are stored inline in parent object, use IIndirect for objects with Oid which will load lazily

Documentation: [https://github.com/Bobris/BTDB/blob/master/Doc/ODBDictionary.md]

Relations doc: [https://github.com/Bobris/BTDB/blob/master/Doc/Relations.md]

Sample code

public class Person
{
    public string Name { get; set; }
    public uint Age { get; set; }
}

using (var tr = _db.StartTransaction())
{
    tr.Store(new Person { Name = "Bobris", Age = 35 });
    tr.Commit();
}
using (var tr = _db.StartTransaction())
{
    var p = tr.Enumerate<Person>().First();
    Assert.AreEqual("Bobris", p.Name);
    Assert.AreEqual(35, p.Age);
}

Roadmap

  • Support more types of properties
  • Free text search (far future if ever)

Event storage

Features

  • Optimal serialization with metadata
  • Deserialization also to dynamic
  • Storage is transactional
  • As storage could be used Azure Page Blobs
  • EventStorage2 is specialized to be used with Kafka, metadata are stored in separate topic

Bon

Bon Binary object notation is allows creating and reading JavaScript/C# values with extensions like Dictionary/Map into binary notation. It is much faster to parse, write, skip, search by keys than JSON, size will be also smaller in most cases, in some cases much more smaller.


Snappy Compression

Features

  • Ported and inspired mainly by Go version of Snappy Compression [http://code.google.com/p/snappy/]
  • Fully compatible with original
  • Fully managed and safe implementation
  • Compression is aborted when target buffer size is not big enough

Roadmap

  • Some speed optimizations around Spans would help
Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on BTDB:

Package Downloads
Bbcore.Lib

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
34.1.5 47 2/8/2026
34.1.4 50 2/8/2026
34.1.3 90 2/2/2026
34.1.2 81 2/1/2026
34.1.1 94 2/1/2026
34.1.0 93 1/25/2026
34.0.6 90 1/18/2026
34.0.5 86 1/18/2026
34.0.4 88 1/18/2026
34.0.3 85 1/18/2026
34.0.2 91 1/18/2026
34.0.1 87 1/18/2026
34.0.0 100 1/12/2026
33.8.3 2,688 6/1/2025
33.8.2 321 5/27/2025
33.8.1 232 5/26/2025
33.8.0 232 5/26/2025
33.7.3 228 5/25/2025
33.7.2 555 5/12/2025
33.7.1 376 5/6/2025
33.7.0 289 4/29/2025
33.6.9 20,587 11/7/2025
33.6.8 288 6/9/2025
33.6.7 77,324 5/27/2025
33.6.6 213 5/25/2025
33.6.5 11,605 5/12/2025
33.6.4 14,861 4/28/2025
33.6.3 4,178 4/16/2025
33.6.2 2,957 4/11/2025
33.6.1 246 4/10/2025
33.6.0 277 4/10/2025
33.5.0 20,184 4/6/2025
33.4.4 4,292 3/30/2025
33.4.3 1,196 3/27/2025
33.4.2 232 3/26/2025
33.4.1 216 3/21/2025
33.4.0 239 3/20/2025
33.3.0 1,148 2/24/2025
33.2.0 199 2/13/2025
33.1.3 28,096 1/14/2025
33.1.2 229 1/14/2025
33.1.1 223 1/14/2025
33.1.0 219 1/13/2025
33.0.7 239 1/13/2025
33.0.6 230 1/13/2025
33.0.5 167 1/13/2025
33.0.4 193 1/12/2025
33.0.3 234 1/9/2025
33.0.2 189 1/9/2025
33.0.1 183 1/7/2025
33.0.0 223 1/3/2025
32.17.0 52,386 12/17/2024
32.16.4 31,576 11/6/2024
32.16.3 417 10/25/2024
32.16.2 11,644 10/14/2024
32.16.1 13,092 10/11/2024
32.16.0 17,169 10/4/2024
32.15.1 843 8/29/2024
32.15.0 215 8/29/2024
32.14.1 1,553 8/17/2024
32.14.0 225 8/4/2024
32.13.1 30,581 7/31/2024
32.13.0 2,174 7/26/2024
32.12.1 391 7/21/2024
32.12.0 265 7/18/2024
32.11.0 4,105 7/6/2024
32.10.0 4,857 6/20/2024
32.9.0 268 6/15/2024
32.8.0 10,127 6/14/2024
32.7.1 17,592 5/15/2024
32.7.0 206 5/14/2024
32.6.2 3,740 5/6/2024
32.6.1 212 5/6/2024
32.6.0 286 5/1/2024
32.5.0 54,587 2/29/2024
32.4.29 552 2/26/2024
32.4.28 212 2/26/2024
32.4.26 17,992 2/21/2024
32.4.25 2,152 2/20/2024
32.4.24 614 2/19/2024
32.4.23 3,654 2/14/2024
32.4.22 236 2/13/2024
32.4.21 3,954 2/12/2024
32.4.20 370 2/7/2024
32.4.19 256 2/7/2024
32.4.18 364 2/1/2024
32.4.17 207 1/31/2024
32.4.16 204 1/30/2024
32.4.15 343 1/29/2024
32.4.14 227 1/29/2024
32.4.13 202 1/27/2024
32.4.12 203 1/26/2024
32.4.11 241 1/26/2024
32.4.10 225 1/26/2024
32.4.9 215 1/26/2024
32.4.8 201 1/26/2024
32.4.7 195 1/25/2024
32.4.6 223 1/25/2024
32.4.5 229 1/25/2024
32.4.4 183 1/24/2024
32.4.3 207 1/23/2024
32.4.2 200 1/23/2024
32.4.1 210 1/22/2024
32.4.0 222 1/21/2024
32.3.2 246 1/19/2024
32.3.1 182 1/18/2024
32.3.0 224 1/18/2024
32.2.0 248 1/17/2024
32.1.0 223 1/14/2024
32.0.3 246 1/8/2024
32.0.2 709 1/2/2024
32.0.1 212 1/2/2024
32.0.0 259 1/1/2024
31.15.0 9,918 1/22/2024
31.14.0 24,128 11/23/2023
31.13.0 4,478 11/21/2023
31.12.7 1,743 11/16/2023
31.12.6 366 11/16/2023
31.12.5 321 11/13/2023 31.12.5 is deprecated because it has critical bugs.
31.12.4 737 11/12/2023
31.12.3 9,003 10/30/2023
31.12.2 4,757 10/16/2023
31.12.1 5,216 10/5/2023
31.12.0 355 9/17/2023
31.11.3 30,241 8/10/2023
31.11.2 299 8/9/2023
31.11.1 299 8/8/2023
31.11.0 5,068 8/8/2023
31.10.0 1,177 8/3/2023
31.9.0 325 8/1/2023
31.8.2 2,850 8/1/2023
31.8.1 287 8/1/2023
31.8.0 25,149 6/8/2023
31.7.0 10,439 5/23/2023
31.6.0 345 5/21/2023
31.5.2 1,829 5/16/2023
31.5.1 17,801 4/13/2023
31.5.0 9,037 3/28/2023
31.4.3 3,841 3/24/2023
31.4.2 3,954 3/21/2023
31.4.1 427 3/21/2023
31.4.0 468 3/21/2023
31.3.2 17,200 2/20/2023
31.3.1 776 2/17/2023
31.3.0 426 2/15/2023
31.2.1 468 2/15/2023
31.2.0 2,154 2/15/2023
31.1.1 27,291 2/4/2023
31.1.0 493 2/3/2023
31.0.0 505 2/3/2023
30.5.0 14,065 1/10/2023
30.4.0 725 1/9/2023
30.3.0 6,927 1/3/2023
30.2.2 10,513 1/2/2023
30.2.1 566 1/2/2023
30.2.0 598 1/1/2023
30.1.0 499 12/21/2022
30.0.0 23,216 11/14/2022
29.12.1 621 11/3/2022
29.12.0 1,062 11/2/2022
29.11.0 682 9/7/2022
29.10.1 686 8/1/2022
29.10.0 673 8/1/2022
29.9.1 698 7/22/2022
29.9.0 703 7/17/2022
29.8.0 735 6/13/2022
29.7.0 699 6/8/2022
29.6.0 715 6/5/2022
29.5.0 717 5/18/2022
29.4.0 715 5/17/2022
29.3.0 737 5/13/2022
29.2.0 721 5/3/2022
29.1.1 8,935 3/29/2022
29.1.0 708 3/28/2022
29.0.0 747 2/28/2022
28.3.2 796 1/21/2022
28.3.1 751 1/21/2022
28.3.0 602 1/4/2022
28.2.0 576 12/19/2021
28.1.2 638 12/7/2021
28.1.1 549 12/6/2021
28.1.0 591 11/29/2021
28.0.0 608 11/17/2021
27.0.3 636 11/17/2021
27.0.2 1,920 11/7/2021
27.0.0 602 11/2/2021
26.2.1 886 5/8/2021
24.0.2 21,432 6/15/2020
24.0.1 999 6/13/2020
24.0.0 858 6/13/2020
23.1.0 1,044 5/23/2020
23.0.0 885 5/18/2020
22.2.2 898 5/14/2020
22.2.1 880 5/14/2020
22.2.0 858 5/13/2020
22.1.0 876 5/12/2020
22.0.0 892 5/10/2020
21.0.0 920 5/6/2020
20.3.0 925 5/2/2020
20.0.0 1,008 4/25/2020
19.5.0 1,432 3/10/2020
19.4.0 1,899 11/30/2019
19.3.0 1,328 11/6/2019
19.2.0 990 11/3/2019
19.1.0 1,202 10/13/2019
19.0.0 1,030 10/6/2019
18.2.2 1,306 9/19/2019
18.2.1 1,091 9/16/2019
18.2.0 1,112 9/8/2019
18.1.0 1,119 9/2/2019
18.0.0 1,015 9/1/2019
17.10.0 1,061 8/28/2019
17.9.0 2,217 7/24/2019
17.8.0 1,947 7/13/2019
17.7.0 1,643 6/9/2019
17.6.0 1,595 5/10/2019
17.5.2 1,614 5/9/2019
17.5.1 1,623 5/9/2019
17.5.0 1,655 4/16/2019
17.4.2 1,776 2/12/2019
17.4.1 1,680 2/6/2019
17.4.0 1,671 2/6/2019
17.3.0 1,684 1/25/2019
17.2.0 1,729 1/8/2019
17.1.0 1,673 12/24/2018
17.0.1 1,724 12/20/2018
17.0.0 1,753 12/16/2018
16.2.1 1,806 12/11/2018
14.12.2 1,950 10/15/2018
14.7.0 2,131 8/16/2018
14.6.0 2,072 8/2/2018
14.5.2 2,321 7/9/2018
14.5.1 2,300 6/20/2018
14.5.0 2,294 6/13/2018
14.4.0 2,324 6/10/2018
14.3.0 2,360 6/10/2018
14.2.1 2,333 6/7/2018
14.2.0 2,050 6/6/2018
14.1.0 2,068 6/6/2018
14.0.0 2,265 6/5/2018
13.1.0 2,318 6/3/2018
13.0.0 2,348 5/7/2018
12.7.0 2,431 4/15/2018
12.6.1 2,404 3/23/2018
12.6.0 2,396 3/18/2018
12.5.1 2,364 2/26/2018
12.5.0 2,408 2/12/2018
12.4.0 2,424 1/31/2018
12.3.0 2,353 1/29/2018
12.2.0 2,404 1/9/2018
12.1.0 2,434 12/10/2017
12.0.0 2,177 12/3/2017
11.10.1 2,348 11/20/2017
11.10.0 2,350 11/3/2017
11.9.1 2,356 11/2/2017
11.9.0 2,298 10/31/2017
11.8.1 2,331 10/30/2017
11.8.0 2,298 10/28/2017
11.7.0 2,355 10/26/2017
11.6.5 2,381 10/24/2017
11.6.4 2,349 10/23/2017
11.6.3 2,392 10/20/2017
11.6.2 2,333 10/19/2017
11.6.1 2,346 10/18/2017
11.6.0 2,340 10/15/2017
11.5.0 2,304 10/8/2017
11.4.0 2,578 9/6/2017
11.3.0 2,347 9/4/2017
11.2.0 2,146 8/20/2017
11.1.0 2,082 8/9/2017
11.0.4 2,178 7/30/2017
11.0.3 2,214 7/24/2017
11.0.2 2,293 7/21/2017
11.0.1 2,154 7/21/2017
11.0.0 2,214 7/19/2017
10.6.0 2,212 6/27/2017
10.5.2 2,266 6/23/2017
10.5.1 2,259 6/22/2017
10.5.0 2,211 6/17/2017
10.4.3 2,176 5/31/2017
10.4.2 2,145 5/25/2017
10.4.1 2,223 5/22/2017
10.4.0 2,170 5/19/2017
10.3.0 2,160 5/11/2017
10.2.0 2,192 4/21/2017
10.1.2 2,158 4/14/2017
10.1.1 2,157 4/12/2017
10.1.0 2,200 4/7/2017
10.0.2 2,150 3/28/2017
10.0.1 2,170 3/26/2017
10.0.0 2,176 3/20/2017
9.4.0 2,176 3/12/2017
9.3.1 2,193 3/9/2017
9.3.0 2,203 3/6/2017
9.2.1 2,153 2/28/2017
9.2.0 2,266 2/21/2017
9.1.1 2,177 2/15/2017
9.1.0 2,290 2/8/2017
9.0.4 2,289 1/23/2017
9.0.3 2,242 12/20/2016
9.0.2 2,166 12/18/2016
9.0.0 2,238 12/12/2016
8.0.1 2,237 12/10/2016
8.0.0 2,245 11/28/2016
7.0.0 2,245 11/23/2016
6.0.0 2,733 11/17/2016
5.7.0 2,799 11/3/2016
5.6.4 2,737 11/2/2016
5.6.3 2,436 10/30/2016
5.6.2 2,467 10/26/2016
5.6.1 2,417 10/26/2016
5.6.0 2,438 10/24/2016
5.5.0 2,485 10/22/2016
5.4.0 2,514 10/21/2016
5.3.2 2,524 10/16/2016
5.3.1 2,459 9/14/2016
5.3.0 2,549 9/13/2016
5.2.0 2,481 9/11/2016
5.1.0 2,478 9/9/2016
5.0.0 2,431 9/8/2016
4.0.1 2,443 9/8/2016
4.0.0 2,415 9/7/2016
3.6.0 2,416 9/4/2016
3.5.0 2,480 9/1/2016
3.4.0 2,496 8/8/2016
3.3.0 2,522 7/18/2016
3.2.3 2,537 6/28/2016
3.2.2 2,917 6/15/2016
3.2.1 2,514 6/7/2016
3.2.0 2,512 6/5/2016
3.1.0 2,509 5/30/2016
3.0.0 2,585 5/19/2016
2.12.0 2,597 4/10/2016
2.11.0 2,655 4/9/2016
2.10.1 2,334 3/16/2016
2.10.0 2,598 2/17/2016
2.9.1 2,581 12/13/2015
2.9.0 2,584 12/8/2015
2.8.5 2,630 11/27/2015
2.8.4 2,605 11/27/2015
2.8.2 2,593 11/4/2015
2.8.1 2,537 11/4/2015
2.8.0 2,593 11/1/2015
2.7.0 2,781 6/27/2015
2.6.3 2,644 6/16/2015
2.6.2 2,749 6/14/2015
2.6.1 2,670 5/15/2015
2.6.0 2,735 4/13/2015
2.5.3 2,762 1/26/2015
2.5.2 2,979 12/13/2014
2.5.1 2,895 11/18/2014
2.5.0 2,758 10/13/2014
2.4.5 2,689 10/6/2014
2.4.4 2,874 6/3/2014
2.4.3 2,721 6/2/2014
2.4.2 2,753 5/30/2014
2.4.0 3,094 3/14/2014
2.3.2 2,657 2/3/2014
2.3.1 2,498 12/15/2013
2.3.0 2,502 12/14/2013
2.2.2 2,604 12/12/2013
2.2.1 2,561 12/11/2013
2.2.0 2,623 12/8/2013
2.1.0 2,604 12/8/2013
2.0.2 2,660 12/2/2013
2.0.1 2,661 11/26/2013
2.0.0 2,601 11/14/2013
1.2.1 2,580 11/11/2013
1.1.0 2,632 9/5/2013
1.0.0 2,635 9/1/2013