public void Dispose() { // dispose queue (wait finish) if (_queue.IsValueCreated) { _queue.Value.Dispose(); } // get stream length from writer - is safe because only this instance // can change file size var delete = _logFactory.Exists() && _logPool.Writer.Length == 0; // dispose Stream pools _dataPool.Dispose(); _logPool.Dispose(); ENSURE(_dataFactory.IsLocked() == false, "datafile must be released"); ENSURE(_dataFactory.IsLocked() == false, "logfile must be released"); if (delete) { _logFactory.Delete(); } // other disposes _cache.Dispose(); }
public DiskService(EngineSettings settings, int memorySegmentSize) { _cache = new MemoryCache(memorySegmentSize); // get new stream factory based on settings _dataFactory = settings.CreateDataFactory(); _logFactory = settings.CreateLogFactory(); // create stream pool _dataPool = new StreamPool(_dataFactory, false); _logPool = new StreamPool(_logFactory, true); var isNew = _dataFactory.Exists() == false; // create lazy async writer queue for log file _queue = new Lazy <DiskWriterQueue>(() => new DiskWriterQueue(_logPool.Writer)); // create new database if not exist yet if (isNew) { LOG($"creating new database: '{Path.GetFileName(_dataFactory.Name)}'", "DISK"); this.Initialize(_dataPool.Writer, settings.InitialSize); } // if not readonly, force open writable datafile if (settings.ReadOnly == false) { var dummy = _dataPool.Writer.CanRead; } // get initial data file length _dataLength = _dataFactory.GetLength() - PAGE_SIZE; // get initial log file length if (_logFactory.Exists()) { _logLength = _logFactory.GetLength() - PAGE_SIZE; } else { _logLength = -PAGE_SIZE; } }