module Database.PostgreSQL.Migrations
( runDb, dbUp, dbDown, initDb
, module Database.PostgreSQL.Sequel
) where
import Prelude
import Control.Monad.IO.Class (liftIO)
import Database.PostgreSQL.Connection
import Database.PostgreSQL.Sequel
import Database.PostgreSQL.Simple
import Web.Simple.Migrations
runDb :: Sequel a -> IO a
runDb act = withConnection $ \conn -> runSequel act conn
dbUp :: Sequel a -> Migration
dbUp act version name = runDb $ do
(Only count:_) <-
sqlQuery "select count(version) from schema_migrations where version = ?"
[version]
if (count :: Int) > 0 then
return False
else do
liftIO $ putStrLn $
"=== Running migration: " ++ name ++ " (" ++ version ++ ")"
act
sqlExecute "insert into schema_migrations (version) values(?)"
(Only version)
return True
dbDown :: Sequel a -> Migration
dbDown act version name = runDb $ do
(Only count:_) <-
sqlQuery "select count(version) from schema_migrations where version = ?"
[version]
if (count :: Int) == 0 then
return False
else do
liftIO $ putStrLn $
"=== Rolling back: " ++ name ++ " (" ++ version ++ ")"
act
sqlExecute "delete from schema_migrations where version = ?"
(Only version)
return True
initDb :: Migration
initDb _ _ = runDb $ do
(Only count:_) <- sqlQuery "select count(*) from pg_class where relname = ?"
(Only ("schema_migrations" :: String))
if (count :: Int) /= 0 then
return False
else do
liftIO $ putStrLn "Creating table `schema_migrations`"
create_table "schema_migrations" $
column "version" string [UNIQUE]
return True