@@ -1,11 +1,37 @@
1−module Squeal.PostgreSQL.Migration where
1+module Squeal.PostgreSQL.Migration
2+ ( Migration
3+-- , up
4+ , MigrationResult
5+ ) where
6+
7+import Control.Category
8+import Control.Exception.Lifted
9+import Data.Function ((&))
210
311import Squeal.PostgreSQL.PQ
12+import Squeal.PostgreSQL.Transaction
413
5−-- | A `Migration` is in the isomorphism subcategory
6−-- of the indexed monad `PQ`
7−data Migration schema0 schema1 m x = Migration
8− { migrateUp :: PQ schema0 schema1 m x
9− , migrateDown :: PQ schema0 schema1 m x
14+data Migration schema0 schema1 = Migration
15+ { migrateUp :: PQ schema0 schema1 IO MigrationResult
16+ , migrateDown :: PQ schema1 schema0 IO MigrationResult
1017 }
1118
19+instance Category Migration where
20+ id = Migration (return MigrationSuccess) (return MigrationSuccess)
21+ migration1 . migration0 = Migration
22+ { migrateUp = migrateUp migration0 & pqThen (migrateUp migration1)
23+ , migrateDown = migrateDown migration1 & pqThen (migrateDown migration0)
24+ }
25+
26+-- up
27+-- :: Migration schema0 schema1
28+-- -> Connection schema0
29+-- -> IO (MigrationResult, Connection schema1)
30+-- up (Migration mUp _) conn0 = do
31+-- (begin _conn0) <- runPQ (begin (TransactionMode ReadCommitted ReadWrite)) conn0
32+-- & pqThen (Prelude.id mUp `onException` rollback)
33+-- & pqBind (\ result ->
34+-- commit & pqThen (return result))
35+
36+data MigrationResult
37+ = MigrationSuccess