module ClickHaskell.Protocol.Client where

-- Internal
import ClickHaskell.Primitive
import ClickHaskell.Protocol.Data (DataPacket)
import ClickHaskell.Protocol.Settings (DbSettings(..))

-- GHC
import Data.Int
import GHC.Generics
import Data.ByteString as BS (null)


-- * Client packets

data ClientPacket where
  Hello                     :: HelloPacket -> ClientPacket
  Query                     :: QueryPacket -> ClientPacket
  Data                      :: DataPacket -> ClientPacket
  Cancel                    :: ClientPacket
  Ping                      :: ClientPacket
  TablesStatusRequest       :: ClientPacket
  KeepAlive                 :: ClientPacket
  Scalar                    :: ClientPacket
  IgnoredPartUUIDs          :: ClientPacket
  ReadTaskResponse          :: ClientPacket
  MergeTreeReadTaskResponse :: ClientPacket
  SSHChallengeRequest       :: ClientPacket
  SSHChallengeResponse      :: ClientPacket
  deriving ((forall x. ClientPacket -> Rep ClientPacket x)
-> (forall x. Rep ClientPacket x -> ClientPacket)
-> Generic ClientPacket
forall x. Rep ClientPacket x -> ClientPacket
forall x. ClientPacket -> Rep ClientPacket x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ClientPacket -> Rep ClientPacket x
from :: forall x. ClientPacket -> Rep ClientPacket x
$cto :: forall x. Rep ClientPacket x -> ClientPacket
to :: forall x. Rep ClientPacket x -> ClientPacket
Generic)

instance Serializable ClientPacket where
  serialize :: ProtocolRevision -> ClientPacket -> Builder
serialize ProtocolRevision
rev ClientPacket
packet = case ClientPacket
packet of
    (Hello HelloPacket
p)                   -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
0 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ProtocolRevision -> HelloPacket -> Builder
forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize ProtocolRevision
rev HelloPacket
p
    (Query QueryPacket
p)                   -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
1 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ProtocolRevision -> QueryPacket -> Builder
forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize ProtocolRevision
rev QueryPacket
p
    (Data DataPacket
p)                    -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
2 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ProtocolRevision -> DataPacket -> Builder
forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize ProtocolRevision
rev DataPacket
p
    (ClientPacket
Cancel)                    -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
3
    (ClientPacket
Ping)                      -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
4
    (ClientPacket
TablesStatusRequest)       -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
5
    (ClientPacket
KeepAlive)                 -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
6
    (ClientPacket
Scalar)                    -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
7
    (ClientPacket
IgnoredPartUUIDs)          -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
8
    (ClientPacket
ReadTaskResponse)          -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
9
    (ClientPacket
MergeTreeReadTaskResponse) -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
10
    (ClientPacket
SSHChallengeRequest)       -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
11
    (ClientPacket
SSHChallengeResponse)      -> forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev UVarInt
12
  deserialize :: ProtocolRevision -> Get ClientPacket
deserialize ProtocolRevision
rev = do
    code <- forall chType.
Serializable chType =>
ProtocolRevision -> Get chType
deserialize @UVarInt ProtocolRevision
rev
    case code of
      UVarInt
0 -> HelloPacket -> ClientPacket
Hello (HelloPacket -> ClientPacket)
-> Get HelloPacket -> Get ClientPacket
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ProtocolRevision -> Get HelloPacket
forall chType.
Serializable chType =>
ProtocolRevision -> Get chType
deserialize ProtocolRevision
rev
      UVarInt
1 -> QueryPacket -> ClientPacket
Query (QueryPacket -> ClientPacket)
-> Get QueryPacket -> Get ClientPacket
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ProtocolRevision -> Get QueryPacket
forall chType.
Serializable chType =>
ProtocolRevision -> Get chType
deserialize ProtocolRevision
rev
      UVarInt
2 -> DataPacket -> ClientPacket
Data (DataPacket -> ClientPacket) -> Get DataPacket -> Get ClientPacket
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ProtocolRevision -> Get DataPacket
forall chType.
Serializable chType =>
ProtocolRevision -> Get chType
deserialize ProtocolRevision
rev
      UVarInt
3 -> ClientPacket -> Get ClientPacket
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ClientPacket
Cancel
      UVarInt
4 -> ClientPacket -> Get ClientPacket
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ClientPacket
Ping
      UVarInt
5 -> ClientPacket -> Get ClientPacket
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ClientPacket
TablesStatusRequest
      UVarInt
6 -> ClientPacket -> Get ClientPacket
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ClientPacket
KeepAlive
      UVarInt
7 -> ClientPacket -> Get ClientPacket
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ClientPacket
Scalar
      UVarInt
8 -> ClientPacket -> Get ClientPacket
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ClientPacket
IgnoredPartUUIDs
      UVarInt
9 -> ClientPacket -> Get ClientPacket
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ClientPacket
ReadTaskResponse
      UVarInt
10 -> ClientPacket -> Get ClientPacket
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ClientPacket
MergeTreeReadTaskResponse
      UVarInt
11 -> ClientPacket -> Get ClientPacket
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ClientPacket
SSHChallengeRequest
      UVarInt
12 -> ClientPacket -> Get ClientPacket
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ClientPacket
SSHChallengeResponse
      UVarInt
num -> String -> Get ClientPacket
forall a. String -> Get a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Unknown client packet " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> UVarInt -> String
forall a. Show a => a -> String
show UVarInt
num)

-- ** Hello

data HelloPacket = MkHelloPacket
  { HelloPacket -> ChString
client_name          :: ChString
  , HelloPacket -> UVarInt
client_version_major :: UVarInt
  , HelloPacket -> UVarInt
client_version_minor :: UVarInt
  , HelloPacket -> ProtocolRevision
tcp_protocol_version :: ProtocolRevision
  , HelloPacket -> ChString
default_database     :: ChString
  , HelloPacket -> ChString
user                 :: ChString
  , HelloPacket -> ChString
pass                 :: ChString
  }
  deriving ((forall x. HelloPacket -> Rep HelloPacket x)
-> (forall x. Rep HelloPacket x -> HelloPacket)
-> Generic HelloPacket
forall x. Rep HelloPacket x -> HelloPacket
forall x. HelloPacket -> Rep HelloPacket x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. HelloPacket -> Rep HelloPacket x
from :: forall x. HelloPacket -> Rep HelloPacket x
$cto :: forall x. Rep HelloPacket x -> HelloPacket
to :: forall x. Rep HelloPacket x -> HelloPacket
Generic, ProtocolRevision -> Get HelloPacket
ProtocolRevision -> HelloPacket -> Builder
(ProtocolRevision -> HelloPacket -> Builder)
-> (ProtocolRevision -> Get HelloPacket)
-> Serializable HelloPacket
forall chType.
(ProtocolRevision -> chType -> Builder)
-> (ProtocolRevision -> Get chType) -> Serializable chType
$cserialize :: ProtocolRevision -> HelloPacket -> Builder
serialize :: ProtocolRevision -> HelloPacket -> Builder
$cdeserialize :: ProtocolRevision -> Get HelloPacket
deserialize :: ProtocolRevision -> Get HelloPacket
Serializable)

mkHelloPacket :: String -> String -> String -> ProtocolRevision -> ClientPacket
mkHelloPacket :: String -> String -> String -> ProtocolRevision -> ClientPacket
mkHelloPacket String
db String
user String
pass ProtocolRevision
rev =
  HelloPacket -> ClientPacket
Hello
    MkHelloPacket
      { client_name :: ChString
client_name          = ChString
clientName
      , client_version_major :: UVarInt
client_version_major = UVarInt
major
      , client_version_minor :: UVarInt
client_version_minor = UVarInt
minor
      , tcp_protocol_version :: ProtocolRevision
tcp_protocol_version = ProtocolRevision
rev
      , default_database :: ChString
default_database     = String -> ChString
forall chType userType.
ToChType chType userType =>
userType -> chType
toChType String
db
      , user :: ChString
user                 = String -> ChString
forall chType userType.
ToChType chType userType =>
userType -> chType
toChType String
user
      , pass :: ChString
pass                 = String -> ChString
forall chType userType.
ToChType chType userType =>
userType -> chType
toChType String
pass
      }


data Addendum = MkAddendum
  { Addendum
-> SinceRevision ChString DBMS_MIN_PROTOCOL_VERSION_WITH_QUOTA_KEY
quota_key :: ChString `SinceRevision` DBMS_MIN_PROTOCOL_VERSION_WITH_QUOTA_KEY
  , Addendum
-> SinceRevision
     ChString DBMS_MIN_PROTOCOL_VERSION_WITH_CHUNKED_PACKETS
proto_send_chunked :: ChString `SinceRevision` DBMS_MIN_PROTOCOL_VERSION_WITH_CHUNKED_PACKETS
  , Addendum
-> SinceRevision
     ChString DBMS_MIN_PROTOCOL_VERSION_WITH_CHUNKED_PACKETS
proto_recv_chunked :: ChString `SinceRevision` DBMS_MIN_PROTOCOL_VERSION_WITH_CHUNKED_PACKETS
  , Addendum
-> SinceRevision
     ProtocolRevision
     DBMS_MIN_REVISION_WITH_VERSIONED_PARALLEL_REPLICAS_PROTOCOL
replicas_version :: ProtocolRevision `SinceRevision` DBMS_MIN_REVISION_WITH_VERSIONED_PARALLEL_REPLICAS_PROTOCOL
  }
  deriving ((forall x. Addendum -> Rep Addendum x)
-> (forall x. Rep Addendum x -> Addendum) -> Generic Addendum
forall x. Rep Addendum x -> Addendum
forall x. Addendum -> Rep Addendum x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Addendum -> Rep Addendum x
from :: forall x. Addendum -> Rep Addendum x
$cto :: forall x. Rep Addendum x -> Addendum
to :: forall x. Rep Addendum x -> Addendum
Generic, ProtocolRevision -> Get Addendum
ProtocolRevision -> Addendum -> Builder
(ProtocolRevision -> Addendum -> Builder)
-> (ProtocolRevision -> Get Addendum) -> Serializable Addendum
forall chType.
(ProtocolRevision -> chType -> Builder)
-> (ProtocolRevision -> Get chType) -> Serializable chType
$cserialize :: ProtocolRevision -> Addendum -> Builder
serialize :: ProtocolRevision -> Addendum -> Builder
$cdeserialize :: ProtocolRevision -> Get Addendum
deserialize :: ProtocolRevision -> Get Addendum
Serializable)

mkAddendum :: Addendum
mkAddendum :: Addendum
mkAddendum = MkAddendum
  { quota_key :: SinceRevision ChString DBMS_MIN_PROTOCOL_VERSION_WITH_QUOTA_KEY
quota_key          = ChString
-> SinceRevision ChString DBMS_MIN_PROTOCOL_VERSION_WITH_QUOTA_KEY
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision ChString
""
  , proto_send_chunked :: SinceRevision
  ChString DBMS_MIN_PROTOCOL_VERSION_WITH_CHUNKED_PACKETS
proto_send_chunked = ChString
-> SinceRevision
     ChString DBMS_MIN_PROTOCOL_VERSION_WITH_CHUNKED_PACKETS
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision ChString
"notchunked"
  , proto_recv_chunked :: SinceRevision
  ChString DBMS_MIN_PROTOCOL_VERSION_WITH_CHUNKED_PACKETS
proto_recv_chunked = ChString
-> SinceRevision
     ChString DBMS_MIN_PROTOCOL_VERSION_WITH_CHUNKED_PACKETS
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision ChString
"notchunked"
  , replicas_version :: SinceRevision
  ProtocolRevision
  DBMS_MIN_REVISION_WITH_VERSIONED_PARALLEL_REPLICAS_PROTOCOL
replicas_version   = ProtocolRevision
-> SinceRevision
     ProtocolRevision
     DBMS_MIN_REVISION_WITH_VERSIONED_PARALLEL_REPLICAS_PROTOCOL
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision (ProtocolRevision
 -> SinceRevision
      ProtocolRevision
      DBMS_MIN_REVISION_WITH_VERSIONED_PARALLEL_REPLICAS_PROTOCOL)
-> ProtocolRevision
-> SinceRevision
     ProtocolRevision
     DBMS_MIN_REVISION_WITH_VERSIONED_PARALLEL_REPLICAS_PROTOCOL
forall a b. (a -> b) -> a -> b
$ forall (nat :: Nat). KnownNat nat => ProtocolRevision
mkRev @DBMS_PARALLEL_REPLICAS_PROTOCOL_VERSION
  }

-- ** Query

data QueryPacket = MkQueryPacket
  { QueryPacket -> ChString
query_id           :: ChString
  , QueryPacket
-> SinceRevision ClientInfo DBMS_MIN_REVISION_WITH_CLIENT_INFO
client_info        :: ClientInfo `SinceRevision` DBMS_MIN_REVISION_WITH_CLIENT_INFO
  , QueryPacket -> DbSettings
settings           :: DbSettings
  , QueryPacket
-> SinceRevision
     UVarInt
     DBMS_MIN_PROTOCOL_VERSION_WITH_INTERSERVER_EXTERNALLY_GRANTED_ROLES
external_roles     :: UVarInt `SinceRevision` DBMS_MIN_PROTOCOL_VERSION_WITH_INTERSERVER_EXTERNALLY_GRANTED_ROLES
  , QueryPacket
-> SinceRevision ChString DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET
interserver_secret :: ChString `SinceRevision` DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET
  , QueryPacket -> QueryStage
query_stage        :: QueryStage
  , QueryPacket -> UVarInt
compression        :: UVarInt
  , QueryPacket -> ChString
query              :: ChString
  , QueryPacket
-> SinceRevision
     QueryParameters DBMS_MIN_PROTOCOL_VERSION_WITH_PARAMETERS
parameters         :: QueryParameters `SinceRevision` DBMS_MIN_PROTOCOL_VERSION_WITH_PARAMETERS
  }
  deriving ((forall x. QueryPacket -> Rep QueryPacket x)
-> (forall x. Rep QueryPacket x -> QueryPacket)
-> Generic QueryPacket
forall x. Rep QueryPacket x -> QueryPacket
forall x. QueryPacket -> Rep QueryPacket x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. QueryPacket -> Rep QueryPacket x
from :: forall x. QueryPacket -> Rep QueryPacket x
$cto :: forall x. Rep QueryPacket x -> QueryPacket
to :: forall x. Rep QueryPacket x -> QueryPacket
Generic, ProtocolRevision -> Get QueryPacket
ProtocolRevision -> QueryPacket -> Builder
(ProtocolRevision -> QueryPacket -> Builder)
-> (ProtocolRevision -> Get QueryPacket)
-> Serializable QueryPacket
forall chType.
(ProtocolRevision -> chType -> Builder)
-> (ProtocolRevision -> Get chType) -> Serializable chType
$cserialize :: ProtocolRevision -> QueryPacket -> Builder
serialize :: ProtocolRevision -> QueryPacket -> Builder
$cdeserialize :: ProtocolRevision -> Get QueryPacket
deserialize :: ProtocolRevision -> Get QueryPacket
Serializable)

data QueryPacketArgs = MkQueryPacketArgs
  { QueryPacketArgs -> ChString
initial_user :: ChString
  , QueryPacketArgs -> ChString
hostname     :: ChString
  , QueryPacketArgs -> ChString
os_user      :: ChString
  , QueryPacketArgs -> ChString
query        :: ChString
  , QueryPacketArgs -> DbSettings
settings     :: DbSettings
  , QueryPacketArgs -> ProtocolRevision
revision     :: ProtocolRevision
  }

mkQueryPacket :: QueryPacketArgs -> ClientPacket
mkQueryPacket :: QueryPacketArgs -> ClientPacket
mkQueryPacket MkQueryPacketArgs{ChString
initial_user :: QueryPacketArgs -> ChString
initial_user :: ChString
initial_user, ChString
os_user :: QueryPacketArgs -> ChString
os_user :: ChString
os_user, ChString
hostname :: QueryPacketArgs -> ChString
hostname :: ChString
hostname, ChString
query :: QueryPacketArgs -> ChString
query :: ChString
query, DbSettings
settings :: QueryPacketArgs -> DbSettings
settings :: DbSettings
settings, ProtocolRevision
revision :: QueryPacketArgs -> ProtocolRevision
revision :: ProtocolRevision
revision} =
  QueryPacket -> ClientPacket
Query
    MkQueryPacket
      { query_id :: ChString
query_id = ChString
""
      , client_info :: SinceRevision ClientInfo DBMS_MIN_REVISION_WITH_CLIENT_INFO
client_info  = ClientInfo
-> SinceRevision ClientInfo DBMS_MIN_REVISION_WITH_CLIENT_INFO
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision MkClientInfo
        { query_kind :: QueryKind
query_kind                   = QueryKind
InitialQuery
        , ChString
initial_user :: ChString
initial_user :: ChString
initial_user
        , initial_query_id :: ChString
initial_query_id             = ChString
""
        , initial_adress :: ChString
initial_adress               = ChString
"0.0.0.0:0"
        , initial_time :: SinceRevision
  Int64 DBMS_MIN_PROTOCOL_VERSION_WITH_INITIAL_QUERY_START_TIME
initial_time                 = Int64
-> SinceRevision
     Int64 DBMS_MIN_PROTOCOL_VERSION_WITH_INITIAL_QUERY_START_TIME
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision Int64
0
        , interface_type :: UInt8
interface_type               = UInt8
1 -- [tcp - 1, http - 2]
        , ChString
os_user :: ChString
os_user :: ChString
os_user
        , ChString
hostname :: ChString
hostname :: ChString
hostname
        , client_name :: ChString
client_name                  = ChString
clientName
        , client_version_major :: UVarInt
client_version_major         = UVarInt
major
        , client_version_minor :: UVarInt
client_version_minor         = UVarInt
minor
        , client_revision :: ProtocolRevision
client_revision              = ProtocolRevision
revision
        , quota_key :: SinceRevision
  ChString DBMS_MIN_REVISION_WITH_QUOTA_KEY_IN_CLIENT_INFO
quota_key                    = ChString
-> SinceRevision
     ChString DBMS_MIN_REVISION_WITH_QUOTA_KEY_IN_CLIENT_INFO
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision ChString
""
        , distrubuted_depth :: SinceRevision
  UVarInt DBMS_MIN_PROTOCOL_VERSION_WITH_DISTRIBUTED_DEPTH
distrubuted_depth            = UVarInt
-> SinceRevision
     UVarInt DBMS_MIN_PROTOCOL_VERSION_WITH_DISTRIBUTED_DEPTH
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision UVarInt
0
        , client_version_patch :: SinceRevision UVarInt DBMS_MIN_REVISION_WITH_VERSION_PATCH
client_version_patch         = UVarInt
-> SinceRevision UVarInt DBMS_MIN_REVISION_WITH_VERSION_PATCH
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision UVarInt
patch
        , open_telemetry :: SinceRevision UInt8 DBMS_MIN_REVISION_WITH_OPENTELEMETRY
open_telemetry               = UInt8 -> SinceRevision UInt8 DBMS_MIN_REVISION_WITH_OPENTELEMETRY
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision UInt8
0
        , collaborate_with_initiator :: SinceRevision UVarInt DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS
collaborate_with_initiator   = UVarInt
-> SinceRevision UVarInt DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision UVarInt
0
        , count_participating_replicas :: SinceRevision UVarInt DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS
count_participating_replicas = UVarInt
-> SinceRevision UVarInt DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision UVarInt
0
        , number_of_current_replica :: SinceRevision UVarInt DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS
number_of_current_replica    = UVarInt
-> SinceRevision UVarInt DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision UVarInt
0
        , script_query_number :: SinceRevision UVarInt DBMS_MIN_REVISION_WITH_QUERY_AND_LINE_NUMBERS
script_query_number          = UVarInt
-> SinceRevision
     UVarInt DBMS_MIN_REVISION_WITH_QUERY_AND_LINE_NUMBERS
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision UVarInt
0
        , script_line_number :: SinceRevision UVarInt DBMS_MIN_REVISION_WITH_QUERY_AND_LINE_NUMBERS
script_line_number           = UVarInt
-> SinceRevision
     UVarInt DBMS_MIN_REVISION_WITH_QUERY_AND_LINE_NUMBERS
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision UVarInt
0
        , jwt :: SinceRevision Jwt DBMS_MIN_REVISON_WITH_JWT_IN_INTERSERVER
jwt                          = Jwt -> SinceRevision Jwt DBMS_MIN_REVISON_WITH_JWT_IN_INTERSERVER
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision (ChString -> Jwt
MkJwt ChString
"")
        }
      , DbSettings
settings :: DbSettings
settings :: DbSettings
settings
      , interserver_secret :: SinceRevision ChString DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET
interserver_secret = ChString
-> SinceRevision ChString DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision ChString
""
      , query_stage :: QueryStage
query_stage        = QueryStage
Complete
      , compression :: UVarInt
compression        = UVarInt
0
      , ChString
query :: ChString
query :: ChString
query
      , parameters :: SinceRevision
  QueryParameters DBMS_MIN_PROTOCOL_VERSION_WITH_PARAMETERS
parameters         = QueryParameters
-> SinceRevision
     QueryParameters DBMS_MIN_PROTOCOL_VERSION_WITH_PARAMETERS
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision QueryParameters
MkQueryParameters
      , external_roles :: SinceRevision
  UVarInt
  DBMS_MIN_PROTOCOL_VERSION_WITH_INTERSERVER_EXTERNALLY_GRANTED_ROLES
external_roles     = UVarInt
-> SinceRevision
     UVarInt
     DBMS_MIN_PROTOCOL_VERSION_WITH_INTERSERVER_EXTERNALLY_GRANTED_ROLES
forall (revisionNumber :: Nat) b a.
a -> Revisioned revisionNumber b a
AfterRevision UVarInt
0
      }

data QueryParameters = MkQueryParameters
instance Serializable QueryParameters where
  serialize :: ProtocolRevision -> QueryParameters -> Builder
serialize ProtocolRevision
rev QueryParameters
_ =
    forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @ChString ProtocolRevision
rev ChString
""
  deserialize :: ProtocolRevision -> Get QueryParameters
deserialize ProtocolRevision
_rev =
    String -> Get QueryParameters
forall a. String -> Get a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"QueryParameters reading unimplemented"

data QueryStage
  = FetchColumns | WithMergeableState | Complete
  | WithMergeableStateAfterAggregation
  | WithMergeableStateAfterAggregationAndLimit
  deriving (Int -> QueryStage
QueryStage -> Int
QueryStage -> [QueryStage]
QueryStage -> QueryStage
QueryStage -> QueryStage -> [QueryStage]
QueryStage -> QueryStage -> QueryStage -> [QueryStage]
(QueryStage -> QueryStage)
-> (QueryStage -> QueryStage)
-> (Int -> QueryStage)
-> (QueryStage -> Int)
-> (QueryStage -> [QueryStage])
-> (QueryStage -> QueryStage -> [QueryStage])
-> (QueryStage -> QueryStage -> [QueryStage])
-> (QueryStage -> QueryStage -> QueryStage -> [QueryStage])
-> Enum QueryStage
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: QueryStage -> QueryStage
succ :: QueryStage -> QueryStage
$cpred :: QueryStage -> QueryStage
pred :: QueryStage -> QueryStage
$ctoEnum :: Int -> QueryStage
toEnum :: Int -> QueryStage
$cfromEnum :: QueryStage -> Int
fromEnum :: QueryStage -> Int
$cenumFrom :: QueryStage -> [QueryStage]
enumFrom :: QueryStage -> [QueryStage]
$cenumFromThen :: QueryStage -> QueryStage -> [QueryStage]
enumFromThen :: QueryStage -> QueryStage -> [QueryStage]
$cenumFromTo :: QueryStage -> QueryStage -> [QueryStage]
enumFromTo :: QueryStage -> QueryStage -> [QueryStage]
$cenumFromThenTo :: QueryStage -> QueryStage -> QueryStage -> [QueryStage]
enumFromThenTo :: QueryStage -> QueryStage -> QueryStage -> [QueryStage]
Enum)

instance Serializable QueryStage where
  serialize :: ProtocolRevision -> QueryStage -> Builder
serialize ProtocolRevision
rev = forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UVarInt ProtocolRevision
rev (UVarInt -> Builder)
-> (QueryStage -> UVarInt) -> QueryStage -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> UVarInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> UVarInt) -> (QueryStage -> Int) -> QueryStage -> UVarInt
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QueryStage -> Int
forall a. Enum a => a -> Int
fromEnum
  deserialize :: ProtocolRevision -> Get QueryStage
deserialize ProtocolRevision
rev = do
    queryStageCode <- forall chType.
Serializable chType =>
ProtocolRevision -> Get chType
deserialize @UVarInt ProtocolRevision
rev
    case queryStageCode of
      UVarInt
0 -> QueryStage -> Get QueryStage
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure QueryStage
FetchColumns
      UVarInt
1 -> QueryStage -> Get QueryStage
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure QueryStage
WithMergeableState
      UVarInt
2 -> QueryStage -> Get QueryStage
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure QueryStage
Complete
      UVarInt
3 -> QueryStage -> Get QueryStage
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure QueryStage
WithMergeableStateAfterAggregation
      UVarInt
4 -> QueryStage -> Get QueryStage
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure QueryStage
WithMergeableStateAfterAggregationAndLimit
      UVarInt
num -> String -> Get QueryStage
forall a. String -> Get a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Unknown QueryStage " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> UVarInt -> String
forall a. Show a => a -> String
show UVarInt
num)


data ClientInfo = MkClientInfo
  { ClientInfo -> QueryKind
query_kind                   :: QueryKind
  , ClientInfo -> ChString
initial_user                 :: ChString
  , ClientInfo -> ChString
initial_query_id             :: ChString
  , ClientInfo -> ChString
initial_adress               :: ChString
  , ClientInfo
-> SinceRevision
     Int64 DBMS_MIN_PROTOCOL_VERSION_WITH_INITIAL_QUERY_START_TIME
initial_time                 :: Int64 `SinceRevision` DBMS_MIN_PROTOCOL_VERSION_WITH_INITIAL_QUERY_START_TIME
  , ClientInfo -> UInt8
interface_type               :: UInt8
  , ClientInfo -> ChString
os_user                      :: ChString
  , ClientInfo -> ChString
hostname                     :: ChString
  , ClientInfo -> ChString
client_name                  :: ChString
  , ClientInfo -> UVarInt
client_version_major         :: UVarInt
  , ClientInfo -> UVarInt
client_version_minor         :: UVarInt
  , ClientInfo -> ProtocolRevision
client_revision              :: ProtocolRevision
  , ClientInfo
-> SinceRevision
     ChString DBMS_MIN_REVISION_WITH_QUOTA_KEY_IN_CLIENT_INFO
quota_key                    :: ChString `SinceRevision` DBMS_MIN_REVISION_WITH_QUOTA_KEY_IN_CLIENT_INFO
  , ClientInfo
-> SinceRevision
     UVarInt DBMS_MIN_PROTOCOL_VERSION_WITH_DISTRIBUTED_DEPTH
distrubuted_depth            :: UVarInt `SinceRevision` DBMS_MIN_PROTOCOL_VERSION_WITH_DISTRIBUTED_DEPTH
  , ClientInfo
-> SinceRevision UVarInt DBMS_MIN_REVISION_WITH_VERSION_PATCH
client_version_patch         :: UVarInt `SinceRevision` DBMS_MIN_REVISION_WITH_VERSION_PATCH
  , ClientInfo
-> SinceRevision UInt8 DBMS_MIN_REVISION_WITH_OPENTELEMETRY
open_telemetry               :: UInt8 `SinceRevision` DBMS_MIN_REVISION_WITH_OPENTELEMETRY
  , ClientInfo
-> SinceRevision UVarInt DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS
collaborate_with_initiator   :: UVarInt `SinceRevision` DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS
  , ClientInfo
-> SinceRevision UVarInt DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS
count_participating_replicas :: UVarInt `SinceRevision` DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS
  , ClientInfo
-> SinceRevision UVarInt DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS
number_of_current_replica    :: UVarInt `SinceRevision` DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS
  , ClientInfo
-> SinceRevision
     UVarInt DBMS_MIN_REVISION_WITH_QUERY_AND_LINE_NUMBERS
script_query_number          :: UVarInt `SinceRevision` DBMS_MIN_REVISION_WITH_QUERY_AND_LINE_NUMBERS
  , ClientInfo
-> SinceRevision
     UVarInt DBMS_MIN_REVISION_WITH_QUERY_AND_LINE_NUMBERS
script_line_number           :: UVarInt `SinceRevision` DBMS_MIN_REVISION_WITH_QUERY_AND_LINE_NUMBERS
  , ClientInfo
-> SinceRevision Jwt DBMS_MIN_REVISON_WITH_JWT_IN_INTERSERVER
jwt                          :: Jwt `SinceRevision` DBMS_MIN_REVISON_WITH_JWT_IN_INTERSERVER
  }
  deriving ((forall x. ClientInfo -> Rep ClientInfo x)
-> (forall x. Rep ClientInfo x -> ClientInfo) -> Generic ClientInfo
forall x. Rep ClientInfo x -> ClientInfo
forall x. ClientInfo -> Rep ClientInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ClientInfo -> Rep ClientInfo x
from :: forall x. ClientInfo -> Rep ClientInfo x
$cto :: forall x. Rep ClientInfo x -> ClientInfo
to :: forall x. Rep ClientInfo x -> ClientInfo
Generic, ProtocolRevision -> Get ClientInfo
ProtocolRevision -> ClientInfo -> Builder
(ProtocolRevision -> ClientInfo -> Builder)
-> (ProtocolRevision -> Get ClientInfo) -> Serializable ClientInfo
forall chType.
(ProtocolRevision -> chType -> Builder)
-> (ProtocolRevision -> Get chType) -> Serializable chType
$cserialize :: ProtocolRevision -> ClientInfo -> Builder
serialize :: ProtocolRevision -> ClientInfo -> Builder
$cdeserialize :: ProtocolRevision -> Get ClientInfo
deserialize :: ProtocolRevision -> Get ClientInfo
Serializable)

data QueryKind = NoQuery | InitialQuery | SecondaryQuery
instance Serializable QueryKind where
  serialize :: ProtocolRevision -> QueryKind -> Builder
serialize ProtocolRevision
rev QueryKind
kind = forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UInt8 ProtocolRevision
rev (UInt8 -> Builder) -> UInt8 -> Builder
forall a b. (a -> b) -> a -> b
$
    case QueryKind
kind of
      QueryKind
NoQuery -> UInt8
1
      QueryKind
InitialQuery -> UInt8
2
      QueryKind
SecondaryQuery -> UInt8
3
  deserialize :: ProtocolRevision -> Get QueryKind
deserialize ProtocolRevision
rev = do
    kindCode <- forall chType.
Serializable chType =>
ProtocolRevision -> Get chType
deserialize @UInt8 ProtocolRevision
rev
    case kindCode of
      UInt8
1 -> QueryKind -> Get QueryKind
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure QueryKind
NoQuery
      UInt8
2 -> QueryKind -> Get QueryKind
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure QueryKind
InitialQuery
      UInt8
3 -> QueryKind -> Get QueryKind
forall a. a -> Get a
forall (f :: * -> *) a. Applicative f => a -> f a
pure QueryKind
SecondaryQuery
      UInt8
num -> String -> Get QueryKind
forall a. String -> Get a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"Unknown QueryKind " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> UInt8 -> String
forall a. Show a => a -> String
show UInt8
num)

data Jwt = MkJwt ChString
instance Serializable Jwt where
  serialize :: ProtocolRevision -> Jwt -> Builder
serialize ProtocolRevision
rev (MkJwt str :: ChString
str@(MkChString ByteString
bs)) =
    if Bool -> Bool
not (ByteString -> Bool
BS.null ByteString
bs)
    then forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UInt8 ProtocolRevision
rev UInt8
1 Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ProtocolRevision -> ChString -> Builder
forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize ProtocolRevision
rev ChString
str
    else forall chType.
Serializable chType =>
ProtocolRevision -> chType -> Builder
serialize @UInt8 ProtocolRevision
rev UInt8
0
  deserialize :: ProtocolRevision -> Get Jwt
deserialize ProtocolRevision
rev = do
    has_jwt <- forall chType.
Serializable chType =>
ProtocolRevision -> Get chType
deserialize @UInt8 ProtocolRevision
rev
    if has_jwt == 1
    then MkJwt <$> deserialize rev
    else pure $ MkJwt ""