示例#1
0
文件: Value.cs 项目: T145/archive
        public static Value From(byte[] bytes, int offset, int length)
        {
            if (length <= 0)
            {
                throw new ArgumentOutOfRangeException("Length of the Value must be at least 1 byte.");
            }

            var v = new Value();

            v._bytes = ByteArray.From(bytes, offset, length);
            return(v);
        }
示例#2
0
        static Key ReadKey(byte[] block, ref int offset)
        {
            int keySize = Helper.Decode7BitInt(block, ref offset);
            var key     = ByteArray.From(block, offset, keySize);

            offset += keySize;
            if (block [offset] == 0)
            {
                offset = -1;                 // if the next keySize bit is zero then we have exhausted this block. Set to -1 to terminate enumeration
            }
            return(new Key(key));
        }
示例#3
0
        static KeyValuePair <Key, Value> ReadPair(byte[] block, ref int offset)
        {
            offset += 1;             // skip over header flag
            offset += 4;             // skip over the tree pointers
            int keySize = Helper.Decode7BitInt(block, ref offset);
            var key     = new Key(ByteArray.From(block, offset, keySize));

            offset += keySize;
            int valueSize = Helper.Decode7BitInt(block, ref offset);
            var val       = Value.From(block, offset, valueSize);

            offset += valueSize;

            // if the next keySize bit is zero then we have exhausted this block. Set to -1 to terminate enumeration
            if (offset >= Config.SortedBlockSize || block [offset] == (byte)RecordHeaderFlag.EndOfBlock)
            {
                offset = -1;
            }

            return(new KeyValuePair <Key, Value> (key, val));
        }
示例#4
0
        // The multi page lock.
        public void Set(byte[] key, byte[] value, IDictionary <string, byte[]> indexedValues)         // Set the specified key, value and indexedValues.
        {
            int valueSize = value.Length;

            if (valueSize <= Config.MaxSmallValueSize)
            {
                var k = new Key(key, 0);
                var v = new Value(value, ValueFlag.SmallValue);
                InternalSet(k, v, indexedValues);
            }
            else
            {
                lock (multiPageLock) {
                    if (value.Length >= Config.MaxLargeValueSize)
                    {
                        throw new InvalidDataException(string.Format("Value is larger than the maximum size. ({0} bytes)", Config.MaxLargeValueSize));
                    }

                    int  offset = 0;
                    byte seqNum = 1;

                    while (offset < valueSize)
                    {
                        var k      = new Key(key, seqNum);
                        int length = Math.Min(valueSize - offset, Config.MaxSmallValueSize);
                        var v      = new Value(ByteArray.From(value, offset, length).InternalBytes, ValueFlag.LargeValueChunk);
                        InternalSet(k, v, null);
                        offset += length;
                        seqNum++;
                    }

                    var dk = new Key(key, 0);
                    var dv = new Value(BitConverter.GetBytes(valueSize), ValueFlag.LargeValueDescriptor);
                    InternalSet(dk, dv, indexedValues);
                }
            }
        }