module Database.SQLite.Simple.Internal where
import Prelude hiding (catch)
import Control.Applicative
import Control.Exception
import Data.ByteString (ByteString)
import Data.ByteString.Char8()
import Control.Monad.Trans.State.Strict
import Control.Monad.Trans.Reader
import qualified Data.Text as T
import Database.SQLite.Simple.Ok
import qualified Database.SQLite3 as Base
data Connection = Connection Base.Database
data Field = Field {
result :: Base.SQLData
, column :: !Int
}
data Row = Row {
row :: !Int
, rowresult :: [Base.SQLData]
}
newtype RowParser a = RP { unRP :: ReaderT Row (StateT Int Ok) a }
deriving ( Functor, Applicative, Alternative, Monad )
type Result = [[Base.SQLData]]
gettypename :: Base.SQLData -> ByteString
gettypename (Base.SQLInteger _) = "INTEGER"
gettypename (Base.SQLFloat _) = "FLOAT"
gettypename (Base.SQLText _) = "TEXT"
gettypename (Base.SQLBlob _) = "BLOB"
gettypename Base.SQLNull = "NULL"
exec :: Connection -> T.Text -> IO Result
exec (Connection conn) q =
bracket (Base.prepare conn (T.unpack q)) Base.finalize stepStmt
stepStmt :: Base.Statement -> IO Result
stepStmt = go
where
go stmt = do
res <- Base.step stmt
case res of
Base.Row -> do
cols <- Base.columns stmt
next <- go stmt
return $ cols : next
Base.Done ->
return []