Esempio n. 1
0
        public List <long> GetSome(Int64 SectionStartPosition, int takecount)
        {
            JumpRecord start = getStartPointerRecord(SectionStartPosition);

            while (start.Buttom > 0)
            {
                start = getJumpRecord(start.Buttom);
            }

            if (start.Next <= 0)
            {
                return(null);
            }

            List <long> recordlist = new List <long>();

            int counter = 0;

            while (start.Next > 0)
            {
                start = getJumpRecord(start.Next);
                recordlist.Add(start.BlockPosition);
                counter += 1;
                if (counter >= takecount)
                {
                    return(recordlist);
                }
            }

            return(recordlist);
        }
Esempio n. 2
0
        /// <summary>
        /// delete the record and all the chains.
        /// </summary>
        /// <param name="record"></param>
        /// <returns></returns>
        private void deleteRecord(JumpRecord record)
        {
            updateNavigator(record.Previous, record.Next, enumPosition.next);
            updateNavigator(record.Next, record.Previous, enumPosition.previous);
            markAsDeleted(record.diskLocation);

            JumpRecord toprecord = record;

            JumpRecord buttomreocrd = record;

            while (toprecord.TOP > 0)
            {
                toprecord = getJumpRecord(toprecord.TOP);

                updateNavigator(toprecord.Previous, toprecord.Next, enumPosition.next);
                updateNavigator(toprecord.Next, toprecord.Previous, enumPosition.previous);

                markAsDeleted(toprecord.diskLocation);
            }

            while (buttomreocrd.Buttom > 0)
            {
                buttomreocrd = getJumpRecord(buttomreocrd.Buttom);


                updateNavigator(buttomreocrd.Previous, buttomreocrd.Next, enumPosition.next);
                updateNavigator(buttomreocrd.Next, buttomreocrd.Previous, enumPosition.previous);

                markAsDeleted(buttomreocrd.diskLocation);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// promote items up.
        /// </summary>
        /// <param name="sectionStartPosition"></param>
        /// <param name="loadchains"></param>
        /// <param name="blockposition"></param>
        private void promoteItems(Int64 sectionStartPosition, Dictionary <int, JumpRecord> loadchains, Int64 blockposition)
        {
            /// we now use a temp counter on each level, and reset that temp counter when item promoted.
            foreach (var item in loadchains.OrderByDescending(o => o.Key))
            {
                int level = item.Key;

                JumpRecord newrecord = insertNewRecord(blockposition);

                JumpRecord ItemCurrentLevel = item.Value;

                updateNavigator(ItemCurrentLevel.diskLocation, newrecord.diskLocation, enumPosition.next);
                updateNavigator(ItemCurrentLevel.Next, newrecord.diskLocation, enumPosition.previous);

                updateNavigator(newrecord.diskLocation, ItemCurrentLevel.diskLocation, enumPosition.previous);
                updateNavigator(newrecord.diskLocation, ItemCurrentLevel.Next, enumPosition.next);

                int counter = getLevelCounter(sectionStartPosition, level);
                counter = counter + 1;
                if (counter < this.counterBeforePromotion)
                {
                    setLevelCounter(sectionStartPosition, (byte)counter, level);
                    //STOP, not promot up again.
                    return;
                }
                else
                {
                    // reSet counter and continue loop up.
                    setLevelCounter(sectionStartPosition, (byte)0, level);
                }
            }
        }
Esempio n. 4
0
        public List <Int64> GetAll(Int64 SectionStartPosition)
        {
            JumpRecord start = getStartPointerRecord(SectionStartPosition);

            while (start.Buttom > 0)
            {
                start = getJumpRecord(start.Buttom);
            }

            if (start.Next <= 0)
            {
                return(null);
            }


            List <Int64> recordlist = new List <Int64>();

            while (start.Next > 0)
            {
                start = getJumpRecord(start.Next);


                recordlist.Add(start.BlockPosition);
            }

            return(recordlist);
        }
Esempio n. 5
0
        public bool HasKey(Int64 sectionStartPosition, Int64 blockposition)
        {
            if (getIndicator(sectionStartPosition) != enumSectionType.StartSection)
            {
                throw new Exception("wrong start section");
            }
            JumpRecord startSearchRecord = getStartPointerRecord(sectionStartPosition);

            JumpRecord currentRecord = startSearchRecord;

            JumpRecord previousrecord = currentRecord;

            while (true)
            {
                if (blockposition == currentRecord.BlockPosition)
                {
                    return(true);
                }

                else if (blockposition > currentRecord.BlockPosition)
                {
                    if (currentRecord.Next > 0)
                    {
                        previousrecord = currentRecord;
                        currentRecord  = getJumpRecord(currentRecord.Next);
                        continue;
                    }
                    else if (currentRecord.Buttom > 0)
                    {
                        previousrecord = currentRecord;
                        currentRecord  = getJumpRecord(currentRecord.Buttom);

                        continue;
                    }
                    else
                    {
                        //reach end, not found.
                        return(false);
                    }
                }
                else
                {
                    if (previousrecord.Buttom > 0)
                    {
                        currentRecord = getJumpRecord(previousrecord.Buttom);

                        continue;
                    }
                    else
                    {
                        //reach end, not found.
                        return(false);
                    }
                }
            }
        }
Esempio n. 6
0
        public bool Del(Int64 SectionStartPosition, Int64 blockPosition)
        {
            JumpRecord startSearchRecord = getStartPointerRecord(SectionStartPosition);

            JumpRecord currentRecord = startSearchRecord;

            JumpRecord previousrecord = currentRecord;

            while (true)
            {
                if (blockPosition == currentRecord.BlockPosition)
                {
                    deleteRecord(currentRecord);
                    return(true);
                }

                else if (blockPosition > currentRecord.BlockPosition)
                {
                    if (currentRecord.Next > 0)
                    {
                        previousrecord = currentRecord;
                        currentRecord  = getJumpRecord(currentRecord.Next);
                        continue;
                    }
                    else if (currentRecord.Buttom > 0)
                    {
                        previousrecord = currentRecord;
                        currentRecord  = getJumpRecord(currentRecord.Buttom);

                        continue;
                    }
                    else
                    {
                        //reach end, not found.
                        return(false);
                    }
                }
                else
                {
                    if (previousrecord.Buttom > 0)
                    {
                        currentRecord = getJumpRecord(previousrecord.Buttom);

                        continue;
                    }
                    else
                    {
                        //reach end, not found.
                        return(false);
                    }
                }
            }
        }
Esempio n. 7
0
 public bool MoveNext()
 {
     if (this.current.Next > 0)
     {
         current = this.duplicate.getJumpRecord(current.Next);
         return(true);
     }
     else
     {
         return(false);
     }
 }
Esempio n. 8
0
        public BtreeIndexDuplicateCollection getCollection(Int64 SectionStartPosition)
        {
            JumpRecord start = getStartPointerRecord(SectionStartPosition);

            while (start.Buttom > 0)
            {
                start = getJumpRecord(start.Buttom);
            }

            BtreeIndexDuplicateCollection collection = new BtreeIndexDuplicateCollection(this, start);

            return(collection);
        }
Esempio n. 9
0
        public BtreeIndexDuplicateReader getReader(Int64 SectionStartPosition)
        {
            JumpRecord start = getStartPointerRecord(SectionStartPosition);

            while (start != null && start.Buttom > 0)
            {
                start = getJumpRecord(start.Buttom);
            }

            BtreeIndexDuplicateReader reader = new BtreeIndexDuplicateReader(this, start);

            return(reader);
        }
Esempio n. 10
0
        public Int64 ReadNext()
        {
            if (this.current.Next > 0)
            {
                current = this.duplicate.getJumpRecord(current.Next);

                if (current != null)
                {
                    return(current.BlockPosition);
                }
            }

            return(-1);
        }
Esempio n. 11
0
        public byte[] ReadNextPointerBytes()
        {
            if (this.current.Next > 0)
            {
                current = this.duplicate.getJumpRecord(current.Next);

                if (current != null)
                {
                    return(current.pointerBytes);
                }
            }

            return(null);
        }
Esempio n. 12
0
        private JumpRecord insertNewRecord(Int64 blockposition)
        {
            JumpRecord record = new JumpRecord();

            record.BlockPosition = blockposition;

            record.Indicator = enumSectionType.Record;

            Int64 insertposition = getInsertPosition();

            IndexStream.Position = insertposition;
            IndexStream.Write(record.ToBytes(), 0, sectionlen);

            record.diskLocation = insertposition;
            return(record);
        }
Esempio n. 13
0
        public List <Int64> Get(Int64 SectionStartPosition, int skip, int take)
        {
            JumpRecord start = getStartPointerRecord(SectionStartPosition);

            while (start.Buttom > 0)
            {
                start = getJumpRecord(start.Buttom);
            }

            if (start.Next <= 0)
            {
                return(null);
            }

            int skipcount = 0;
            int takecount = 0;

            List <Int64> recordlist = new List <Int64>();

            while (start.Next > 0)
            {
                start = getJumpRecord(start.Next);

                if (skipcount < skip)
                {
                    skipcount += 1;
                    continue;
                }


                recordlist.Add(start.BlockPosition);

                takecount += 1;

                if (takecount >= take)
                {
                    break;
                }
            }

            return(recordlist);
        }
Esempio n. 14
0
        public Int64 GetOne(Int64 SectionStartPosition)
        {
            JumpRecord start = getStartPointerRecord(SectionStartPosition);

            while (start.Buttom > 0)
            {
                start = getJumpRecord(start.Buttom);
            }

            if (start.Next <= 0)
            {
                return(0);
            }
            else
            {
                start = getJumpRecord(start.Next);

                return(start.BlockPosition);
            }
        }
Esempio n. 15
0
        public int count(Int64 SectionStartPosition)
        {
            JumpRecord start = getStartPointerRecord(SectionStartPosition);

            while (start.Buttom > 0)
            {
                start = getJumpRecord(start.Buttom);
            }

            int counter = 0;

            while (start.Next > 0)
            {
                start = getJumpRecord(start.Next);

                counter += 1;
            }

            return(counter);
        }
Esempio n. 16
0
        private JumpRecord getJumpRecord(Int64 sectionposition)
        {
            byte[] recordbyte = new byte[46];

            IndexStream.Position = sectionposition;

            IndexStream.Read(recordbyte, 0, 46);

            JumpRecord record = new JumpRecord();

            record.pointerBytes = recordbyte;

            record.diskLocation = sectionposition;

            if (record.Indicator == enumSectionType.DeletedAvailable)
            {
                return(null);
            }

            return(record);
        }
Esempio n. 17
0
        /// <summary>
        /// used to determine that there are more than one record so that it can NOT be removed yet.
        /// </summary>
        /// <param name="SectionStartPosition"></param>
        /// <returns></returns>
        public bool hasMoreThanOne(Int64 SectionStartPosition)
        {
            JumpRecord start = getStartPointerRecord(SectionStartPosition);

            while (start.Buttom > 0)
            {
                start = getJumpRecord(start.Buttom);
            }

            int counter = 0;

            while (start.Next > 0)
            {
                start = getJumpRecord(start.Next);

                counter += 1;

                if (counter > 1)
                {
                    return(true);
                }
            }
            return(false);
        }
Esempio n. 18
0
 public void Dispose()
 {
     this.duplicate = null;
     this.start     = null;
     this.current   = null;
 }
Esempio n. 19
0
 public BtreeIndexDuplicateCollection(BtreeIndexDuplicate duplicate, JumpRecord start)
 {
     this.duplicate = duplicate;
     this.start     = start;
 }
Esempio n. 20
0
 public Enumerator(BtreeIndexDuplicate duplicate, JumpRecord start)
 {
     this.duplicate = duplicate;
     this.start     = start;
     this.current   = start;
 }
Esempio n. 21
0
 public void Reset()
 {
     this.current = this.start;
 }
Esempio n. 22
0
        public bool Add(Int64 sectionStartPosition, Int64 blockposition)
        {
            //if (getIndicator(sectionStartPosition) != enumSectionType.StartSection)
            //{
            //    throw new Exception("wrong start section");
            //}

            JumpRecord startSearchRecord = getStartPointerRecord(sectionStartPosition);

            Dictionary <int, JumpRecord> loadChain = new Dictionary <int, JumpRecord>();

            JumpRecord currentRecord = startSearchRecord;

            JumpRecord previousrecord = currentRecord;

            while (true)
            {
                if (currentRecord == null)
                {
                    return(false);
                }
                if (blockposition == currentRecord.BlockPosition)
                {
                    // record already exists.
                    return(false);
                }

                else if (blockposition > currentRecord.BlockPosition)
                {
                    if (currentRecord.Next > 0)
                    {
                        previousrecord = currentRecord;
                        currentRecord  = getJumpRecord(currentRecord.Next);
                        continue;
                    }
                    else if (currentRecord.Buttom > 0)
                    {
                        int currentlevel = currentRecord.level;
                        loadChain.Add(currentlevel, currentRecord);
                        previousrecord      = currentRecord;
                        currentRecord       = getJumpRecord(currentRecord.Buttom);
                        currentRecord.level = (byte)(currentlevel + 1);
                        continue;
                    }
                    else
                    {
                        // found
                        previousrecord = currentRecord;
                        break;
                    }
                }
                else
                {
                    if (previousrecord.Buttom > 0)
                    {
                        int currentlevel = previousrecord.level;
                        loadChain.Add(currentlevel, previousrecord);
                        currentRecord = getJumpRecord(previousrecord.Buttom);
                        if (currentRecord == null)
                        {
                            continue;
                        }
                        currentRecord.level = (byte)(currentlevel + 1);
                        //this currentRecord has the same block position as previous record,
                        //so blockposition must > currentRecord.blockPosition;
                        continue;
                    }
                    else
                    {
                        //found
                        break;
                    }
                }
            }

            // now we should insert the block position after this previous record.
            JumpRecord newrecord = insertNewRecord(blockposition);

            updateNavigator(previousrecord.diskLocation, newrecord.diskLocation, enumPosition.next);
            updateNavigator(newrecord.diskLocation, previousrecord.diskLocation, enumPosition.previous);

            if (previousrecord.Next > 0)
            {
                updateNavigator(newrecord.diskLocation, previousrecord.Next, enumPosition.next);
                updateNavigator(previousrecord.Next, newrecord.diskLocation, enumPosition.previous);
            }

            // now determine whether to promote the record or not.

            int counter = getLevelCounter(sectionStartPosition, previousrecord.level);

            if (counter < this.counterBeforePromotion)
            {
                counter = counter + 1;
                setLevelCounter(sectionStartPosition, (byte)counter, previousrecord.level);
            }
            else
            {
                // we need to promote this item.
                promoteItems(sectionStartPosition, loadChain, blockposition);
                reloadStartRecordPointer(sectionStartPosition);
            }

            this.updateTotalCounter(sectionStartPosition, 1);
            return(true);
        }
Esempio n. 23
0
        public bool Del(Int64 SectionStartPosition, Int64 blockPosition)
        {
            JumpRecord startSearchRecord = getStartPointerRecord(SectionStartPosition);

            if (startSearchRecord == null)
            {
                return(false);
            }

            JumpRecord currentRecord = startSearchRecord;

            JumpRecord previousrecord = currentRecord;

            while (currentRecord != null)
            {
                if (blockPosition == currentRecord.BlockPosition)
                {
                    // record found, delete it.
                    deleteRecord(currentRecord);

                    this.updateTotalCounter(SectionStartPosition, -1);
                    return(true);
                }

                else if (blockPosition > currentRecord.BlockPosition)
                {
                    if (currentRecord.Next > 0)
                    {
                        previousrecord = currentRecord;
                        currentRecord  = getJumpRecord(currentRecord.Next);
                        continue;
                    }
                    else if (currentRecord.Buttom > 0)
                    {
                        previousrecord = currentRecord;
                        currentRecord  = getJumpRecord(currentRecord.Buttom);

                        continue;
                    }
                    else
                    {
                        //reach end, not found.
                        return(false);
                    }
                }
                else
                {
                    if (previousrecord.Buttom > 0)
                    {
                        currentRecord = getJumpRecord(previousrecord.Buttom);
                        continue;
                    }
                    else
                    {
                        //reach end, not found.
                        return(false);
                    }
                }
            }

            return(false);
        }
Esempio n. 24
0
        private Int64 createNewStartSection()
        {
            /// in the format of
            /// [8] start search pointer. Pointer to the highest jump table.
            /// [2] * = number of counter of each level.  start pointer =

            // header section + number levels.
            int totallen = sectionlen + this.maxJumpTableLevel * sectionlen;

            byte[] totalbytes = new byte[totallen];

            byte[] header = new byte[sectionlen];

            header[0] = startbyteone;
            header[1] = startbytetwo;

            header[44] = startbyteone;
            header[45] = startbytetwo;

            header[2] = (byte)enumSectionType.StartSection;

            List <JumpRecord> tablelist = new List <JumpRecord>();

            for (int i = 0; i < this.maxJumpTableLevel; i++)
            {
                JumpRecord newrecord = new JumpRecord();
                newrecord.BlockPosition = Int64.MinValue;
                newrecord.Indicator     = enumSectionType.Record;
                newrecord.level         = (byte)i;

                tablelist.Add(newrecord);
            }

            for (int i = 0; i < tablelist.Count; i++)
            {
                if (i == 0)
                {
                    updateNavigator(tablelist[i].diskLocation, tablelist[i + 1].diskLocation, enumPosition.next);
                }
                else if (i == tablelist.Count - 1)
                {
                    updateNavigator(tablelist[i].diskLocation, tablelist[i - 1].diskLocation, enumPosition.previous);
                }
                else
                {
                    // in the middle.
                    updateNavigator(tablelist[i].diskLocation, tablelist[i - 1].diskLocation, enumPosition.previous);
                    updateNavigator(tablelist[i].diskLocation, tablelist[i + 1].diskLocation, enumPosition.next);
                }
            }


            Int64 writeposition = getInsertPosition();

            //write position for each start of level table.
            for (int i = 0; i < tablelist.Count; i++)
            {
                tablelist[i].diskLocation = writeposition + 46 + i * 46;
            }

            Int64 lastitemindex = tablelist[tablelist.Count - 1].diskLocation;

            System.Buffer.BlockCopy(BitConverter.GetBytes(lastitemindex), 0, header, 3, 8);

            lock (_object)
            {
                IndexStream.Position = writeposition;
                IndexStream.Write(header, 0, sectionlen);

                foreach (var item in tablelist)
                {
                    IndexStream.Position = item.diskLocation;
                    IndexStream.Write(item.ToBytes(), 0, sectionlen);
                }
            }

            return(writeposition);
        }
Esempio n. 25
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="duplicate"></param>
 /// <param name="start"> the start jumprecord in the most bottom</param>
 public BtreeIndexDuplicateReader(BtreeIndexDuplicate duplicate, JumpRecord start)
 {
     this.duplicate = duplicate;
     this.start     = start;
     this.current   = start;
 }