module Database.Sql.Simple.SQLite
( SQLite(..)
, ConnectInfo(..)
, sqlite
) where
import Control.Applicative
import Data.Typeable
import Database.Sql.Simple.Internal
import qualified Database.SQLite.Simple as SQLite
import qualified Database.SQLite.Simple.ToField as SQLite
import qualified Database.SQLite.Simple.FromField as SQLite
import Data.String
#if !MIN_VERSION_base(4,7,0)
import Data.Proxy
#endif
data SQLite = SQLite SQLite.Connection
deriving Typeable
sqliteQuery :: Query -> SQLite.Query
sqliteQuery = SQLite.Query . getQuery (typeOf (undefined :: SQLite))
instance Backend SQLite where
newtype ConnectInfo SQLite = ConnectInfo String deriving (Eq, Read, Show)
type ToRow SQLite = SQLite.ToRow
type FromRow SQLite = SQLite.FromRow
connect (ConnectInfo i) = SQLite <$> SQLite.open i
close (SQLite c) = SQLite.close c
execute (SQLite c) t q = Sql $ SQLite.execute c (sqliteQuery t) q
execute_ (SQLite c) t = Sql $ SQLite.execute_ c (sqliteQuery t)
query (SQLite c) t q = Sql $ SQLite.query c (sqliteQuery t) q
query_ (SQLite c) t = Sql $ SQLite.query_ c (sqliteQuery t)
fold (SQLite c) q = SQLite.fold c (sqliteQuery q)
fold_ (SQLite c) q = SQLite.fold_ c (sqliteQuery q)
instance Transaction SQLite where
begin c = execute_ c "BEGIN TRANSACTION"
commit c = execute_ c "COMMIT TRANSACTION"
rollback c = execute_ c "ROLLBACK TRANSACTION"
instance IsString (ConnectInfo SQLite) where
fromString = ConnectInfo
sqlite :: Proxy '[SQLite]
sqlite = Proxy
instance SQLite.ToField a => SQLite.ToRow (Only a) where
toRow (Only v) = SQLite.toRow $ SQLite.Only v
instance SQLite.FromField a => SQLite.FromRow (Only a) where
fromRow = Only <$> SQLite.field
instance (SQLite.ToRow a, SQLite.ToRow b) => SQLite.ToRow (a :. b) where
toRow (a :. b) = SQLite.toRow $ a SQLite.:. b
instance (SQLite.FromRow a, SQLite.FromRow b) => SQLite.FromRow (a :. b) where
fromRow = (\(a SQLite.:. b) -> a :. b) <$> SQLite.fromRow