2012-01-05 10:22:02 +00:00
|
|
|
|
#pragma once
|
2011-06-17 21:19:39 +00:00
|
|
|
|
|
2017-02-07 21:26:32 +00:00
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
2012-01-05 10:22:02 +00:00
|
|
|
|
/** Общие дефайны */
|
2011-06-17 21:19:39 +00:00
|
|
|
|
|
2017-04-01 07:20:54 +00:00
|
|
|
|
#define DBMS_MAX_COMPRESSED_SIZE 0x40000000ULL /// 1GB
|
2012-01-05 18:35:22 +00:00
|
|
|
|
|
2011-06-17 21:19:39 +00:00
|
|
|
|
#define QUICKLZ_ADDITIONAL_SPACE 400
|
2016-02-03 21:16:19 +00:00
|
|
|
|
#define COMPRESSED_BLOCK_HEADER_SIZE 9
|
2012-01-05 18:35:22 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
|
{
|
|
|
|
|
|
2015-03-09 01:15:43 +00:00
|
|
|
|
/** Метод сжатия */
|
|
|
|
|
enum class CompressionMethod
|
2012-01-05 18:35:22 +00:00
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
|
QuickLZ = 0,
|
|
|
|
|
LZ4 = 1,
|
|
|
|
|
LZ4HC = 2, /// Формат такой же, как у LZ4. Разница только при сжатии.
|
|
|
|
|
ZSTD = 3, /// Экспериментальный алгоритм: https://github.com/Cyan4973/zstd
|
2015-03-09 01:15:43 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** Формат сжатого блока следующий:
|
|
|
|
|
*
|
|
|
|
|
* Первые 16 байт - чексумма от всех остальных байт блока. Сейчас используется только CityHash128.
|
|
|
|
|
* В дальнейшем можно предусмотреть другие чексуммы, хотя сделать их другого размера не получится.
|
|
|
|
|
*
|
|
|
|
|
* Следующий байт определяет алгоритм сжатия. Далее всё зависит от алгоритма.
|
|
|
|
|
*
|
|
|
|
|
* Первые 4 варианта совместимы с QuickLZ level 1.
|
|
|
|
|
* То есть, если значение первого байта < 4, для разжатия достаточно использовать функцию qlz_level1_decompress.
|
|
|
|
|
*
|
|
|
|
|
* 0x00 - несжатые данные, маленький блок. Далее один байт - размер сжатых данных, с учётом заголовка; один байт - размер несжатых данных.
|
|
|
|
|
* 0x01 - сжатые данные, QuickLZ level 1, маленький блок. Далее два байта аналогично.
|
|
|
|
|
* 0x02 - несжатые данные, большой блок. Далее 4 байта - размер сжатых данных, с учётом заголовка; 4 байта - размер несжатых данных.
|
|
|
|
|
* 0x03 - сжатые данные, QuickLZ level 1, большой блок. Далее 8 байт аналогично.
|
|
|
|
|
*
|
|
|
|
|
* 0x82 - LZ4 или LZ4HC (они имеют одинаковый формат).
|
|
|
|
|
* Далее 4 байта - размер сжатых данных, с учётом заголовка; 4 байта - размер несжатых данных.
|
|
|
|
|
*
|
|
|
|
|
* NOTE: Почему 0x82?
|
|
|
|
|
* Изначально использовался только QuickLZ. Потом был добавлен LZ4.
|
|
|
|
|
* Старший бит выставлен, чтобы отличить от QuickLZ, а второй бит выставлен для совместимости,
|
|
|
|
|
* чтобы работали функции qlz_size_compressed, qlz_size_decompressed.
|
|
|
|
|
* Хотя сейчас такая совместимость уже не актуальна.
|
|
|
|
|
*
|
|
|
|
|
* 0x90 - ZSTD
|
|
|
|
|
*
|
|
|
|
|
* Все размеры - little endian.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
enum class CompressionMethodByte : uint8_t
|
|
|
|
|
{
|
2017-04-01 07:20:54 +00:00
|
|
|
|
LZ4 = 0x82,
|
|
|
|
|
ZSTD = 0x90,
|
2015-03-09 01:15:43 +00:00
|
|
|
|
};
|
2012-01-05 18:35:22 +00:00
|
|
|
|
|
|
|
|
|
}
|