relational-query-HDBC-0.0.1.0: src/Database/HDBC/Schema/Driver.hs
-- |
-- Module : Database.HDBC.Schema.Driver
-- Copyright : 2013 Kei Hibino
-- License : BSD3
--
-- Maintainer : ex8k.hibino@gmail.com
-- Stability : experimental
-- Portability : unknown
--
-- This module provides driver interface
-- to load database system catalog via HDBC.
module Database.HDBC.Schema.Driver (
TypeMap,
Driver(Driver, typeMap, getFieldsWithMap, getPrimaryKey),
emptyDriver,
getFields
) where
import Database.HDBC (IConnection)
import Language.Haskell.TH (TypeQ)
-- | Mapping between type name string of DBMS and type in Haskell.
-- Type name string depends on specification of DBMS system catalogs.
type TypeMap = [(String, TypeQ)]
-- | Interface type to load database system catalog via HDBC.
data Driver conn =
Driver
{ -- | Custom type mapping of this driver
typeMap :: TypeMap
-- | Get column name and Haskell type pairs and not-null columns index.
, getFieldsWithMap :: TypeMap -- Custom type mapping
-> conn -- Connection to query system catalog
-> String -- Schema name string
-> String -- Table name string
-> IO ([(String, TypeQ)], [Int]) -- Action to get column name and Haskell type pairs and not-null columns index.
-- | Get primary key column name.
, getPrimaryKey :: conn -- Connection to query system catalog
-> String -- Schema name string
-> String -- Table name string
-> IO [String] -- Action to get column names of primary key
}
-- | Empty definition of 'Driver'
emptyDriver :: IConnection conn => Driver conn
emptyDriver = Driver [] (\_ _ _ _ -> return ([],[])) (\_ _ _ -> return [])
-- | Helper function to call 'getFieldsWithMap' using 'typeMap' of 'Driver'.
getFields :: IConnection conn => Driver conn -> conn -> String -> String -> IO ([(String, TypeQ)], [Int])
getFields drv = getFieldsWithMap drv (typeMap drv)