packages feed

haskelldb-hsql-sqlite-1.0.0: Database/HaskellDB/HSQL/SQLite.hs

-----------------------------------------------------------
-- |
-- Module      :  Database.HaskellDB.HSQL.SQLite
-- Copyright   :  HWT Group 2003,
--                Bjorn Bringert 2006
-- License     :  BSD-style
-- 
-- Maintainer  :  haskelldb-users@lists.sourceforge.net
-- Stability   :  experimental
-- Portability :  non-portable
--
-- Interface to SQLite 2 <http://www.hwaci.com/sw/sqlite/>
-- databases.
--
-----------------------------------------------------------
module Database.HaskellDB.HSQL.SQLite (
		   SQLiteOptions(..), sqliteConnect,
                   DriverInterface(..), driver
		  ) where

import Database.HaskellDB.Database
import Database.HaskellDB.HSQL
import Database.HaskellDB.DriverAPI
import Database.HaskellDB.Sql.SQLite as SQLite

import qualified Database.HSQL.SQLite2 as SQLite2 (connect) 
import System.IO

data SQLiteOptions = SQLiteOptions { 
				    filepath :: FilePath, -- ^ database file
				    mode :: IOMode        -- ^ access mode
                  		   }

sqliteConnect :: MonadIO m => SQLiteOptions -> (Database -> m a) -> m a
sqliteConnect opts = 
    hsqlConnect SQLite.generator (SQLite2.connect (filepath opts) (mode opts))

options :: [(String, String)]
options =
    ("filepath", "File path") :
    ("mode", "r/w/a/rw for read/(over)write/append/random access") :
    []

sqliteConnectOpts :: MonadIO m => [(String,String)] -> (Database -> m a) -> m a
sqliteConnectOpts opts f = 
    do
    [a,b] <- getAnnotatedOptions options opts
    m <- readIOMode b
    sqliteConnect (SQLiteOptions {filepath = a,
				  mode = m}) f

readIOMode :: Monad m => String -> m IOMode
readIOMode s = 
    case s of
           "r" -> return ReadMode
           "w" -> return WriteMode
           "a" -> return AppendMode
           "rw" -> return ReadWriteMode
           _ -> case reads s of
                             [(x,"")] -> return x
                             _ -> fail $ "Bad IO mode: " ++ s

-- | This driver requires the following options: 
--   "filepath", "mode"
-- The possible values of the "mode" option are "r", "w", "rw"
driver :: DriverInterface
driver = defaultdriver {connect = sqliteConnectOpts, requiredOptions = options}