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); }
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)); }
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)); }
// 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); } } }