module Database.CQL.IO.Types where
import Control.Monad.Catch
import Data.IP
import Data.Text.Lazy (Text)
import Data.Typeable
import Database.CQL.Protocol (Event, Response, CompressionAlgorithm)
import Network.Socket (SockAddr (..), PortNumber)
import System.Logger.Message
type EventHandler = Event -> IO ()
newtype Milliseconds = Ms { ms :: Int } deriving (Eq, Show, Num)
type Raw a = a () () ()
newtype InetAddr = InetAddr { sockAddr :: SockAddr } deriving (Eq, Ord)
instance Show InetAddr where
show (InetAddr (SockAddrInet p a)) =
let i = fromIntegral p :: Int in
shows (fromHostAddress a) . showString ":" . shows i $ ""
show (InetAddr (SockAddrInet6 p _ a _)) =
let i = fromIntegral p :: Int in
shows (fromHostAddress6 a) . showString ":" . shows i $ ""
show (InetAddr (SockAddrUnix unix)) = unix
#if MIN_VERSION_network(2,6,1)
show (InetAddr (SockAddrCan int32)) = show int32
#endif
instance ToBytes InetAddr where
bytes (InetAddr (SockAddrInet p a)) =
let i = fromIntegral p :: Int in
show (fromHostAddress a) +++ val ":" +++ i
bytes (InetAddr (SockAddrInet6 p _ a _)) =
let i = fromIntegral p :: Int in
show (fromHostAddress6 a) +++ val ":" +++ i
bytes (InetAddr (SockAddrUnix unix)) = bytes unix
#if MIN_VERSION_network(2,6,1)
bytes (InetAddr (SockAddrCan int32)) = bytes int32
#endif
ip2inet :: PortNumber -> IP -> InetAddr
ip2inet p (IPv4 a) = InetAddr $ SockAddrInet p (toHostAddress a)
ip2inet p (IPv6 a) = InetAddr $ SockAddrInet6 p 0 (toHostAddress6 a) 0
inet2ip :: InetAddr -> IP
inet2ip (InetAddr (SockAddrInet _ a)) = IPv4 (fromHostAddress a)
inet2ip (InetAddr (SockAddrInet6 _ _ a _)) = IPv6 (fromHostAddress6 a)
inet2ip _ = error "inet2Ip: not IP4/IP6 address"
data InvalidSettings
= UnsupportedCompression [CompressionAlgorithm]
| InvalidCacheSize
deriving Typeable
instance Exception InvalidSettings
instance Show InvalidSettings where
show (UnsupportedCompression cc) = "cql-io: unsupported compression: " ++ show cc
show InvalidCacheSize = "cql-io: invalid cache size"
newtype InternalError = InternalError String
deriving Typeable
instance Exception InternalError
instance Show InternalError where
show (InternalError e) = "cql-io: internal error: " ++ show e
data HostError
= NoHostAvailable
| HostsBusy
deriving Typeable
instance Exception HostError
instance Show HostError where
show NoHostAvailable = "cql-io: no host available"
show HostsBusy = "cql-io: hosts busy"
data ConnectionError
= ConnectionClosed !InetAddr
| ConnectTimeout !InetAddr
deriving Typeable
instance Exception ConnectionError
instance Show ConnectionError where
show (ConnectionClosed i) = "cql-io: connection closed: " ++ show i
show (ConnectTimeout i) = "cql-io: connect timeout: " ++ show i
newtype Timeout = TimeoutRead String
deriving Typeable
instance Exception Timeout
instance Show Timeout where
show (TimeoutRead e) = "cql-io: read timeout: " ++ e
data UnexpectedResponse where
UnexpectedResponse :: UnexpectedResponse
UnexpectedResponse' :: Show b => !(Response k a b) -> UnexpectedResponse
deriving instance Typeable UnexpectedResponse
instance Exception UnexpectedResponse
instance Show UnexpectedResponse where
show UnexpectedResponse = "cql-io: unexpected response"
show (UnexpectedResponse' r) = "cql-io: unexpected response: " ++ show r
data HashCollision = HashCollision !Text !Text
deriving Typeable
instance Exception HashCollision
instance Show HashCollision where
show (HashCollision a b) = showString "cql-io: hash collision: "
. shows a
. showString " "
. shows b
$ ""
ignore :: IO () -> IO ()
ignore a = catchAll a (const $ return ())