示例#1
0
        //todo
        public void Reorganize()
        {
            Console.WriteLine("###REORGANIZATION###");
            var NewMainReader = new MainReader("newmain", MainPageSize, Mode.New);
            var NewMainWriter = new MainWriter("newmain", MainPageSize, Mode.New);

            TempLong = OverflowAddress;
            ResetVariables();
            AllocateEmptyPageAtTheEnd(ref NewMainWriter);
            MainPages++;
            FilePage             newPage = NewMainReader.ReadNextPage();
            Tuple <Record, long> entry;

            MainReader.Reader.Position = 0;
            //MainReader._count = false;

            while ((entry = MainReader.ReadNextEntryWithChaining()) != null)
            {
                if (entry.Item1.Key == long.MaxValue)
                {
                    continue;
                }
                if (entry.Item1.Deleted)
                {
                    continue;
                }
                if (newPage.Count >= Alpha * MainPageSize)
                {
                    // insert new element to index
                    // allocate new page

                    NewMainWriter.WritePage(newPage);
                    AllocateEmptyPageAtTheEnd(ref NewMainWriter);
                    newPage = NewMainReader.ReadNextPage();
                    MainPages++;
                    if (entry.Item1.Key != long.MaxValue)
                    {
                        IndexUnit.Entries.Add(new Tuple <long, long>(entry.Item1.Key, MainPages - 1));
                    }
                }

                newPage.Entries[(int)newPage.Count++] = new Tuple <Record, long>(entry.Item1, -1);
                MainRecordCount++;
            }
            NewMainWriter.WritePage(newPage);
            OverflowAddress = NewMainWriter.Writer.Position;
            AllocateEmptyPageAtTheEnd(ref NewMainWriter); // allocate overflow
            OverflowPages++;
            IndexUnit.Sort();
            IndexUnit.WriteIndex();
            MetaData.Save();
            MainReader.Dispose();
            MainWriter.Dispose();
            NewMainReader.Dispose();
            NewMainWriter.Dispose();
            File.Delete(_filePath);
            File.Move("newmain", _filePath);
            MainReader = new MainReader(_filePath, MainPageSize, Mode.Read);
            MainWriter = new MainWriter(_filePath, MainPageSize, Mode.Read);
        }
示例#2
0
        public void PrintMainFile()
        {
            var mr = new MainReader(_filePath, MainPageSize, Mode.Read, false);

            {
                Console.WriteLine("Entries per page: " + MainPageSize);
                long entry     = 0L;
                long countRecs = 0;
                Tuple <Record, long> i;
                while ((i = mr.ReadEntry(entry)) != null)
                {
                    if (mr.LastPage.Count <= 0)
                    {
                        break;
                    }
                    if (mr.LastPage.Address >= MainReader.PageNumberFromAddress(OverflowAddress))
                    {
                        break;
                    }
                    if (countRecs >= MainPageSize)
                    {
                        countRecs = 1;
                        Console.WriteLine();
                    }
                    else
                    {
                        countRecs++;
                    }
                    Console.WriteLine(EntryToString(i));

                    if (i.Item2 != -1)
                    {
                        FollowChain(i.Item2, ref mr);
                    }

                    entry++;
                }
            }
            mr.Dispose();
        }