selda-0.4.0.0: src/Database/Selda/Backend.hs
-- | API for building Selda backends and adding support for more types
-- in queries.
module Database.Selda.Backend
( MonadSelda (..), SeldaT, SeldaM, SeldaError (..)
, StmtID, BackendID (..), QueryRunner, SeldaBackend (..), SeldaConnection
, SqlValue (..)
, IndexMethod (..)
, Param (..), ColAttr (..), AutoIncType (..)
, PPConfig (..), defPPConfig
, TableName, ColName, TableInfo (..), ColumnInfo (..)
, isAutoPrimary, isPrimary, isUnique
, tableInfo, fromColInfo
, mkTableName, mkColName, fromTableName, fromColName, rawTableName
, newConnection, allStmts, withBackend
, runSeldaT, seldaClose
, module SqlType
) where
import Control.Monad
import Control.Monad.Catch
import Control.Monad.IO.Class
import Data.IORef
import Database.Selda.Backend.Internal
import Database.Selda.SqlType as SqlType
import Database.Selda.Table (IndexMethod (..))
import Database.Selda.Types
-- | Close a reusable Selda connection.
-- Closing a connection while in use is undefined.
-- Passing a closed connection to 'runSeldaT' results in a 'SeldaError'
-- being thrown. Closing a connection more than once is a no-op.
seldaClose :: MonadIO m => SeldaConnection b -> m ()
seldaClose c = liftIO $ mask_ $ do
closed <- atomicModifyIORef' (connClosed c) $ \closed -> (True, closed)
unless closed $ closeConnection (connBackend c) c