1from __future__ import absolute_import 2 3from ._snappy_cffi import ffi, lib 4 5try: 6 unicode # Python 2 7except NameError: 8 unicode = str # Python 3 9 10 11class UncompressError(Exception): 12 pass 13 14 15class SnappyBufferSmallError(Exception): 16 pass 17 18 19def prepare(data): 20 _out_data = None 21 _out_size = None 22 23 _out_data = ffi.from_buffer(data) 24 _out_size = ffi.cast('size_t', len(data)) 25 26 return (_out_data, _out_size) 27 28 29def compress(data): 30 if isinstance(data, unicode): 31 data = data.encode('utf-8') 32 33 _input_data, _input_size = prepare(data) 34 35 max_compressed = lib.snappy_max_compressed_length(_input_size) 36 37 _out_data = ffi.new('char[]', max_compressed) 38 _out_size = ffi.new('size_t*', max_compressed) 39 40 rc = lib.snappy_compress(_input_data, _input_size, _out_data, _out_size) 41 42 if rc != lib.SNAPPY_OK: 43 raise SnappyBufferSmallError() 44 45 value = ffi.buffer(ffi.cast('char*', _out_data), _out_size[0]) 46 47 return value[:] 48 49 50def uncompress(data): 51 _out_data, _out_size = prepare(data) 52 53 result = ffi.new('size_t*', 0) 54 55 rc = lib.snappy_validate_compressed_buffer(_out_data, _out_size) 56 57 if not rc == lib.SNAPPY_OK: 58 raise UncompressError() 59 60 rc = lib.snappy_uncompressed_length(_out_data, 61 _out_size, 62 result) 63 64 if not rc == lib.SNAPPY_OK: 65 raise UncompressError() 66 67 _uncompressed_data = ffi.new('char[]', result[0]) 68 69 rc = lib.snappy_uncompress(_out_data, _out_size, _uncompressed_data, result) 70 71 if rc != lib.SNAPPY_OK: 72 raise UncompressError() 73 74 buf = ffi.buffer(ffi.cast('char*', _uncompressed_data), result[0]) 75 76 return buf[:] 77 78 79def isValidCompressed(data): 80 if isinstance(data, unicode): 81 data = data.encode('utf-8') 82 83 _out_data, _out_size= prepare(data) 84 85 rc = lib.snappy_validate_compressed_buffer(_out_data, _out_size) 86 87 return rc == lib.SNAPPY_OK 88 89decompress = uncompress 90 91def _crc32c(data): 92 c_data = ffi.from_buffer(data) 93 size = ffi.cast('int', len(data)) 94 return int(lib._crc32c(c_data, size)) 95