packages feed

hedis 0.9.11 → 0.9.12

raw patch · 4 files changed

+54/−7 lines, 4 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

+ Database.Redis: [connectTimeout] :: ConnectInfo -> Maybe NominalDiffTime
- Database.Redis: ConnInfo :: HostName -> PortID -> Maybe ByteString -> Integer -> Int -> NominalDiffTime -> ConnectInfo
+ Database.Redis: ConnInfo :: HostName -> PortID -> Maybe ByteString -> Integer -> Int -> NominalDiffTime -> Maybe NominalDiffTime -> ConnectInfo

Files

CHANGELOG view
@@ -1,5 +1,9 @@ # Changelog for Hedis +## 0.9.12++* PR #98. Added `connectTimeout` option+ ## 0.9.11  * PR #94. Refactor fix for issue #92 - (Connection to Unix sockets is broken)@@ -20,6 +24,10 @@ ## 0.9.7  * Expose returnDecode method of RedisCtx (see issue #83)++## 0.9.6++* Export Condition constructors (see PR #86)  ## 0.9.2 
hedis.cabal view
@@ -1,5 +1,5 @@ name:               hedis-version:            0.9.11+version:            0.9.12 synopsis:     Client library for the Redis datastore: supports full command set,     pipelining.
src/Database/Redis/Core.hs view
@@ -166,6 +166,10 @@     --   smallest acceptable value is 0.5 seconds. If the @timeout@ value in     --   your redis.conf file is non-zero, it should be larger than     --   'connectMaxIdleTime'.+    , connectTimeout        :: Maybe NominalDiffTime+    -- ^ Optional timeout until connection to Redis gets+    --   established. 'ConnectTimeoutException' gets thrown if no socket+    --   get connected in this interval of time.     } deriving Show  -- |Default information for connecting:@@ -187,6 +191,7 @@     , connectDatabase       = 0     , connectMaxConnections = 50     , connectMaxIdleTime    = 30+    , connectTimeout        = Nothing     }  -- |Constructs a 'Connection' pool to a Redis server designated by the @@ -197,7 +202,9 @@     createPool create destroy 1 connectMaxIdleTime connectMaxConnections   where     create = do-        conn <- PP.connect connectHost connectPort+        let timeoutOptUs =+              round . (1000000 *) <$> connectTimeout+        conn <- PP.connect connectHost connectPort timeoutOptUs         runRedisInternal conn $ do             -- AUTH             case connectAuth of
src/Database/Redis/ProtocolPipelining.hs view
@@ -21,6 +21,9 @@ ) where  import           Prelude+import           Control.Concurrent (threadDelay)+import           Control.Concurrent.Async (race)+import           Control.Concurrent.MVar import           Control.Exception import           Control.Monad import qualified Scanner@@ -54,9 +57,20 @@  instance Exception ConnectionLostException -connect :: HostName -> PortID -> IO Connection-connect hostName portID =-  bracketOnError (hConnect portID) hClose $ \connHandle -> do+data ConnectPhase+  = PhaseUnknown+  | PhaseResolve+  | PhaseOpenSocket+  deriving (Show)++data ConnectTimeout = ConnectTimeout ConnectPhase+  deriving (Show, Typeable)++instance Exception ConnectTimeout++connect :: HostName -> PortID -> Maybe Int -> IO Connection+connect hostName portID timeoutOpt =+  bracketOnError hConnect hClose $ \connHandle -> do     hSetBinaryMode connHandle True     connReplies <- newIORef []     connPending <- newIORef []@@ -66,13 +80,28 @@     writeIORef connReplies rs     writeIORef connPending rs     return conn-  where hConnect (PortNumber port) =+  where+        hConnect = do+          phaseMVar <- newMVar PhaseUnknown+          let doConnect = hConnect' portID phaseMVar+          case timeoutOpt of+            Nothing -> doConnect+            Just micros -> do+              result <- race doConnect (threadDelay micros)+              case result of+                Left h -> return h+                Right () -> do+                  phase <- readMVar phaseMVar+                  errConnectTimeout phase+        hConnect' (PortNumber port) mvar =           bracketOnError mkSocket NS.close $ \sock -> do             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+        hConnect' _ _ = connectTo hostName portID         mkSocket   = NS.socket NS.AF_INET NS.Stream 0  disconnect :: Connection -> IO ()@@ -157,3 +186,6 @@  errConnClosed :: IO a errConnClosed = throwIO ConnectionLost++errConnectTimeout :: ConnectPhase -> IO a+errConnectTimeout phase = throwIO $ ConnectTimeout phase