| 127 | } |
| 128 | |
| 129 | func gzipCompress(level int, data []byte) ([]byte, error) { |
| 130 | var ( |
| 131 | buf bytes.Buffer |
| 132 | writer *gzip.Writer |
| 133 | pool *sync.Pool |
| 134 | ) |
| 135 | |
| 136 | switch level { |
| 137 | case CompressionLevelDefault: |
| 138 | pool = &gzipWriterPool |
| 139 | case 1: |
| 140 | pool = &gzipWriterPoolForCompressionLevel1 |
| 141 | case 2: |
| 142 | pool = &gzipWriterPoolForCompressionLevel2 |
| 143 | case 3: |
| 144 | pool = &gzipWriterPoolForCompressionLevel3 |
| 145 | case 4: |
| 146 | pool = &gzipWriterPoolForCompressionLevel4 |
| 147 | case 5: |
| 148 | pool = &gzipWriterPoolForCompressionLevel5 |
| 149 | case 6: |
| 150 | pool = &gzipWriterPoolForCompressionLevel6 |
| 151 | case 7: |
| 152 | pool = &gzipWriterPoolForCompressionLevel7 |
| 153 | case 8: |
| 154 | pool = &gzipWriterPoolForCompressionLevel8 |
| 155 | case 9: |
| 156 | pool = &gzipWriterPoolForCompressionLevel9 |
| 157 | default: |
| 158 | var err error |
| 159 | writer, err = gzip.NewWriterLevel(&buf, level) |
| 160 | if err != nil { |
| 161 | return nil, err |
| 162 | } |
| 163 | } |
| 164 | if pool != nil { |
| 165 | writer = pool.Get().(*gzip.Writer) |
| 166 | writer.Reset(&buf) |
| 167 | defer pool.Put(writer) |
| 168 | } |
| 169 | if _, err := writer.Write(data); err != nil { |
| 170 | return nil, err |
| 171 | } |
| 172 | if err := writer.Close(); err != nil { |
| 173 | return nil, err |
| 174 | } |
| 175 | return buf.Bytes(), nil |
| 176 | } |
| 177 | |
| 178 | func lz4Compress(data []byte) ([]byte, error) { |
| 179 | writer := lz4WriterPool.Get().(*lz4.Writer) |