public static async Task DumpLocation(IFdbDatabase db, ISubspaceLocation path, CancellationToken ct) { Assert.That(db, Is.Not.Null); using (var tr = await db.BeginTransactionAsync(ct)) { tr.StopLogging(); var subspace = await path.Resolve(tr); if (subspace == null) { FdbTest.Log($"Dumping content of subspace {path}:"); FdbTest.Log("> EMPTY!"); return; } await DumpSubspace(tr, subspace).ConfigureAwait(false); if (path.Prefix.Count == 0) { var names = await db.DirectoryLayer.TryListAsync(tr, path.Path); if (names != null) { foreach (var name in names) { var child = await db.DirectoryLayer.TryOpenAsync(tr, path.Path[name]); if (child != null) { await DumpSubspace(tr, child); } } } } } }
public static async Task DumpSubspace(IFdbReadOnlyTransaction tr, IKeySubspace subspace) { Assert.That(tr, Is.Not.Null); Assert.That(subspace, Is.Not.Null); FdbTest.Log($"Dumping content of {subspace} at {subspace.GetPrefix():K}:"); int count = 0; await tr .GetRange(KeyRange.StartsWith(subspace.GetPrefix())) .ForEachAsync((kvp) => { var key = subspace.ExtractKey(kvp.Key, boundCheck: true); ++count; string keyDump; try { // attempts decoding it as a tuple keyDump = TuPack.Unpack(key).ToString() !; } catch (Exception) { // not a tuple, dump as bytes keyDump = "'" + key.ToString() + "'"; } FdbTest.Log("- " + keyDump + " = " + kvp.Value.ToString()); }); if (count == 0) { FdbTest.Log("> empty !"); } else { FdbTest.Log("> Found " + count + " values"); } }