private bool ExistsDataKey(string key, out long fIndex, out int fLen) { fIndex = 0; fLen = 0; bool isExist = false; SortedList <string, KeyValueState> idxObj = GetIndexObject(null); isExist = (idxObj != null && idxObj.ContainsKey(key)); if (isExist) { KeyValueState kState = idxObj[key]; fIndex = kState.DataIndex; fLen = (int)kState.Length; } return(isExist); }
//[TestMore] public bool StoreKeyData(string key, byte[] kDat) { long iIdx = 0; int iLen = 0, CurrentIndexSize = GetIndexSize(); //Read long nDataIndex = GetOffSetDat <long>(_internalReader, 16); if (nDataIndex == 0) { nDataIndex = HEAD_SUMMARY_BYTES + (long)CurrentIndexSize + MAX_DIRTYBLOCK_SIZE; } //Console.WriteLine("Store Index: {0}", nDataIndex); bool addNew = false, append = false; SortedList <string, KeyValueState> idxObj = GetIndexObject(null); KeyValueState kState = new KeyValueState(); kState.Key = key; kState.Length = kDat.Length; if (idxObj == null) { IndexObject = new SortedList <string, KeyValueState>(StringComparer.Ordinal); addNew = true; } else { if (!ExistsDataKey(key, out iIdx, out iLen)) { addNew = true; append = true; //Console.WriteLine("Note Exists Key" + key); } else { KeyValueState oldState = IndexObject[key]; if ((oldState.Length + oldState.ChipSize) >= kDat.Length) { append = false; //Location Update nDataIndex = oldState.DataIndex + _currentDatOffset; kState.DataIndex = oldState.DataIndex; kState.ChipSize = (oldState.Length + oldState.ChipSize) - kDat.Length; } else { kState.ChipSize = 0; Console.WriteLine("old:{0}, new:{1}, other:{2}", oldState.DataIndex, nDataIndex, nDataIndex - _currentDatOffset); if (nDataIndex == (oldState.DataIndex + _currentDatOffset + oldState.Length + oldState.ChipSize)) { append = false; nDataIndex = oldState.DataIndex + _currentDatOffset; kState.DataIndex = oldState.DataIndex; //下次写入数据索引 KeepPositionWrite(16, BitConverter.GetBytes(nDataIndex + kDat.LongLength)); //Console.WriteLine("Location Append"); } else { append = true; SortedList <long, DirtyBlock> dirtyDat = GetStoreDirtyData(); #region Dirty Block DirtyBlock dBlock = new DirtyBlock { DataIndex = oldState.DataIndex, Length = oldState.Length + kState.ChipSize }; //Console.WriteLine("Dirty: {0}+{1}", dBlock.DataIndex, dBlock.Length); if (DirtyObject.ContainsKey(dBlock.DataIndex)) { //[impossible] DirtyObject[dBlock.DataIndex] = dBlock; } else { DirtyObject.Add(dBlock.DataIndex, dBlock); } byte[] dBytes = FileWrapHelper.GetBytes(DirtyObject); if (UpdateDynamicBytes((long)(HEAD_SUMMARY_BYTES + CurrentIndexSize), dBytes, MAX_DIRTYBLOCK_SIZE, HEAD_SUMMARY_BYTES - 9)) { ClearDirtyData(); UpdateDynamicBytes((long)(HEAD_SUMMARY_BYTES + CurrentIndexSize), dBytes, MAX_DIRTYBLOCK_SIZE, HEAD_SUMMARY_BYTES - 9); } #endregion } } } } if (append) { //在DirtyBlock总查找可用空间(TODO) storeStream.SetLength(storeStream.Length + kDat.Length); //下次写入数据索引 KeepPositionWrite(16, BitConverter.GetBytes(nDataIndex + kDat.LongLength)); //Console.WriteLine("test:{0}, {1}, {2}", nDataIndex, _currentDatOffset, nDataIndex - _currentDatOffset); kState.DataIndex = nDataIndex - _currentDatOffset; } if (addNew) { kState.ChipSize = 0; IndexObject.Add(key, kState); SetKeyCount(GetKeyCount() + 1); //Console.WriteLine("ADD New: Set {0}", GetKeyCount()); } else { IndexObject[key] = kState; } byte[] idxBytes = FileWrapHelper.GetBytes(IndexObject); bool blnIndxAdd = false; //更新索引内容实际大小 if (UpdateDynamicBytes((long)GetNextIndexWriteOffset(), idxBytes, CurrentIndexSize, 24)) { IncrementIndexSize(); nDataIndex += INDEX_INCREMENT_STEP; UpdateDynamicBytes((long)GetNextIndexWriteOffset(), idxBytes, CurrentIndexSize, 24); _currentDatOffset = GetOffSetDat <int>(_internalReader, 12); blnIndxAdd = true; } //Console.WriteLine("DataOffSet: {0}", _currentDatOffset); //Console.WriteLine("Store Index: {0}", nDataIndex); KeepPositionWrite(nDataIndex, kDat); //修改下次写入位置 if (blnIndxAdd == true) { KeepPositionWrite(16, BitConverter.GetBytes(nDataIndex + kDat.LongLength)); } return(true); }