Пример #1
0
        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();
        }
Пример #2
0
        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;
            }
        }