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); }
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); }