potoki-hasql 1 → 1.1
raw patch · 13 files changed
+175/−175 lines, 13 files
Files
- library/Potoki/Error/Hasql.hs +21/−0
- library/Potoki/Error/Instances.hs +8/−0
- library/Potoki/Error/Types.hs +14/−0
- library/Potoki/Hasql/Consume.hs +44/−0
- library/Potoki/Hasql/Produce.hs +54/−0
- library/Potoki/Prelude.hs +27/−0
- library/PotokiHasql/Error/Hasql.hs +0/−21
- library/PotokiHasql/Error/Instances.hs +0/−8
- library/PotokiHasql/Error/Types.hs +0/−14
- library/PotokiHasql/Potoki/Consume.hs +0/−44
- library/PotokiHasql/Potoki/Produce.hs +0/−54
- library/PotokiHasql/Prelude.hs +0/−27
- potoki-hasql.cabal +7/−7
+ 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,