// returns a reader for the right compression func (s *scanner) compressionReader(r io.Reader, header *thrift.PageHeader) (io.Reader, error) { switch s.codec { case thrift.CompressionCodec_GZIP: r, err := gzip.NewReader(r) if err != nil { return nil, fmt.Errorf("could not create gzip reader:%s", err) } b, err := ioutil.ReadAll(r) if err != nil { return nil, fmt.Errorf("could not read gzip reader:%s", err) } if err := r.Close(); err != nil { log.Println("WARNING error closing gzip reader:%s", err) } return bytes.NewReader(b), nil case thrift.CompressionCodec_LZO: // https://github.com/rasky/go-lzo/blob/master/decompress.go#L149 s.r = r return nil, fmt.Errorf("NYI") case thrift.CompressionCodec_SNAPPY: src, err := ioutil.ReadAll(r) if err != nil { return nil, fmt.Errorf("could not create gzip reader:%s", err) } out := make([]byte, int(header.GetUncompressedPageSize())) out, err = snappy.Decode(out, src) if err != nil { return nil, fmt.Errorf("could not create gzip reader:%s", err) } return bytes.NewReader(out), nil case thrift.CompressionCodec_UNCOMPRESSED: // use the same reader return r, nil default: return nil, fmt.Errorf("unknown compression format %s", s.codec) } }