Пример #1
0
        private void WriteDeleteRangeOperation(BinaryWriter writer, IOperation operation)
        {
            DeleteRangeOperation opr = (DeleteRangeOperation)operation;

            KeyPersist.Write(writer, operation.FromKey);
            KeyPersist.Write(writer, operation.ToKey);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }