Streaming DB demo

This commit is contained in:
Michael Snoyman 2013-03-27 09:45:54 +02:00
parent d4422b656b
commit cb49b684bd

View File

@ -0,0 +1,67 @@
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Control.Monad.Logger (runNoLoggingT)
import Data.Conduit (awaitForever, runResourceT, ($=))
import Data.Text (Text)
import Database.Persist.Sqlite (ConnectionPool, SqlPersist,
SqliteConf (..), runMigration,
runSqlPool)
import Database.Persist.Store (createPoolConfig)
import Yesod.Core
import Yesod.Persist
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
Person
name Text
|]
data App = App
{ appConfig :: SqliteConf
, appPool :: ConnectionPool
}
mkYesod "App" [parseRoutes|
/ HomeR GET
|]
instance Yesod App
instance YesodPersist App where
type YesodPersistBackend App = SqlPersist
runDB = defaultRunDB appConfig appPool
instance YesodPersistRunner App where
getDBRunner = defaultGetDBRunner appPool
getHomeR :: Handler TypedContent
getHomeR = do
runDB $ do
runMigration migrateAll
deleteWhere ([] :: [Filter Person])
insert_ $ Person "Charlie"
insert_ $ Person "Alice"
insert_ $ Person "Bob"
respondSourceDB typePlain $ selectSource [] [Asc PersonName] $= awaitForever toBuilder
where
toBuilder (Entity _ (Person name)) = do
sendChunkText name
sendChunkText "\n"
sendFlush
main :: IO ()
main = do
let config = SqliteConf ":memory:" 1
pool <- createPoolConfig config
runNoLoggingT $ runResourceT $ flip runSqlPool pool $ do
runMigration migrateAll
deleteWhere ([] :: [Filter Person])
insert_ $ Person "Charlie"
insert_ $ Person "Alice"
insert_ $ Person "Bob"
warp 3000 App
{ appConfig = config
, appPool = pool
}