module Database.Selda.Backend
( MonadIO (..)
, QueryRunner, SeldaBackend (..), MonadSelda (..), SeldaT (..), SeldaM
, Param (..), Lit (..), SqlValue (..), ColAttr (..)
, compileColAttr
, sqlDateTimeFormat, sqlDateFormat, sqlTimeFormat
, runSeldaT
) where
import Database.Selda.SQL (Param (..))
import Database.Selda.SqlType
import Database.Selda.Table (ColAttr (..))
import Database.Selda.Table.Compile (compileColAttr)
import Control.Monad.Catch
import Control.Monad.IO.Class
import Control.Monad.State
import Data.Text (Text)
type QueryRunner a = Text -> [Param] -> IO a
data SeldaBackend = SeldaBackend
{
runStmt :: QueryRunner (Int, [[SqlValue]])
, runStmtWithPK :: QueryRunner Int
, customColType :: Text -> [ColAttr] -> Maybe Text
, defaultKeyword :: Text
}
class MonadIO m => MonadSelda m where
seldaBackend :: m SeldaBackend
newtype SeldaT m a = S {unS :: StateT SeldaBackend m a}
deriving ( Functor, Applicative, Monad, MonadIO
, MonadThrow, MonadCatch, MonadMask, MonadTrans
)
instance MonadIO m => MonadSelda (SeldaT m) where
seldaBackend = S get
type SeldaM = SeldaT IO
runSeldaT :: MonadIO m => SeldaT m a -> SeldaBackend -> m a
runSeldaT m b = fst <$> runStateT (unS m) b