packages feed

clickhouse-haskell-0.1.2.0: src/Database/ClickHouseDriver/Pool.hs

-- 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 implementation of Connection pool for TCP network
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE NamedFieldPuns #-}
module Database.ClickHouseDriver.Pool 
(
  createConnectionPool
) where

import Database.ClickHouseDriver.Connection ( tcpConnect )
import Database.ClickHouseDriver.Defines
    ( _DEFAULT_USERNAME,
      _DEFAULT_HOST_NAME,
      _DEFAULT_PASSWORD,
      _DEFAULT_PORT_NAME,
      _DEFAULT_DATABASE,
      _DEFAULT_COMPRESSION_SETTING )
import Data.Pool ( createPool, Pool )
import Data.Time.Clock ( NominalDiffTime )
import Network.Socket (close)
import Data.Default.Class ( Default(..) )
import Database.ClickHouseDriver.Types
    ( ConnParams(..), TCPConnection(TCPConnection, tcpSocket) )

-- | default connection parameters (settings)
instance Default ConnParams where
    def = ConnParams{
       username'    = _DEFAULT_USERNAME
      ,host'        = _DEFAULT_HOST_NAME
      ,port'        = _DEFAULT_PORT_NAME
      ,password'    = _DEFAULT_PASSWORD
      ,compression' = _DEFAULT_COMPRESSION_SETTING
      ,database'    = _DEFAULT_DATABASE
    }

-- | Create connection pool
createConnectionPool :: ConnParams
                      -- ^ parameters for basic connection. 
                      ->Int
                      -- ^ number of stripes
                      ->NominalDiffTime
                      -- ^ idleTime for each resource when not using.
                      ->Int
                      -- ^ maximum number of resources.
                      ->IO (Pool TCPConnection)
createConnectionPool
  ConnParams
    { username',
      host',
      port',
      password',
      compression',
      database'
    }
  numStripes
  idleTime
  maxResources = createPool (do
      conn <- tcpConnect host' port' username' password' database' compression'
      case conn of
          Left err -> error err
          Right tcp -> return tcp
      ) (\TCPConnection{tcpSocket=sock}->close sock) 
      numStripes idleTime maxResources