-- Copyright (c) 2020-present, EMQX, Inc.
-- All rights reserved.
--
-- This source code is distributed under the terms of a MIT license,
-- found in the LICENSE file.
-------------------------------------------------------------------------
-- This module provides constant for client protocols. 
{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}

module Database.ClickHouseDriver.ClientProtocol where

import           Data.ByteString (ByteString)
import           Data.Vector     (Vector, fromList, (!?))


-- Name, version, revision, default DB
_HELLO :: Word
_HELLO :: Word
_HELLO = Word
0 :: Word

-- Query id, settings,
_QUERY :: Word
_QUERY :: Word
_QUERY = Word
1 :: Word

-- A block of data
_DATA :: Word
_DATA :: Word
_DATA = Word
2 :: Word

-- Cancel the query execution
_CANCEL :: Word
_CANCEL :: Word
_CANCEL = Word
3 :: Word

-- Check that the connection to the server is alive
_PING :: Word
_PING :: Word
_PING = Word
4 :: Word

_TABLES_STATUS_REQUEST :: Word
_TABLES_STATUS_REQUEST :: Word
_TABLES_STATUS_REQUEST = Word
5 :: Word

_COMPRESSION_ENABLE :: Word
_COMPRESSION_ENABLE :: Word
_COMPRESSION_ENABLE = Word
1 :: Word

_COMPRESSION_DISABLE :: Word
_COMPRESSION_DISABLE :: Word
_COMPRESSION_DISABLE = Word
0 :: Word

_COMPRESSION_METHOD_LZ4 :: Word
_COMPRESSION_METHOD_LZ4 :: Word
_COMPRESSION_METHOD_LZ4 = Word
1 :: Word

_COMPRESSION_METHOD_LZ4HC :: Word
_COMPRESSION_METHOD_LZ4HC :: Word
_COMPRESSION_METHOD_LZ4HC = Word
2 :: Word

_COMPRESSION_METHOD_ZSTD :: Word
_COMPRESSION_METHOD_ZSTD :: Word
_COMPRESSION_METHOD_ZSTD = Word
3 :: Word

_COMPRESSION_METHOD_BYTE_LZ4 :: Integer
_COMPRESSION_METHOD_BYTE_LZ4 :: Integer
_COMPRESSION_METHOD_BYTE_LZ4 = Integer
0x82

_COMPRESSION_METHOD_BYTE_ZSTD :: Integer
_COMPRESSION_METHOD_BYTE_ZSTD :: Integer
_COMPRESSION_METHOD_BYTE_ZSTD = Integer
0x90

typeStr :: Vector ByteString
typeStr :: Vector ByteString
typeStr = [ByteString] -> Vector ByteString
forall a. [a] -> Vector a
fromList [ByteString
"Hello", ByteString
"Query", ByteString
"Data", ByteString
"Cancel", ByteString
"Ping", ByteString
"TablesStatusRequest"]

toString :: Int -> ByteString
toString :: Int -> ByteString
toString Int
n = 
  case Vector ByteString
typeStr Vector ByteString -> Int -> Maybe ByteString
forall a. Vector a -> Int -> Maybe a
!? Int
n of
    Maybe ByteString
Nothing -> ByteString
"Unknown Packet"
    Just ByteString
t -> ByteString
t