Пример #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 Index(string fileName, string indexName, int mainPageSize = 0, Mode mode = Mode.Read)
        {
            MainPageSize = mainPageSize;
            _indexPath   = indexName;
            _filePath    = fileName;

            IndexUnit.Path = indexName;

            MainReader = new MainReader(fileName, MainPageSize, mode);
            MainWriter = new MainWriter(fileName, MainPageSize, mode);

            FilePage.PageSize = mainPageSize;

            if (mode == Mode.New)
            {
                Initialize();
            }
            if (mode == Mode.Read)
            {
                MetaData.Read();
                IndexUnit.Init(false);
                IndexUnit.ReadIndex();
                FilePage.PageSize = MainPageSize;
                MainReader        = new MainReader(fileName, MainPageSize, mode);
                MainWriter        = new MainWriter(fileName, MainPageSize, mode);
                IndexUnit.WriteIndex();
            }
            MetaData.Save();
        }
Пример #3
0
 public static void Read()
 {
     Reader.BaseStream.Position    = 0;
     Index.MainPages               = Reader.ReadInt64();
     Index.MainRecordCount         = Reader.ReadInt64();
     Index.OverflowAddress         = Reader.ReadInt64();
     Index.OverflowFirstPageNumber = MainReader.PageNumberFromAddress(Index.OverflowAddress);
     Index.OverflowPages           = Reader.ReadInt64();
     Index.OverflowRecordCount     = Reader.ReadInt64();
     Index.Alpha        = Reader.ReadDouble();
     Index.MainPageSize = Reader.ReadInt32();
 }
Пример #4
0
        private void FollowChain(long address, ref MainReader mr)
        {
            long   tmp     = address;
            string spacing = " ";

            while (tmp != -1)
            {
                Tuple <Record, long> i = mr.ReadEntry(tmp);
                Console.WriteLine(spacing + (i.Item1.Key == long.MaxValue
                    ? "-"
                    : i.Item1 + " | " +
                                             (i.Item2 == -1 ? "-" : "#" + i.Item2)) + (i.Item1.Deleted ? " [X]" : ""));
                spacing += " ";
                tmp      = i.Item2;
            }
        }
Пример #5
0
 public void PrintAllMainFile()
 {
     using (var mr = new MainReader(_filePath, MainPageSize, Mode.Read, false))
     {
         Console.WriteLine("Entries per page: " + MainPageSize);
         long entry = 0L;
         Tuple <Record, long> i;
         bool flag = true;
         while ((i = mr.ReadEntry(entry)) != null)
         {
             if (mr.LastPage.Address >= MainReader.PageNumberFromAddress(OverflowAddress) && flag)
             {
                 flag = false;
                 Console.WriteLine("\n###OVERFLOW###\n");
             }
             Console.WriteLine(EntryToString(i));
             entry++;
         }
     }
 }
Пример #6
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();
        }