Skip to main content

Table and XTable

CatDb tables implement ITable<TKey, TRecord>. Keys are ordered, records are stored by key, and scans enumerate sorted key-value pairs.

Open table variants​

var direct = engine.OpenXTable<long, Tick>("ticks");
var portable = engine.OpenXTablePortable<long, Tick>("ticks_portable");
APIDescription
OpenXTable<TKey, TRecord>Direct typed wrapper. Uses Data<TKey> and Data<TRecord> internally.
OpenXTablePortable<TKey, TRecord>Uses transformers and schema-first DataType descriptions.
OpenXTablePortable(name, keyDataType, recordDataType)Low-level ITable<IData, IData> table.

The first open of a table fixes its structure. Reopening the same name with a different key type, record type, or structure kind throws an argument exception.

CRUD operations​

var table = engine.OpenXTable<int, string>("events");

table[1] = "created"; // replace or insert
table.Replace(2, "updated"); // replace or insert
table.InsertOrIgnore(2, "ignored"); // keep existing value

bool exists = table.Exists(1);
bool found = table.TryGet(1, out var value);
string fallback = table.TryGetOrDefault(999, "missing");

table.Delete(1);
table.Delete(10, 20); // inclusive range delete
table.Clear();

engine.Commit();
var first = table.FirstRow;
var last = table.LastRow;

var next = table.FindNext(100); // nearest row at or after key
var after = table.FindAfter(100); // nearest row strictly after key
var prev = table.FindPrev(100); // nearest row at or before key
var before = table.FindBefore(100); // nearest row strictly before key

Scans​

foreach (var row in table.Forward())
{
Console.WriteLine(row.Key);
}

foreach (var row in table.Forward(from: 100, hasFrom: true, to: 200, hasTo: true))
{
Console.WriteLine(row.Key);
}

foreach (var row in table.Backward())
{
Console.WriteLine(row.Key);
}

Reads call into table flush paths before navigating the WTree, so pending table operations are visible to reads in the same engine.

Composite and complex records​

CatDb builds data schemas from CLR types. It supports primitives, common value types, arrays, lists, dictionaries, and composite slot types.

using CatDb.Data;

var composite = engine.OpenXTable<Slots<int, string>, Tick>("ticks_by_symbol");
composite[new Slots<int, string>(2026, "MSFT")] = tick;

For portable tables, DataTransformer<T> maps user objects to schema-shaped IData values.