예제 #1
0
        public void Persist(MemTable memTable, int fileNumber)
        {
            var rowAt = 0;
            var len   = (memTable.Store.Count * (64 + 64 + 64 + 1)) + memTable.TotalKeyLength;

            byte[] data = new byte[len];

            foreach (var item in memTable.Store)
            {
                var    keyBytesLength = item.Key.Length;
                byte[] row            = new byte[64 + keyBytesLength + 64 + 64];

                var keyBytes         = Encoding.ASCII.GetBytes(item.Key);
                var keyLengthBytes   = BitConverter.GetBytes((long)keyBytesLength);
                var positionBytes    = BitConverter.GetBytes(item.Value._postion);
                var valueLengthBytes = BitConverter.GetBytes(item.Value._valueLen);

                keyLengthBytes.CopyTo(row, 0);
                keyBytes.CopyTo(row, 65);
                positionBytes.CopyTo(row, 64 + keyBytesLength + 1);
                valueLengthBytes.CopyTo(row, 64 + keyBytesLength + 64 + 1);

                row.CopyTo(data, rowAt);

                rowAt += row.Length + 1;
            }

            var indexFile = new FileStream(_kDB.DBPath + "/Index-" + fileNumber.ToString() + ".db", FileMode.CreateNew);

            indexFile.Write(data, 0, len);
            indexFile.Close();
        }
예제 #2
0
 public void Put(string key, FencePointer fencePointer)
 {
     if (_memTable.Count() >= 100000)
     {
         _memTable.Persist(++_lastIndexFileNumber);
         _memTable = new MemTable(_kDB);
         _dlinkedList.AddFirst(_memTable);
     }
     _memTable.Put(key, fencePointer);
 }
예제 #3
0
        public IndexManager(KDB kDB)
        {
            _kDB = kDB ?? throw new ArgumentNullException(nameof(kDB));
            _lastIndexFileNumber = GetLastFileNumber();

            _dlinkedList = new LinkedList <IIndexTable>();

            LoadSSTables();

            _memTable = new MemTable(kDB);
            _dlinkedList.AddFirst(_memTable);
        }