Пример #1
0
        public StreamStorage(string dbpath)
        {
            bool fob_exists = File.Exists(dbpath);
            // Открываем или создаем файл-носитель хранилища
            FileStream fs = new FileStream(dbpath, FileMode.OpenOrCreate, FileAccess.ReadWrite);

            // Создаем собственно блочное (страничное) хранилище
            fob = new FileOfBlocks(fs);

            fob.DeactivateCache();

            sz = PagedStream.HEAD_SIZE;
            // Далее идет корявый способ создания трех потоков (Stream), нужных для базы данных
            Stream first_stream = fob.GetFirstAsStream();

            if (!fob_exists)
            {
                PagedStream.InitPagedStreamHead(first_stream, 8L, 0, PagedStream.HEAD_SIZE);
                fob.Flush();
            }
            PagedStream main_stream = new PagedStream(fob, fob.GetFirstAsStream(), 8L);

            // Если main_stream нулевой длины, надо инициировать конфигурацию стримов
            bool toinit = main_stream.Length == 0;

            if (toinit)
            {
                // инициируем 2 головы для потоков
                PagedStream.InitPagedStreamHead(main_stream, 0L, 0L, -1L); // Это будет для коллекций
                PagedStream.InitPagedStreamHead(main_stream, PagedStream.HEAD_SIZE, 0L, -1L);
                main_stream.Flush(); fob.Flush();
            }
            collection_stream = new PagedStream(fob, main_stream, 0L);
            PagedStream special_stream = new PagedStream(fob, main_stream, sz); //TODO: резерв

            // Если main_stream ненулевой длины, надо инициировать имеющуюся конфигурацию стримов
            if (collection_stream.Length > 0)
            {
                int nstreams = (int)(collection_stream.Length / sz);
                // инициируем nstreams голов для потоков
                for (int i = 0; i < nstreams; i++)
                {
                    //PagedStream.InitPagedStreamHead(main_stream, i * sz, 0L, -1L);
                    streams.Add(new PagedStream(fob, collection_stream, i * sz));
                }
                collection_stream.Flush(); fob.Flush();
            }
        }
Пример #2
0
 public void DeactivateCache()
 {
     fob.DeactivateCache();
 }