packages feed

migrant-hdbc-0.1.0.0: src/Database/Migrant/Driver/HDBC.hs

{-#LANGUAGE OverloadedStrings #-}
{-#LANGUAGE FlexibleInstances #-}
{-#LANGUAGE UndecidableInstances #-}
module Database.Migrant.Driver.HDBC
where

import Database.Migrant.Driver.Class
import Database.Migrant.MigrationName
import qualified Database.HDBC as HDBC
import Control.Monad (void)

instance Driver HDBC.ConnWrapper where
  withTransaction action conn = HDBC.withTransaction conn action

  initMigrations conn =
    void $
    HDBC.runRaw conn q
    where
      q = case HDBC.proxiedClientName conn of
        "postgresql" ->
          "CREATE TABLE IF NOT EXISTS _migrations (id SERIAL PRIMARY KEY, name TEXT NOT NULL)"
        "sqlite3" ->
          "CREATE TABLE IF NOT EXISTS _migrations (id INTEGER NOT NULL PRIMARY KEY, name TEXT NOT NULL)"
        "mysql" ->
          "CREATE TABLE IF NOT EXISTS _migrations (id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(256) NOT NULL)"
        _ ->
          -- ANSI SQL 2003 standard syntax
          "CREATE TABLE IF NOT EXISTS _migrations (id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY, name VARCHAR(256) NOT NULL)"

  markUp name conn =
    void $
    HDBC.run conn
      "INSERT INTO _migrations (name) VALUES (?)"
      [HDBC.toSql $ unpackMigrationName name]

  markDown name conn =
    void $
    HDBC.quickQuery conn
      "DELETE FROM _migrations WHERE name = ?"
      [HDBC.toSql $ unpackMigrationName name]

  getMigrations conn = do
    result <- HDBC.quickQuery conn
      "SELECT name FROM _migrations ORDER BY id"
      []
    return [ MigrationName . HDBC.fromSql $ name | [name] <- result ]