Exemple #1
0
            public MetaInfoObjExtractor(CompressionKind compressionKind, int bufferSize, int metadataSize,
                                        ByteBuffer footerBuffer)
            {
                this.compressionKind = compressionKind;
                this.bufferSize      = bufferSize;
                this.codec           = WriterImpl.createCodec(compressionKind);
                this.metadataSize    = metadataSize;

                int position         = footerBuffer.position();
                int footerBufferSize = footerBuffer.limit() - footerBuffer.position() - metadataSize;

                this.metadata = extractMetadata(footerBuffer, position, metadataSize, codec, bufferSize);
                this.footer   = extractFooter(
                    footerBuffer, position + metadataSize, footerBufferSize, codec, bufferSize);

                footerBuffer.position(position);
                this.inspector = OrcStruct.createObjectInspector(0, footer.TypesList);
            }
Exemple #2
0
        /** Extracts the necessary metadata from an externally store buffer (fullFooterBuffer). */
        public static FooterInfo extractMetaInfoFromFooter(ByteBuffer bb, string srcPath)
        {
            // Read the PostScript. Be very careful as some parts of this historically use bb position
            // and some use absolute offsets that have to take position into account.
            int baseOffset     = bb.position();
            int lastByteAbsPos = baseOffset + bb.remaining() - 1;
            int psLen          = bb.get(lastByteAbsPos) & 0xff;
            int psAbsPos       = lastByteAbsPos - psLen;

            OrcProto.PostScript ps = extractPostScript(bb, srcPath, psLen, psAbsPos);
            Debug.Assert(baseOffset == bb.position());

            // Extract PS information.
            int footerSize = (int)ps.FooterLength, metadataSize = (int)ps.MetadataLength,
                footerAbsPos = psAbsPos - footerSize, metadataAbsPos = footerAbsPos - metadataSize;
            CompressionKind  compressionKind = (CompressionKind)Enum.Parse(typeof(CompressionKind), ps.Compression.ToString(), true);
            CompressionCodec codec           = WriterImpl.createCodec(compressionKind);
            int bufferSize                   = (int)ps.CompressionBlockSize;

            bb.position(metadataAbsPos);
            bb.mark();

            // Extract metadata and footer.
            OrcProto.Metadata metadata = extractMetadata(
                bb, metadataAbsPos, metadataSize, codec, bufferSize);
            List <StripeStatistics> stats = new List <StripeStatistics>(metadata.StripeStatsCount);

            foreach (OrcProto.StripeStatistics ss in metadata.StripeStatsList)
            {
                stats.Add(new StripeStatistics(ss.ColStatsList));
            }
            OrcProto.Footer footer = extractFooter(bb, footerAbsPos, footerSize, codec, bufferSize);
            bb.position(metadataAbsPos);
            bb.limit(psAbsPos);
            // TODO: do we need footer buffer here? FileInfo/FileMetaInfo is a mess...
            FileMetaInfo fmi = new FileMetaInfo(
                compressionKind, bufferSize, metadataSize, bb, extractWriterVersion(ps));

            return(new FooterInfo(stats, footer, fmi));
        }