packages feed

potoki-hasql 1 → 1.1

raw patch · 13 files changed

+175/−175 lines, 13 files

Files

+ library/Potoki/Error/Hasql.hs view
@@ -0,0 +1,21 @@+{-| Hasql errors interpretation -}+module Potoki.Error.Hasql+where++import           Potoki.Prelude+import           Potoki.Error.Types+import qualified Hasql.Session            as A+import qualified Hasql.Connection         as C+++connectionError :: C.ConnectionError -> Error+connectionError details =+  ConnectionError (maybe "" lenientUtf8ByteStringText details)++sessionError :: A.Error -> Error+sessionError =+  \ case+    A.ClientError details ->+      ConnectionError (maybe "" lenientUtf8ByteStringText details)+    A.ResultError details ->+      InteractionError ((stringText . show) details)
+ library/Potoki/Error/Instances.hs view
@@ -0,0 +1,8 @@+module Potoki.Error.Instances+where++import Potoki.Prelude+import Potoki.Error.Types+++deriving instance Show Error
+ library/Potoki/Error/Types.hs view
@@ -0,0 +1,14 @@+module Potoki.Error.Types+where++import Potoki.Prelude+++{-| Error, which can be produced during interaction with the Requests database.+    Comes packed with the detailed description of the problems. -}+data Error =+  {-| Connection error. Can be interpreted as a signal for reconnecting. -}+  ConnectionError Text |+  {-| Some form of an interaction error.+      Can happen for many reasons related to improper suppositions about the state of the database. -}+  InteractionError Text
+ library/Potoki/Hasql/Consume.hs view
@@ -0,0 +1,44 @@+module Potoki.Hasql.Consume+where++import           Potoki.Prelude   +import qualified Hasql.Connection        as B+import qualified Hasql.Query             as E+import qualified Hasql.Session           as D+import qualified Potoki.Consume          as O+import           Potoki.Core.Consume+import qualified Potoki.Core.Fetch       as C+import qualified Potoki.Transform        as F+import qualified Potoki.Error.Hasql as G+import           Potoki.Error.Types  +++executeBatchQuery :: E.Query (Vector params) () -> Int -> B.Settings -> Consume params (Either Error ())+executeBatchQuery query batchSize settings =+  transform+    (F.consume (transform (F.take batchSize) O.vector))+    (executeQuery query settings)++executeQuery :: E.Query params () -> B.Settings -> Consume params (Either Error ())+executeQuery query =+  executeSession (\ params -> D.query params query)++executeSession :: (params -> D.Session ()) -> B.Settings -> Consume params (Either Error ())+executeSession session connectionSettings =+  Consume $ \ (C.Fetch fetchIO) -> do+    acquisitionResult <- B.acquire connectionSettings+    case acquisitionResult of+      Left error -> return (Left (G.connectionError error))+      Right connection ->+        let+          loop =+            join $+            fetchIO+              (return (Right ()))+              (\ params ->+                do+                  result <- D.run (session params) connection+                  case result of+                    Right () -> loop+                    Left error -> return (Left (G.sessionError error)))+          in loop <* B.release connection
+ library/Potoki/Hasql/Produce.hs view
@@ -0,0 +1,54 @@+module Potoki.Hasql.Produce (+  vectorStatefulSession,+  statefulSession+) where++import           Potoki.Prelude+import qualified Hasql.Connection        as F+import qualified Hasql.Session           as G+import qualified Potoki.Core.Fetch       as A+import           Potoki.Core.Produce+import qualified Potoki.Produce          as K+import qualified Potoki.Transform        as J+import qualified Potoki.Error.Hasql as I+import           Potoki.Error.Types+++vectorStatefulSession :: (state -> G.Session (Vector a, state)) -> state -> F.Settings -> Produce (Either Error a)+vectorStatefulSession vectorSession initialState connectionSettings =+  K.transform+    (right' J.vector)+    (statefulSession vectorSession initialState connectionSettings)+++statefulSession :: (state -> G.Session (a, state)) -> state -> F.Settings -> Produce (Either Error a)+statefulSession session initialState =+  havingConnection $ \ connection -> do+    stateRef <- newIORef initialState+    return $ A.Fetch $ \ nil just -> do+      state <- readIORef stateRef+      sessionResult <- G.run (session state) connection+      case sessionResult of+        Left error -> return (just (Left (I.sessionError error)))+        Right (result, newState) -> do+          writeIORef stateRef newState+          return (just (Right result))+++havingConnection :: (F.Connection -> IO (A.Fetch (Either Error a))) -> F.Settings -> Produce (Either Error a)+havingConnection cont connectionSettings =+  Produce $ do+    errorOrConnection <- F.acquire connectionSettings+    case errorOrConnection of+      Left error ->+        let+          fetch =+            A.Fetch $ \ stop yield -> return (yield (Left (I.connectionError error)))+          kill =+            return ()+          in return (fetch, kill)+      Right connection -> do+        fetch <- cont connection+        let+          kill = F.release connection+          in return (fetch, kill)
+ library/Potoki/Prelude.hs view
@@ -0,0 +1,27 @@+module Potoki.Prelude+(+  module Exports,+  stringText,+  lenientUtf8ByteStringText,+)+where++import           Prelude                  as Exports+import           Control.Monad            as Exports (join)+import           Data.Profunctor          as Exports (right')+import           Data.IORef               as Exports+import           Data.Vector              as Exports (Vector(..))+import           Data.Text                as Exports (Text(..))+import qualified Data.Text                as A+import qualified Data.Text.Encoding       as A+import qualified Data.Text.Encoding.Error as A+import qualified Data.ByteString          as B+++stringText :: String -> A.Text+stringText =+  A.pack++lenientUtf8ByteStringText :: B.ByteString -> A.Text+lenientUtf8ByteStringText =+  A.decodeUtf8With A.lenientDecode
− library/PotokiHasql/Error/Hasql.hs
@@ -1,21 +0,0 @@-{-| Hasql errors interpretation -}-module PotokiHasql.Error.Hasql-where--import           PotokiHasql.Prelude-import           PotokiHasql.Error.Types-import qualified Hasql.Session            as A-import qualified Hasql.Connection         as C---connectionError :: C.ConnectionError -> Error-connectionError details =-  ConnectionError (maybe "" lenientUtf8ByteStringText details)--sessionError :: A.Error -> Error-sessionError =-  \ case-    A.ClientError details ->-      ConnectionError (maybe "" lenientUtf8ByteStringText details)-    A.ResultError details ->-      InteractionError ((stringText . show) details)
− library/PotokiHasql/Error/Instances.hs
@@ -1,8 +0,0 @@-module PotokiHasql.Error.Instances-where--import PotokiHasql.Prelude-import PotokiHasql.Error.Types---deriving instance Show Error
− library/PotokiHasql/Error/Types.hs
@@ -1,14 +0,0 @@-module PotokiHasql.Error.Types-where--import PotokiHasql.Prelude---{-| Error, which can be produced during interaction with the Requests database.-    Comes packed with the detailed description of the problems. -}-data Error =-  {-| Connection error. Can be interpreted as a signal for reconnecting. -}-  ConnectionError Text |-  {-| Some form of an interaction error.-      Can happen for many reasons related to improper suppositions about the state of the database. -}-  InteractionError Text
− library/PotokiHasql/Potoki/Consume.hs
@@ -1,44 +0,0 @@-module PotokiHasql.Potoki.Consume-where--import           PotokiHasql.Prelude   -import qualified Hasql.Connection        as B-import qualified Hasql.Query             as E-import qualified Hasql.Session           as D-import qualified Potoki.Consume          as O-import           Potoki.Core.Consume-import qualified Potoki.Core.Fetch       as C-import qualified Potoki.Transform        as F-import qualified PotokiHasql.Error.Hasql as G-import           PotokiHasql.Error.Types  ---executeBatchQuery :: E.Query (Vector params) () -> Int -> B.Settings -> Consume params (Either Error ())-executeBatchQuery query batchSize settings =-  transform-    (F.consume (transform (F.take batchSize) O.vector))-    (executeQuery query settings)--executeQuery :: E.Query params () -> B.Settings -> Consume params (Either Error ())-executeQuery query =-  executeSession (\ params -> D.query params query)--executeSession :: (params -> D.Session ()) -> B.Settings -> Consume params (Either Error ())-executeSession session connectionSettings =-  Consume $ \ (C.Fetch fetchIO) -> do-    acquisitionResult <- B.acquire connectionSettings-    case acquisitionResult of-      Left error -> return (Left (G.connectionError error))-      Right connection ->-        let-          loop =-            join $-            fetchIO-              (return (Right ()))-              (\ params ->-                do-                  result <- D.run (session params) connection-                  case result of-                    Right () -> loop-                    Left error -> return (Left (G.sessionError error)))-          in loop <* B.release connection
− library/PotokiHasql/Potoki/Produce.hs
@@ -1,54 +0,0 @@-module PotokiHasql.Potoki.Produce (-  vectorStatefulSession,-  statefulSession-) where--import           PotokiHasql.Prelude-import qualified Hasql.Connection        as F-import qualified Hasql.Session           as G-import qualified Potoki.Core.Fetch       as A-import           Potoki.Core.Produce-import qualified Potoki.Produce          as K-import qualified Potoki.Transform        as J-import qualified PotokiHasql.Error.Hasql as I-import           PotokiHasql.Error.Types---vectorStatefulSession :: (state -> G.Session (Vector a, state)) -> state -> F.Settings -> Produce (Either Error a)-vectorStatefulSession vectorSession initialState connectionSettings =-  K.transform-    (right' J.vector)-    (statefulSession vectorSession initialState connectionSettings)---statefulSession :: (state -> G.Session (a, state)) -> state -> F.Settings -> Produce (Either Error a)-statefulSession session initialState =-  havingConnection $ \ connection -> do-    stateRef <- newIORef initialState-    return $ A.Fetch $ \ nil just -> do-      state <- readIORef stateRef-      sessionResult <- G.run (session state) connection-      case sessionResult of-        Left error -> return (just (Left (I.sessionError error)))-        Right (result, newState) -> do-          writeIORef stateRef newState-          return (just (Right result))---havingConnection :: (F.Connection -> IO (A.Fetch (Either Error a))) -> F.Settings -> Produce (Either Error a)-havingConnection cont connectionSettings =-  Produce $ do-    errorOrConnection <- F.acquire connectionSettings-    case errorOrConnection of-      Left error ->-        let-          fetch =-            A.Fetch $ \ stop yield -> return (yield (Left (I.connectionError error)))-          kill =-            return ()-          in return (fetch, kill)-      Right connection -> do-        fetch <- cont connection-        let-          kill = F.release connection-          in return (fetch, kill)
− library/PotokiHasql/Prelude.hs
@@ -1,27 +0,0 @@-module PotokiHasql.Prelude-(-  module Exports,-  stringText,-  lenientUtf8ByteStringText,-)-where--import           Prelude                  as Exports-import           Control.Monad            as Exports (join)-import           Data.Profunctor          as Exports (right')-import           Data.IORef               as Exports-import           Data.Vector              as Exports (Vector(..))-import           Data.Text                as Exports (Text(..))-import qualified Data.Text                as A-import qualified Data.Text.Encoding       as A-import qualified Data.Text.Encoding.Error as A-import qualified Data.ByteString          as B---stringText :: String -> A.Text-stringText =-  A.pack--lenientUtf8ByteStringText :: B.ByteString -> A.Text-lenientUtf8ByteStringText =-  A.decodeUtf8With A.lenientDecode
potoki-hasql.cabal view
@@ -1,7 +1,7 @@ name:   potoki-hasql version:-  1+  1.1 synopsis:   Integration of "potoki" and "hasql". description:@@ -41,13 +41,13 @@   default-language:     Haskell2010   exposed-modules:-    PotokiHasql.Potoki.Consume-    PotokiHasql.Potoki.Produce+    Potoki.Hasql.Consume+    Potoki.Hasql.Produce   other-modules:-    PotokiHasql.Error.Hasql-    PotokiHasql.Error.Instances-    PotokiHasql.Error.Types-    PotokiHasql.Prelude+    Potoki.Error.Hasql+    Potoki.Error.Instances+    Potoki.Error.Types+    Potoki.Prelude   build-depends:     hasql == 1.1.1,     potoki == 0.11.1,