private void WriteDeleteRangeOperation(BinaryWriter writer, IOperation operation) { DeleteRangeOperation opr = (DeleteRangeOperation)operation; KeyPersist.Write(writer, operation.FromKey); KeyPersist.Write(writer, operation.ToKey); }
private bool Delete(IOrderedSet <IData, IData> set, DeleteRangeOperation operation) { long from = ((Data <long>)operation.FromKey).Slot0; long to = ((Data <long>)operation.ToKey).Slot0; int localFrom = (int)(from % BLOCK_SIZE); int localTo = (int)(to % BLOCK_SIZE); long baseFrom = from - localFrom; long baseTo = to - localTo; long internalFrom = localFrom > 0 ? baseFrom + BLOCK_SIZE : baseFrom; long internalTo = localTo < BLOCK_SIZE - 1 ? baseTo - 1 : baseTo; bool isModified = false; if (internalFrom <= internalTo) { isModified = set.Remove(new Data <long>(internalFrom), true, new Data <long>(internalTo), true); } IData tmp; Data <byte[]> record; if (localFrom > 0 && set.TryGetValue(new Data <long>(baseFrom), out tmp)) { record = (Data <byte[]>)tmp; if (localFrom < record.Slot0.Length) { Array.Clear(record.Slot0, localFrom, baseFrom < baseTo ? record.Slot0.Length - localFrom : localTo - localFrom + 1); isModified = true; } if (baseFrom == baseTo) { return(isModified); } } if (localTo < BLOCK_SIZE - 1 && set.TryGetValue(new Data <long>(baseTo), out tmp)) { record = (Data <byte[]>)tmp; if (localTo < record.Slot0.Length - 1) { Array.Clear(record.Slot0, 0, localTo + 1); isModified = true; } else { isModified = set.Remove(new Data <long>(baseTo)); } } return(isModified); }
public bool Leaf(IOperationCollection operations, IDataContainer data) { IOrderedSet <IData, IData> set = (IOrderedSet <IData, IData>)data; bool isModified = false; foreach (var opr in operations) { switch (opr.Code) { case OperationCode.REPLACE: { if (Replace(set, (ReplaceOperation)opr)) { isModified = true; } } break; case OperationCode.DELETE: { DeleteRangeOperation o = new DeleteRangeOperation(opr.FromKey, opr.FromKey); if (Delete(set, (DeleteRangeOperation)o)) { isModified = true; } } break; case OperationCode.DELETE_RANGE: { if (Delete(set, (DeleteRangeOperation)opr)) { isModified = true; } } break; default: throw new NotSupportedException(); } } return(isModified); }