Exemple #1
0
        public string Duplicate(string id)
        {
            var lId2      = _nrwl.AcquireWriterLock($"{nameof(ChunkMap)}.{id}");
            var lId       = _nrwl.AcquireReaderLock($"{nameof(Chunk)}.{id}");
            var mapSearch = _maps.Find(x => x.ID == id).ToList();

            if (!mapSearch.Any())
            {
                _nrwl.ReleaseLock($"{nameof(ChunkMap)}.{id}", lId2);
                _nrwl.ReleaseLock($"{nameof(Chunk)}.{id}", lId);
                throw new MdbfsElementNotFoundException();
            } //not found

            var map  = mapSearch.First();
            var nMap = new ChunkMap {
                ChunksIDs = new List <string>(), Length = map.Length, Removed = false
            };
            var chunksSearch = _chunks.Find(Builders <Chunk> .Filter.Where(x => map.ChunksIDs.Contains(x.ID)));
            var nChunks      = chunksSearch.ToEnumerable().Select(ch => new Chunk {
                Bytes = ch.Bytes
            }).ToList();

            _chunks.InsertMany(nChunks);
            nChunks.ForEach(x => nMap.ChunksIDs.Add(x.ID));
            _maps.InsertOne(nMap);
            _nrwl.ReleaseLock($"{nameof(ChunkMap)}.{id}", lId2);
            _nrwl.ReleaseLock($"{nameof(Chunk)}.{id}", lId);
            return(nMap.ID);
        }
Exemple #2
0
        public Element Remove(string id, bool permanently)
        {
            var     lId = _nrwl.AcquireWriterLock($"{nameof(Files)}.{id}");
            Element f   = null;

            if (permanently)
            {
                _elements.FindOneAndDelete(x => x.ID == id);
                var lId2 = _nrwl.AcquireWriterLock($"{nameof(ChunkMap)}.{id}");
                _binaryStorage._maps.UpdateOne(x => x.ID == id, Builders <ChunkMap> .Update.Set(x => x.Removed, true));
                _nrwl.ReleaseLock($"{nameof(ChunkMap)}.{id}", lId2);
            }
            else
            {
                var elemSearch = _elements.Find(x => x.ID == id).ToList();
                if (elemSearch.Count != 0)
                {
                    var e = f = elemSearch.First();
                    var originalLocationNames = "";
                    var originalLocationIDs   = "";
                    var deleted = DateTime.Now;
                    do
                    {
                        // ReSharper disable once AccessToModifiedClosure
                        var parentSearch = _elements.Find(x => x.ID == e.ParentID).ToList();

                        e = parentSearch.First();
                        originalLocationNames = e.Name + '/' + originalLocationNames;
                        originalLocationIDs   = e.ID + '/' + originalLocationIDs;
                    } while (e.ParentID != null);

                    f.Opened   = deleted;
                    f.Modified = deleted;
                    f.Removed  = true;
                    f.Metadata[nameof(EMetadataKeys.PathNames)] = originalLocationNames;
                    f.Metadata[nameof(EMetadataKeys.PathIDs)]   = originalLocationIDs;
                    f.Metadata[nameof(EMetadataKeys.Deleted)]   = deleted;
                    _elements.FindOneAndReplace(x => x.ID == id, f);
                }
            }

            _nrwl.ReleaseLock($"{nameof(Files)}.{id}", lId);
            return(f);
        }
        public static (bool success, BinaryUploadStream stream) Open(IMongoCollection <ChunkMap> maps,
                                                                     IMongoCollection <Chunk> chunks, int maxChunkLenght, string id, NamedReaderWriterLock namedReaderWriterLock)
        {
            var(success, map) = CreateNewElement(maps, id, namedReaderWriterLock);
            if (!success)
            {
                return(false, null);
            }


            var stream = new BinaryUploadStream(maps, chunks, maxChunkLenght, namedReaderWriterLock)
            {
                _map = map
            };

            stream._nrwlID = namedReaderWriterLock.AcquireWriterLock($"{nameof(Chunk)}.{map.ID}");

            return(true, stream);
        }