public static async Task <TypeStoreInfo> GetOrAddTypeStoreAsync(IMd dbInfoMd, string dbId) { IMd typeStoreHead; var typeStoreResult = await dbInfoMd.GetValueAsync(TYPE_STORE_HEAD_KEY).ConfigureAwait(false); if (!typeStoreResult.HasValue) { typeStoreHead = await MdAccess.CreateAsync(0) .ConfigureAwait(false); await dbInfoMd.AddAsync(TYPE_STORE_HEAD_KEY, new StoredValue(typeStoreHead.MdLocator)) .ConfigureAwait(false); } else { var typeStoreHeadLocation = typeStoreResult.Value.Payload.Parse <MdLocator>(); typeStoreHead = (await MdAccess.LocateAsync(typeStoreHeadLocation) .ConfigureAwait(false)).Value; } Task onHeadChange(MdLocator newLocation) => dbInfoMd.SetAsync(TYPE_STORE_HEAD_KEY, new StoredValue(newLocation)); var dataTree = new DataTree(typeStoreHead, onHeadChange); return(new TypeStoreInfo(dataTree)); }
async Task <Result <Pointer> > DirectlyAddToLeaf(string key, StoredValue value) { if (_currentLeaf == null) { _currentLeaf = _head; } else if (_currentLeaf.IsFull) { var result = await _head.AddAsync(key, value).ConfigureAwait(false); var leafResult = await MdAccess.LocateAsync(result.Value.MdLocator); if (leafResult.HasValue) { _currentLeaf = leafResult.Value; } return(result); } return(await _currentLeaf.AddAsync(key, value)); }
public async Task <Result <Pointer> > AddAsync(string key, StoredValue value) { if (_head.IsFull) { // create new head, add pointer to current head in to it. // the level > 0 indicates its role as pointer holder var newHead = await MdAccess.CreateAsync(_head.Level + 1).ConfigureAwait(false); var pointer = new Pointer { MdLocator = _head.MdLocator, ValueType = typeof(Pointer).Name }; await newHead.AddAsync(pointer).ConfigureAwait(false); _head = newHead; await _onHeadAddressChange(newHead.MdLocator).ConfigureAwait(false); } return(await DirectlyAddToLeaf(key, value).ConfigureAwait(false)); }
public MdHead(IMd md, string id) { Md = md; Id = id; }
protected Database(IMd info, TypeStoreInfo typeInfo, IIndexer indexer) { _info = info; _typeInfo = typeInfo; _indexer = indexer; }
public DataTree(IMd head, Func <MdLocator, Task> onHeadAddressChange) { _head = head; _onHeadAddressChange = onHeadAddressChange; }
DirectoryInfo SetupDirectoryInfo(FileSystemPath path, IMd md) { return(new DirectoryInfo(path.Path, md.MdLocator, (key) => md.GetValueAsync(key).GetAwaiter().GetResult(), (key, val) => md.SetAsync(key, val).GetAwaiter().GetResult())); }
protected Directory(IMd info, TypeStoreInfo typeInfo, IIndexer indexer) { _info = info; _typeInfo = typeInfo; _indexer = indexer; }
Indexer(IMd info, TypeStoreInfo typeStore) : base(info, typeStore, new InactiveIndexer()) { }