{-#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 :: (Connection -> IO a) -> Connection -> IO a
withTransaction Connection -> IO a
action Connection
conn = Connection -> IO a -> IO a
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 =
    Connection -> Query -> [Text] -> IO ()
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 =
    Connection -> Query -> [Text] -> IO ()
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 <- Connection -> Query -> IO [Only Text]
forall r. FromRow r => Connection -> Query -> IO [r]
Sqlite.query_ Connection
conn
      Query
"SELECT name FROM _migrations ORDER BY id"
    [MigrationName] -> IO [MigrationName]
forall (m :: * -> *) a. Monad m => a -> m a
return [ Text -> MigrationName
MigrationName Text
name | Sqlite.Only Text
name <- [Only Text]
result ]