Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
 public MdHead(IMd md, string id)
 {
     Md = md;
     Id = id;
 }
Exemplo n.º 5
0
 protected Database(IMd info, TypeStoreInfo typeInfo, IIndexer indexer)
 {
     _info     = info;
     _typeInfo = typeInfo;
     _indexer  = indexer;
 }
Exemplo n.º 6
0
 public DataTree(IMd head, Func <MdLocator, Task> onHeadAddressChange)
 {
     _head = head;
     _onHeadAddressChange = onHeadAddressChange;
 }
Exemplo n.º 7
0
 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()));
 }
Exemplo n.º 8
0
 protected Directory(IMd info, TypeStoreInfo typeInfo, IIndexer indexer)
 {
     _info     = info;
     _typeInfo = typeInfo;
     _indexer  = indexer;
 }
Exemplo n.º 9
0
 Indexer(IMd info, TypeStoreInfo typeStore)
     : base(info, typeStore, new InactiveIndexer())
 {
 }