-----------------------------------------------------------
-- |
-- Module : Database.HaskellDB.HSQL.Oracle
-- Copyright : HWT Group 2003,
-- Bjorn Bringert 2006,
-- Henning Thielemann 2008
-- License : BSD-style
--
-- Maintainer : haskelldb-users@lists.sourceforge.net
-- Stability : experimental
-- Portability : non-portable
--
-----------------------------------------------------------
module Database.HaskellDB.HSQL.Oracle (
OracleOptions(..),
oracleConnect,
DriverInterface(..),
driver
) where
import Database.HaskellDB.Database
import Database.HaskellDB.HSQL
import Database.HaskellDB.DriverAPI
import Database.HaskellDB.Sql.Generate (SqlGenerator)
import qualified Database.HSQL.Oracle as Oracle
import qualified Database.HSQL as HSQL
import Database.HSQL.Types (connTables)
import Control.Exception (bracket)
data OracleOptions =
OracleOptions {
dsn :: String, -- ^ name binding in Oracle
uid :: String, -- ^ user id
pwd :: String -- ^ password
}
oracleConnect ::
MonadIO m =>
SqlGenerator -> OracleOptions -> (Database -> m a) -> m a
oracleConnect gen opts =
hsqlConnect gen (Oracle.connect (dsn opts) (uid opts) (pwd opts))
{-
HSQL's connTables asks for COREDB_SYSTEM,
but newer Oracle versions (e.g. 10g) do not have it.
Instead they provide a USER_TABLES.
This should clearly be fixed in HSQL not here.
let connector = Oracle.connect (dsn opts) (uid opts) (pwd opts)
getTables =
bracket connector HSQL.disconnect $ \c ->
-- inTransaction c $ \c ->
retrieveTables c
in hsqlConnect gen
(fmap (\c -> c {connTables = getTables}) connector)
retrieveTables :: HSQL.Connection -> IO [String]
retrieveTables c =
HSQL.query c "select table_name from user_tables" >>=
HSQL.collectRows (flip HSQL.getFieldValue "TABLE_NAME")
-}
options :: [(String, String)]
options =
("dsn", "Data Source Name") :
("uid", "User") :
("pwd", "Password") :
[]
oracleConnectOpts ::
MonadIO m =>
[(String,String)] -> (Database -> m a) -> m a
oracleConnectOpts opts f =
do
[a,b,c] <- getAnnotatedOptions options opts
g <- getGenerator opts
oracleConnect g
(OracleOptions
{dsn = a,
uid = b,
pwd = c}) f
-- | This driver requires the following options:
-- "dsn", "uid", "pwd"
driver :: DriverInterface
driver = defaultdriver { connect = oracleConnectOpts, requiredOptions = options }