hedis 0.10.10 → 0.11.0
raw patch · 6 files changed
+47/−24 lines, 6 filesdep ~networkPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: network
API changes (from Hackage documentation)
- Database.Redis: PortNumber :: PortNumber -> PortID
- Database.Redis: Service :: String -> PortID
- Database.Redis: UnixSocket :: String -> PortID
- Database.Redis: data PortID
+ Database.Redis: type PortNumber = PortNumber
- Database.Redis: ConnInfo :: HostName -> PortID -> Maybe ByteString -> Integer -> Int -> NominalDiffTime -> Maybe NominalDiffTime -> Maybe ClientParams -> ConnectInfo
+ Database.Redis: ConnInfo :: HostName -> PortNumber -> Maybe ByteString -> Integer -> Int -> NominalDiffTime -> Maybe NominalDiffTime -> Maybe ClientParams -> ConnectInfo
- Database.Redis: [connectPort] :: ConnectInfo -> PortID
+ Database.Redis: [connectPort] :: ConnectInfo -> PortNumber
- Database.Redis: type HostName = String
+ Database.Redis: type HostName = HostName
Files
- CHANGELOG +4/−0
- hedis.cabal +1/−1
- src/Database/Redis.hs +2/−2
- src/Database/Redis/Core.hs +4/−4
- src/Database/Redis/ProtocolPipelining.hs +33/−12
- src/Database/Redis/URL.hs +3/−5
CHANGELOG view
@@ -1,5 +1,9 @@ # Changelog for Hedis +## 0.11.0++* PR #126. Fixes for network 2.8 and 3.0+ ## 0.10.10 * Only disable warnings for GHC 8.6, fix build
hedis.cabal view
@@ -1,5 +1,5 @@ name: hedis-version: 0.10.10+version: 0.11.0 synopsis: Client library for the Redis datastore: supports full command set, pipelining.
src/Database/Redis.hs view
@@ -164,7 +164,7 @@ -- * Connection Connection, ConnectError(..), connect, checkedConnect, disconnect, ConnectInfo(..), defaultConnectInfo, parseConnectInfo,- HostName, PortID(..),+ HostName, PortNumber, -- * Commands module Database.Redis.Commands,@@ -195,7 +195,7 @@ import Database.Redis.PubSub import Database.Redis.Protocol import Database.Redis.ProtocolPipelining- (HostName, PortID(..), ConnectionLostException(..))+ (HostName, PortNumber, ConnectionLostException(..)) import Database.Redis.Transactions import Database.Redis.Types import Database.Redis.URL
src/Database/Redis/Core.hs view
@@ -23,7 +23,7 @@ import Data.Pool import Data.Time import Data.Typeable-import Network+import qualified Network.Socket as NS import Network.TLS (ClientParams) import Database.Redis.Protocol@@ -155,8 +155,8 @@ -- @ -- data ConnectInfo = ConnInfo- { connectHost :: HostName- , connectPort :: PortID+ { connectHost :: NS.HostName+ , connectPort :: NS.PortNumber , connectAuth :: Maybe B.ByteString -- ^ When the server is protected by a password, set 'connectAuth' to 'Just' -- the password. Each connection will then authenticate by the 'auth'@@ -201,7 +201,7 @@ defaultConnectInfo :: ConnectInfo defaultConnectInfo = ConnInfo { connectHost = "localhost"- , connectPort = PortNumber 6379+ , connectPort = 6379 , connectAuth = Nothing , connectDatabase = 0 , connectMaxConnections = 50
src/Database/Redis/ProtocolPipelining.hs view
@@ -17,7 +17,7 @@ Connection, connect, enableTLS, beginReceiving, disconnect, request, send, recv, flush, ConnectionLostException(..),- HostName, PortID(..)+ HostName, PortNumber ) where import Prelude@@ -31,8 +31,6 @@ import qualified Data.ByteString.Lazy as L import Data.IORef import Data.Typeable-import Network-import qualified Network.BSD as BSD import qualified Network.Socket as NS import qualified Network.TLS as TLS import System.IO@@ -41,6 +39,9 @@ import Database.Redis.Protocol +type HostName = NS.HostName+type PortNumber = NS.PortNumber+ data ConnectionContext = NormalHandle Handle | TLSContext TLS.Context data Connection = Conn@@ -71,8 +72,30 @@ instance Exception ConnectTimeout -connect :: HostName -> PortID -> Maybe Int -> IO Connection-connect hostName portID timeoutOpt =+getHostAddrInfo :: NS.HostName -> NS.PortNumber -> IO [NS.AddrInfo]+getHostAddrInfo hostname port = do+ addresses <- NS.getAddrInfo+ (Just NS.defaultHints)+ (Just hostname)+ (Just (show port))+ return addresses++connectSocket :: [NS.AddrInfo] -> IO NS.Socket+connectSocket addresses = do+ let addrInfo = head addresses+ socket <- NS.socket (NS.addrFamily addrInfo) NS.Stream NS.defaultProtocol+ catch+ (do+ _ <- NS.connect socket (NS.addrAddress addrInfo)+ return socket)+ (\(SomeException e) -> do+ _ <- NS.close socket+ case (tail addresses) of+ [] -> throwIO e+ others -> connectSocket others)++connect :: NS.HostName -> NS.PortNumber -> Maybe Int -> IO Connection+connect hostName portNumber timeoutOpt = bracketOnError hConnect hClose $ \h -> do hSetBinaryMode h True connReplies <- newIORef []@@ -83,7 +106,7 @@ where hConnect = do phaseMVar <- newMVar PhaseUnknown- let doConnect = hConnect' portID phaseMVar+ let doConnect = hConnect' phaseMVar case timeoutOpt of Nothing -> doConnect Just micros -> do@@ -93,16 +116,14 @@ Right () -> do phase <- readMVar phaseMVar errConnectTimeout phase- hConnect' (PortNumber port) mvar =- bracketOnError mkSocket NS.close $ \sock -> do+ hConnect' mvar =+ do+ addrInfo <- getHostAddrInfo hostName portNumber+ sock <- connectSocket addrInfo NS.setSocketOption sock NS.KeepAlive 1 void $ swapMVar mvar PhaseResolve- host <- BSD.getHostByName hostName void $ swapMVar mvar PhaseOpenSocket- NS.connect sock $ NS.SockAddrInet port (BSD.hostAddress host) NS.socketToHandle sock ReadWriteMode- hConnect' _ _ = connectTo hostName portID- mkSocket = NS.socket NS.AF_INET NS.Stream 0 enableTLS :: TLS.ClientParams -> Connection -> IO Connection enableTLS tlsParams conn@Conn{..} = do
src/Database/Redis/URL.hs view
@@ -10,7 +10,6 @@ import Control.Monad (guard) import Data.Monoid ((<>)) import Database.Redis.Core (ConnectInfo(..), defaultConnectInfo)-import Database.Redis.ProtocolPipelining (PortID(..)) import Network.HTTP.Base import Network.URI (parseURI, uriPath, uriScheme) import Text.Read (readMaybe)@@ -22,7 +21,7 @@ -- Username is ignored, path is used to specify the database: -- -- >>> parseConnectInfo "redis://username:password@host:42/2"--- Right (ConnInfo {connectHost = "host", connectPort = PortNumber 42, connectAuth = Just "password", connectDatabase = 2, connectMaxConnections = 50, connectMaxIdleTime = 30s, connectTimeout = Nothing, connectTLSParams = Nothing})+-- Right (ConnInfo {connectHost = "host", connectPort = 42, connectAuth = Just "password", connectDatabase = 2, connectMaxConnections = 50, connectMaxIdleTime = 30s, connectTimeout = Nothing, connectTLSParams = Nothing}) -- -- >>> parseConnectInfo "redis://username:password@host:42/db" -- Left "Invalid port: db"@@ -36,7 +35,7 @@ -- @'defaultConnectInfo'@: -- -- >>> parseConnectInfo "redis://"--- Right (ConnInfo {connectHost = "localhost", connectPort = PortNumber 6379, connectAuth = Nothing, connectDatabase = 0, connectMaxConnections = 50, connectMaxIdleTime = 30s, connectTimeout = Nothing, connectTLSParams = Nothing})+-- Right (ConnInfo {connectHost = "localhost", connectPort = 6379, connectAuth = Nothing, connectDatabase = 0, connectMaxConnections = 50, connectMaxIdleTime = 30s, connectTimeout = Nothing, connectTLSParams = Nothing}) -- parseConnectInfo :: String -> Either String ConnectInfo parseConnectInfo url = do@@ -57,8 +56,7 @@ { connectHost = if null h then connectHost defaultConnectInfo else h- , connectPort = maybe (connectPort defaultConnectInfo)- (PortNumber . fromIntegral) $ port uriAuth+ , connectPort = maybe (connectPort defaultConnectInfo) fromIntegral (port uriAuth) , connectAuth = C8.pack <$> password uriAuth , connectDatabase = db }