{-#LANGUAGE OverloadedStrings #-} module Database.Migrant.Driver.Sqlite where import Database.Migrant.Driver.Class import Database.Migrant.MigrationName import qualified Database.SQLite.Simple as Sqlite instance Driver Sqlite.Connection where withTransaction :: forall a. (Connection -> IO a) -> Connection -> IO a withTransaction Connection -> IO a action Connection conn = forall a. Connection -> IO a -> IO a Sqlite.withTransaction Connection conn (Connection -> IO a action Connection conn) initMigrations :: Connection -> IO () initMigrations Connection conn = Connection -> Query -> IO () Sqlite.execute_ Connection conn Query "CREATE TABLE IF NOT EXISTS _migrations (id INTEGER PRIMARY KEY, name TEXT)" markUp :: MigrationName -> Connection -> IO () markUp MigrationName name Connection conn = forall q. ToRow q => Connection -> Query -> q -> IO () Sqlite.execute Connection conn Query "INSERT INTO _migrations (name) VALUES (?)" [MigrationName -> Text unpackMigrationName MigrationName name] markDown :: MigrationName -> Connection -> IO () markDown MigrationName name Connection conn = forall q. ToRow q => Connection -> Query -> q -> IO () Sqlite.execute Connection conn Query "DELETE FROM _migrations WHERE name = ?" [MigrationName -> Text unpackMigrationName MigrationName name] getMigrations :: Connection -> IO [MigrationName] getMigrations Connection conn = do [Only Text] result <- forall r. FromRow r => Connection -> Query -> IO [r] Sqlite.query_ Connection conn Query "SELECT name FROM _migrations ORDER BY id" forall (m :: * -> *) a. Monad m => a -> m a return [ Text -> MigrationName MigrationName Text name | Sqlite.Only Text name <- [Only Text] result ]