{-# LANGUAGE DeriveDataTypeable, GeneralizedNewtypeDeriving #-} ------------------------------------------------------------------------------ -- | -- Module: Database.SQLite.Simple.Internal -- Copyright: (c) 2011-2012 Leon P Smith -- (c) 2012-2013 Janne Hellsten -- License: BSD3 -- Maintainer: Janne Hellsten -- Portability: portable -- -- Internal bits. This interface is less stable and can change at any time. -- In particular this means that while the rest of the sqlite-simple -- package endeavors to follow the package versioning policy, this module -- does not. Also, at the moment there are things in here that aren't -- particularly internal and are exported elsewhere; these will eventually -- disappear from this module. -- ------------------------------------------------------------------------------ module Database.SQLite.Simple.Internal where import Prelude hiding (catch) import Control.Exception (Exception) import Control.Monad import Control.Applicative import Data.ByteString (ByteString) import Data.ByteString.Char8() import Data.Typeable (Typeable) import Control.Monad.Trans.State.Strict import Control.Monad.Trans.Reader import Database.SQLite.Simple.Ok import qualified Database.SQLite3 as Base -- | Connection to an open database. -- -- You can use 'connectionHandle' to gain access to the underlying -- connection. -- This may be useful if you need to access some direct-sqlite -- functionality that's not exposed in the sqlite-simple API. This -- should be a safe thing to do although mixing both APIs is -- discouraged. newtype Connection = Connection { connectionHandle :: Base.Database } data ColumnOutOfBounds = ColumnOutOfBounds { errorColumnIndex :: Int } deriving (Eq, Show, Typeable) instance Exception ColumnOutOfBounds -- | A Field represents metadata about a particular field data Field = Field { result :: Base.SQLData , column :: {-# UNPACK #-} !Int } -- Named type for holding RowParser read-only state. Just for making -- it easier to make sense out of types in FromRow. newtype RowParseRO = RowParseRO { nColumns :: Int } newtype RowParser a = RP { unRP :: ReaderT RowParseRO (StateT (Int, [Base.SQLData]) Ok) a } deriving ( Functor, Applicative, Alternative, Monad, MonadPlus ) gettypename :: Base.SQLData -> ByteString gettypename (Base.SQLInteger _) = "INTEGER" gettypename (Base.SQLFloat _) = "FLOAT" gettypename (Base.SQLText _) = "TEXT" gettypename (Base.SQLBlob _) = "BLOB" gettypename Base.SQLNull = "NULL"