예제 #1
0
        protected virtual unsafe int ReadLength(IRawFile headerBuff, long offset)
        {
            int isize;

            headerBuff.ReadBytes(offset, (byte *)(&isize), 2);
            return(isize);
        }
예제 #2
0
        public byte[] GetValue(long rowID, ReadContext readContext)
        {
            var byteArray = readContext.AllocateBitsetArray(_sizeBytes);

            _storage.ReadBytes(rowID * _fieldSize + ISSET_HEADER_LENGTH,
                               byteArray, 0, _sizeBytes);

            return(byteArray);
        }
예제 #3
0
        public byte[] GetBytes(long rowID, ReadContext readContext)
        {
            var beginOffset = _index.ReadInt64(rowID * MetadataConstants.STRING_INDEX_FILE_RECORD_SIZE);

            if (beginOffset == MetadataConstants.INDEX_NULL_DATA_VALUE)
            {
                return(null);
            }
            var arrayLength = ReadLength(_data, beginOffset);

            if (arrayLength == 0)
            {
                return(EMPTY_BYTE_ARRAY);
            }
            //var byteArray = readContext.AllocateByteArray2(arrayLength);
            var byteArray = new byte[arrayLength];

            _data.ReadBytes(beginOffset + HEADER_SIZE, byteArray, 0, arrayLength);
            return(byteArray);
        }
예제 #4
0
        public TxRec Get()
        {
            if (IsEmpty())
            {
                return(null);
            }

            var tx            = new TxRec();
            var offset        = GetTxAddress();
            var initialOffset = offset;

            int txSize = ReadInt32(ref offset);

            tx.PrevTxAddress = ReadInt64(ref offset);

            tx.Command                = ReadByte(ref offset);
            tx.Timestamp              = ReadInt64(ref offset);
            tx.JournalMaxRowID        = ReadInt64(ref offset);
            tx.LastPartitionTimestamp = ReadInt64(ref offset);
            tx.LagSize                = ReadInt64(ref offset);

            var sz = ReadByte(ref offset);

            if (sz == 0)
            {
                tx.LagName = null;
            }
            else
            {
                // lagName
                sz = ReadByte(ref offset);
                var nameBytes = new byte[sz];
                _data.ReadBytes(offset, nameBytes, 0, sz);
                tx.LagName = Encoding.ASCII.GetString(nameBytes);

                offset += sz;
            }

            // symbolTableSizes
            tx.SymbolTableSizes = ReadInt32Array(ref offset);

            //symbolTableIndexPointers
            tx.SymbolTableIndexPointers = ReadInt64Array(ref offset);

            //indexPointers
            tx.IndexPointers = ReadInt64Array(ref offset);

            //lagIndexPointers
            tx.LagIndexPointers = ReadInt64Array(ref offset);

            return(tx);
        }
예제 #5
0
        private void CopyKeyBlock(PartitionTxData pd)
        {
            var sd             = pd.SymbolData[_fileID];
            var newBlockOffset = pd.AppendOffset[_fileID];

            var currentBlockOffset = sd.KeyBlockOffset;

            CheckKeyBlockOffset(currentBlockOffset);

            var currentBlockLen = sd.KeyBlockSize;

            if (currentBlockLen > 0)
            {
                var keyBlockBuff = pd.ReadCache.AllocateCopyKeyBlockArray(currentBlockLen);
                _kData.ReadBytes(currentBlockOffset, keyBlockBuff, 0, currentBlockLen);
                _kData.WriteBytes(newBlockOffset, keyBlockBuff, 0, currentBlockLen);

                sd.KeyBlockOffset  = newBlockOffset;
                sd.KeyBlockCreated = true;
            }
        }