packages feed

yam-datasource 0.5.17 → 0.6.0

raw patch · 2 files changed

+70/−43 lines, 2 filesdep +data-defaultdep +monad-loggerdep +salakdep ~persistentdep ~yamPVP ok

version bump matches the API change (PVP)

Dependencies added: data-default, monad-logger, salak, servant-server, text

Dependency ranges changed: persistent, yam

API changes (from Hackage documentation)

- Yam.DataSource: primaryDatasourceMiddleware :: DataSourceProvider -> AppMiddleware
- Yam.DataSource: runTransWith :: Key DataSource -> DB App a -> App a
+ Yam.DataSource: DataSourceConfig :: Text -> Text -> Int -> DataSourceConfig
+ Yam.DataSource: [$sel:dsType:DataSourceConfig] :: DataSourceConfig -> Text
+ Yam.DataSource: [$sel:dsUrl:DataSourceConfig] :: DataSourceConfig -> Text
+ Yam.DataSource: [$sel:maxConn:DataSourceConfig] :: DataSourceConfig -> Int
+ Yam.DataSource: data DataSourceConfig
+ Yam.DataSource: instance Data.Default.Class.Default Yam.DataSource.DataSourceConfig
+ Yam.DataSource: instance GHC.Show.Show Yam.DataSource.DataSourceConfig
+ Yam.DataSource: instance Salak.Prop.FromProp Yam.DataSource.DataSourceConfig
+ Yam.DataSource: type HasDataSource cxt = (HasLogger cxt, HasContextEntry cxt DataSource)
- Yam.DataSource: datasourceMiddleware :: Key DataSource -> DataSourceProvider -> AppMiddleware
+ Yam.DataSource: datasourceMiddleware :: DataSourceProvider -> AppMiddleware a (DataSource : a)
- Yam.DataSource: runTrans :: DB App a -> App a
+ Yam.DataSource: runTrans :: (HasDataSource cxt, MonadIO m, MonadUnliftIO m) => DB (AppT cxt m) a -> AppT cxt m a

Files

src/Yam/DataSource.hs view
@@ -1,79 +1,101 @@+-- |+-- Module:      Yam.DataSource+-- Copyright:   (c) 2019 Daniel YU+-- License:     BSD3+-- Maintainer:  leptonyu@gmail.com+-- Stability:   experimental+-- Portability: portable+--+-- Datasource supports for [yam](https://hackage.haskell.org/package/yam).+-- module Yam.DataSource(   -- * DataSource Types     DataSourceProvider(..)   , DataSource   , DB-  -- * Primary DataSource Functions+  , HasDataSource+  , DataSourceConfig(..)   , runTrans-  , primaryDatasourceMiddleware-  -- * Secondary DataSource Functions-  , runTransWith   , datasourceMiddleware   -- * Sql Functions   , query   , selectValue   ) where +import           Control.Exception              (bracket) import           Control.Monad.IO.Unlift-import           Data.Acquire            (withAcquire)+import           Control.Monad.Logger.CallStack+import           Data.Acquire                   (withAcquire) import           Data.Conduit-import qualified Data.Conduit.List       as CL+import qualified Data.Conduit.List              as CL+import           Data.Default import           Data.Pool-import           Database.Persist.Sql    hiding (Key)-import           System.IO.Unsafe        (unsafePerformIO)-import           Yam                     hiding (LogFunc)+import qualified Data.Text                      as T+import           Database.Persist.Sql           hiding (Key)+import           Salak+import           Servant+import           Yam -type DataSource = Pool SqlBackend -{-# NOINLINE dataSourceKey #-}-dataSourceKey :: Key DataSource-dataSourceKey = unsafePerformIO newKey+data DataSourceConfig = DataSourceConfig+  { dsType  :: T.Text+  , dsUrl   :: T.Text+  , maxConn :: Int+  } deriving Show ++instance Default DataSourceConfig where+  def = DataSourceConfig "sqlite" ":memory:" 10++instance FromProp DataSourceConfig where+  fromProp = DataSourceConfig+    <$> "type"            .?: dsType+    <*> "url"             .?: dsUrl+    <*> "max-connections" .?: maxConn++-- | Middleware context type.+type DataSource = Pool SqlBackend+ data DataSourceProvider = DataSourceProvider   { datasource :: LoggingT IO DataSource   , migration  :: DB (LoggingT IO) ()-  , dbtype     :: Text+  , dbtype     :: T.Text   } -- SqlPersistT ~ ReaderT SqlBackend type DB = SqlPersistT  query   :: (MonadUnliftIO m)-  => Text+  => T.Text   -> [PersistValue]   -> DB m [[PersistValue]] query sql params = do   res <- rawQueryRes sql params   withAcquire res (\a -> runConduit $ a .| CL.fold (flip (:)) []) -selectValue :: (PersistField a, MonadUnliftIO m) => Text -> DB m [a]+selectValue :: (PersistField a, MonadUnliftIO m) => T.Text -> DB m [a] selectValue sql = fmap unSingle <$> rawSql sql [] -runTransWith :: Key DataSource -> DB App a -> App a-runTransWith k a = requireAttr k >>= (`runDB` a)--runTrans :: DB App a -> App a-runTrans = runTransWith dataSourceKey+-- | Middleware context.+type HasDataSource cxt = (HasLogger cxt, HasContextEntry cxt DataSource) -{-# INLINE runDB #-}-runDB :: (MonadLoggerIO m, MonadUnliftIO m) => DataSource -> DB m a -> m a-runDB pool db = do+runTrans+  :: ( HasDataSource cxt+     , MonadIO m+     , MonadUnliftIO m)+  => DB (AppT cxt m) a+  -> AppT cxt m a+runTrans a = do+  pool   <- getEntry   logger <- askLoggerIO-  withRunInIO $ \run -> withResource pool $ run . \c -> runSqlConn db c { connLogFunc = logger }--datasourceMiddleware :: Key DataSource -> DataSourceProvider -> AppMiddleware-datasourceMiddleware k DataSourceProvider{..} = simplePoolMiddleware (True, "database " <> dbtype) k open (liftIO . destroyAllResources)-  where-    {-# INLINE trans #-}-    trans :: LoggingT IO a -> App a-    trans a = askLoggerIO >>= liftIO . runLoggingT a-    {-# INLINE open #-}-    open = do-      a <- trans datasource-      trans $ runDB a migration-      return a+  withRunInIO $ \run -> withResource pool $ run . \c -> runSqlConn a c { connLogFunc = logger } -primaryDatasourceMiddleware = datasourceMiddleware dataSourceKey+datasourceMiddleware :: DataSourceProvider -> AppMiddleware a (DataSource ': a)+datasourceMiddleware DataSourceProvider{..} = AppMiddleware $ \c m f -> askLoggerIO >>= \lc ->+  liftIO $ bracket+    (runLoggingT datasource lc)+    destroyAllResources+    (\ds -> runLoggingT (f (ds :. c) m) lc)   
yam-datasource.cabal view
@@ -1,12 +1,12 @@ cabal-version: 1.12 name: yam-datasource-version: 0.5.17+version: 0.6.0 license: BSD3 license-file: LICENSE copyright: (c) Daniel YU maintainer: Daniel YU <leptonyu@gmail.com> author: Daniel YU-homepage: https://github.com/leptonyu/yam/yam-datasource#readme+homepage: https://github.com/leptonyu/yam#readme synopsis: Yam DataSource Middleware category: Web build-type: Simple@@ -32,12 +32,17 @@                         RecordWildCards ScopedTypeVariables StandaloneDeriving                         TupleSections TypeApplications TypeFamilies TypeOperators                         TypeSynonymInstances ViewPatterns-    ghc-options: -Wall -fno-warn-orphans -fno-warn-missing-signatures+    ghc-options: -Wall     build-depends:         base >=4.10 && <5,         conduit >=1.3.1.1 && <1.4,-        persistent >=2.9.1 && <2.10,+        data-default >=0.7.1.1 && <0.8,+        monad-logger >=0.3.30 && <0.4,+        persistent >=2.8.0 && <2.11,         resource-pool >=0.2.3.2 && <0.3,         resourcet >=1.2.2 && <1.3,+        salak >=0.2.9 && <0.3,+        servant-server ==0.16.*,+        text >=1.2.3.1 && <1.3,         unliftio-core >=0.1.2.0 && <0.2,-        yam >=0.5.17 && <0.6+        yam >=0.6.0 && <0.7