Merge branch 'pools'

This commit is contained in:
Joe Nelson
2014-10-17 23:50:38 -07:00
4 changed files with 24 additions and 21 deletions
+1 -1
View File
@@ -12,7 +12,7 @@ before_install:
- travis_retry sudo apt-get install --force-yes happy-1.19.3 alex-3.1.3 - travis_retry sudo apt-get install --force-yes happy-1.19.3 alex-3.1.3
- export PATH=/opt/alex/3.1.3/bin:/opt/happy/1.19.3/bin:$PATH - export PATH=/opt/alex/3.1.3/bin:/opt/happy/1.19.3/bin:$PATH
install: install:
- curl http://bin.begriffs.com/dbapi/cabal-sandbox.tar.xz | tar xJ - travis_retry curl http://bin.begriffs.com/dbapi/cabal-sandbox.tar.xz | tar xJ
- chmod a+x .cabal-sandbox/bin/* - chmod a+x .cabal-sandbox/bin/*
- cabal sandbox init - cabal sandbox init
- cabal install --enable-test --dependencies-only - cabal install --enable-test --dependencies-only
+9 -11
View File
@@ -18,22 +18,19 @@ executable dbapi
, warp, wai >= 3.0.1 && < 3.0.2 , warp, wai >= 3.0.1 && < 3.0.2
, wai-extra, wai-cors , wai-extra, wai-cors
, wai-middleware-static >= 0.6.0 , wai-middleware-static >= 0.6.0
, HTTP, convertible , HTTP, convertible, http-types
, case-insensitive , case-insensitive
, http-types, scientific, time , scientific, time
, bytestring, aeson, network >= 2.6 , aeson, network >= 2.6
, text , containers , bytestring, text, split, string-conversions
, containers, unordered-containers
, optparse-applicative >= 0.9.1 && < 0.10 , optparse-applicative >= 0.9.1 && < 0.10
, unordered-containers , regex-base, regex-tdfa
, regex-base
, string-conversions
, http-media, regex-tdfa
, Ranged-sets , Ranged-sets
, transformers , transformers
, bcrypt , bcrypt, base64-string
, base64-string
, split
, network-uri >= 2.6 , network-uri >= 2.6
, resource-pool, process
Other-Modules: Dbapi Other-Modules: Dbapi
, PgStructure , PgStructure
, PgQuery , PgQuery
@@ -69,3 +66,4 @@ Test-Suite spec
, base64-string , base64-string
, split , split
, network-uri >= 2.6 , network-uri >= 2.6
, resource-pool
+8 -9
View File
@@ -3,9 +3,8 @@
module Main where module Main where
import Dbapi import Dbapi
import Middleware (inTransaction, authenticated, withSavepoint, clientErrors, import Middleware (inTransaction, authenticated, withSavepoint, clientErrors,
redirectInsecure) redirectInsecure, withDBConnection)
import Network.Wai.Handler.Warp hiding (Connection) import Network.Wai.Handler.Warp hiding (Connection)
import Database.HDBC.PostgreSQL (connectPostgreSQL')
import Data.String.Conversions (cs) import Data.String.Conversions (cs)
import Control.Monad (unless) import Control.Monad (unless)
@@ -14,6 +13,9 @@ import Options.Applicative hiding (columns)
import Network.Wai.Middleware.Gzip (gzip, def) import Network.Wai.Middleware.Gzip (gzip, def)
import Network.Wai.Middleware.Cors (cors) import Network.Wai.Middleware.Cors (cors)
import Network.Wai.Middleware.Static (staticPolicy, only) import Network.Wai.Middleware.Static (staticPolicy, only)
import Database.HDBC (disconnect)
import Database.HDBC.PostgreSQL(connectPostgreSQL')
import Data.Pool(createPool)
argParser :: Parser AppConfig argParser :: Parser AppConfig
argParser = AppConfig argParser = AppConfig
@@ -29,20 +31,17 @@ argParser = AppConfig
main :: IO () main :: IO ()
main = do main = do
conf <- execParser (info (helper <*> argParser) describe) conf <- execParser (info (helper <*> argParser) describe)
pool <- createPool (connectPostgreSQL' (configDbUri conf)) disconnect 1 600 10
let port = configPort conf let port = configPort conf
let dburi = configDbUri conf
unless (configSecure conf) $ unless (configSecure conf) $
putStrLn "WARNING, running in insecure mode, auth will be in plaintext" putStrLn "WARNING, running in insecure mode, auth will be in plaintext"
Prelude.putStrLn $ "Listening on port " ++ (show $ configPort conf :: String) Prelude.putStrLn $ "Listening on port " ++ (show $ configPort conf :: String)
conn <- connectPostgreSQL' dburi
run port $ (if configSecure conf then redirectInsecure else id) run port $ (if configSecure conf then redirectInsecure else id)
. gzip def . gzip def . cors corsPolicy . clientErrors
. cors corsPolicy
. clientErrors
. staticPolicy (only [("favicon.ico", "static/favicon.ico")]) . staticPolicy (only [("favicon.ico", "static/favicon.ico")])
$ (inTransaction . authenticated (cs $ configAnonRole conf) . withSavepoint) . withDBConnection pool . inTransaction
app conn . authenticated (cs $ configAnonRole conf) . withSavepoint $ app
where where
describe = progDesc "create a REST API to an existing Postgres database" describe = progDesc "create a REST API to an existing Postgres database"
+6
View File
@@ -6,6 +6,7 @@ module Middleware where
import Data.Aeson ((.=), toJSON, ToJSON, object, encode) import Data.Aeson ((.=), toJSON, ToJSON, object, encode)
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
import Data.Monoid (mconcat) import Data.Monoid (mconcat)
import Data.Pool(withResource, Pool)
import Database.HDBC (runRaw) import Database.HDBC (runRaw)
import Database.HDBC.PostgreSQL (Connection) import Database.HDBC.PostgreSQL (Connection)
@@ -26,6 +27,11 @@ import Network.URI (URI(..), parseURI)
import PgQuery(LoginAttempt(..), signInRole, setRole, resetRole) import PgQuery(LoginAttempt(..), signInRole, setRole, resetRole)
import Codec.Binary.Base64.String (decode) import Codec.Binary.Base64.String (decode)
withDBConnection :: Pool Connection -> (Connection -> Application) -> Application
withDBConnection pool app req respond =
withResource pool (\c -> app c req respond)
inTransaction :: (Connection -> Application) -> Connection -> Application inTransaction :: (Connection -> Application) -> Connection -> Application
inTransaction app conn req respond = inTransaction app conn req respond =
finally (runRaw conn "begin" >> app conn req respond) (runRaw conn "commit") finally (runRaw conn "begin" >> app conn req respond) (runRaw conn "commit")