clickhouse_write_block.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package clickhouse
  2. import (
  3. "github.com/ClickHouse/clickhouse-go/lib/data"
  4. "github.com/ClickHouse/clickhouse-go/lib/protocol"
  5. )
  6. func (ch *clickhouse) writeBlock(block *data.Block, tableName string) error {
  7. ch.Lock()
  8. defer ch.Unlock()
  9. if err := ch.encoder.Uvarint(protocol.ClientData); err != nil {
  10. return err
  11. }
  12. if err := ch.encoder.String(tableName); err != nil { // temporary table
  13. return err
  14. }
  15. // implement CityHash v 1.0.2 and add LZ4 compression
  16. /*
  17. From Alexey Milovidov
  18. Насколько я помню, сжимаются блоки с данными Native формата, а всё остальное (всякие номера пакетов и т. п.) передаётся без сжатия.
  19. Сжатые данные устроены так. Они представляют собой набор сжатых фреймов.
  20. Каждый фрейм имеет следующий вид:
  21. чексумма (16 байт),
  22. идентификатор алгоритма сжатия (1 байт),
  23. размер сжатых данных (4 байта, little endian, размер не включает в себя чексумму, но включает в себя остальные 9 байт заголовка),
  24. размер несжатых данных (4 байта, little endian), затем сжатые данные.
  25. Идентификатор алгоритма: 0x82 - lz4, 0x90 - zstd.
  26. Чексумма - CityHash128 из CityHash версии 1.0.2, вычисленный от сжатых данных с учётом 9 байт заголовка.
  27. См. CompressedReadBufferBase, CompressedWriteBuffer,
  28. utils/compressor, TCPHandler.
  29. */
  30. ch.encoder.SelectCompress(ch.compress)
  31. err := block.Write(&ch.ServerInfo, ch.encoder)
  32. ch.encoder.SelectCompress(false)
  33. return err
  34. }