sqlite-simple 0.4.15.0 → 0.4.16.0
raw patch · 7 files changed
+124/−4 lines, 7 filesdep +template-haskell
Dependencies added: template-haskell
Files
- Database/SQLite/Simple/FromField.hs +3/−0
- Database/SQLite/Simple/QQ.hs +51/−0
- changelog +4/−0
- sqlite-simple.cabal +4/−2
- test/Main.hs +4/−1
- test/QQ.hs +32/−0
- test/UserInstances.hs +26/−1
Database/SQLite/Simple/FromField.hs view
@@ -195,6 +195,9 @@ fromField f = returnError ConversionFailed f "expecting SQLText column type" +instance FromField SQLData where+ fromField f = Ok (fieldData f)+ fieldTypename :: Field -> String fieldTypename = B.unpack . gettypename . result
+ Database/SQLite/Simple/QQ.hs view
@@ -0,0 +1,51 @@+{-# LANGUAGE TemplateHaskell #-}++------------------------------------------------------------------------------+-- |+-- Module: Database.SQLite.Simple.QQ+-- Copyright: (c) 2011-2012 Leon P Smith+-- (c) 2018 Janne Hellsten+-- License: BSD3+-- Maintainer: Janne Hellsten <jjhellst@gmail.com>+-- Portability: portable+--+-- The 'sql' quasiquoter, for writing large @SQL@ statements.+--+------------------------------------------------------------------------------++module Database.SQLite.Simple.QQ+ ( sql+ ) where++import Data.String (fromString)+import Database.SQLite.Simple.Types (Query)+import Language.Haskell.TH (Exp, Q, appE, stringE)+import Language.Haskell.TH.Quote (QuasiQuoter (..))++{- | A quasiquoter for writing big @SQL@ queries.++One should consider turning on the @-XQuasiQuotes@ pragma in that module:++@+{-# LANGUAGE QuasiQuoter #-}++myQuery = query conn [sql|+ SELECT+ *+ FROM+ users+ WHERE jobTitle = ?+ |] jobTitle+@++-}+sql :: QuasiQuoter+sql = QuasiQuoter+ { quotePat = error "Database.SQLite.Simple.QQ.sql: quasiquoter used in pattern context"+ , quoteType = error "Database.SQLite.Simple.QQ.sql: quasiquoter used in type context"+ , quoteDec = error "Database.SQLite.Simple.QQ.sql: quasiquoter used in declaration context"+ , quoteExp = sqlExp+ }++sqlExp :: String -> Q Exp+sqlExp = appE [| fromString :: String -> Query |] . stringE
changelog view
@@ -1,3 +1,7 @@+0.4.16.0+ * Add FromField instance for SQLData (thanks @LindaOrtega, @Shimuuar)+ * Add QuasiQuoter sql (thanks @vrom911)+ 0.4.15.0 * Support GHC 8.4.1 (Add instance Semigroup Query) (thanks @gwils!)
sqlite-simple.cabal view
@@ -1,5 +1,5 @@ Name: sqlite-simple-Version: 0.4.15.0+Version: 0.4.16.0 Synopsis: Mid-Level SQLite client library Description: Mid-level SQLite client library, based on postgresql-simple.@@ -35,6 +35,7 @@ Database.SQLite.Simple.FromField Database.SQLite.Simple.FromRow Database.SQLite.Simple.Internal+ Database.SQLite.Simple.QQ Database.SQLite.Simple.ToField Database.SQLite.Simple.ToRow Database.SQLite.Simple.Types@@ -50,6 +51,7 @@ containers, direct-sqlite >= 2.3.13 && < 2.4, semigroups == 0.18.*,+ template-haskell, text >= 0.11, time, transformers,@@ -81,6 +83,7 @@ , Errors , Fold , ParamConv+ , QQ , Simple , Statement , TestImports@@ -103,4 +106,3 @@ , direct-sqlite , text , time-
test/Main.hs view
@@ -1,4 +1,3 @@- import Common import Control.Exception (bracket) import Control.Monad (when)@@ -10,6 +9,7 @@ import Errors import Fold import ParamConv+import QQ import Simple import Statement import TestImports()@@ -54,6 +54,7 @@ , TestLabel "Utf8" . testUtf8Simplest , TestLabel "Utf8" . testBlobs , TestLabel "Instances" . testUserFromField+ , TestLabel "Instances" . testSQLDataFromField , TestLabel "Fold" . testFolds , TestLabel "Statement" . testBind , TestLabel "Statement" . testDoubleBind@@ -62,6 +63,8 @@ , TestLabel "Debug" . testDebugTracing , TestLabel "Direct" . testDirectSqlite , TestLabel "Imports" . testImports+ , TestLabel "QQ" . testSimpleQQ+ , TestLabel "QQ" . testMultiLinedQQ ] -- | Action for connecting to the database that will be used for testing.
+ test/QQ.hs view
@@ -0,0 +1,32 @@+{-# LANGUAGE QuasiQuotes #-}++module QQ (+ testSimpleQQ+ , testMultiLinedQQ+ ) where++import Common+import Database.SQLite.Simple.QQ (sql)++testSimpleQQ :: TestEnv -> Test+testSimpleQQ TestEnv{..} = TestCase $ do+ q <- query_ conn "SELECT 1+1" :: IO [Only Int]+ qq <- query_ conn [sql|+ SELECT 1 + 1+ |] :: IO [Only Int]+ assertEqual "result" q qq+++testMultiLinedQQ :: TestEnv -> Test+testMultiLinedQQ TestEnv{..} = TestCase $ do+ execute_ conn "CREATE TABLE testQQ (id INTEGER PRIMARY KEY, t TEXT)"+ execute_ conn "INSERT INTO testQQ (t) VALUES ('test string')"+ q <- query_ conn "SELECT t FROM testQQ" :: IO [Only String]+ qq <- query_ conn [sql|+ SELECT+ t+ FROM+ testQQ++ |] :: IO [Only String]+ assertEqual "result" q qq
test/UserInstances.hs view
@@ -1,8 +1,12 @@ {-# LANGUAGE DeriveDataTypeable #-} -module UserInstances (testUserFromField) where+module UserInstances (+ testUserFromField+ ,testSQLDataFromField+ ) where import Common+import Data.Int (Int64) import Data.Typeable (Typeable) import qualified Data.Text as T import Database.SQLite.Simple.FromField@@ -31,3 +35,24 @@ execute conn "INSERT INTO fromfield (t) VALUES (?)" (Only (MyType "test2")) [Only r] <- query_ conn "SELECT t FROM fromfield" :: IO [(Only String)] "toField test2" @=? r++testSQLDataFromField :: TestEnv -> Test+testSQLDataFromField TestEnv{..} = TestCase $ do+ execute_ conn "CREATE TABLE sqldatafromfield (t TEXT, i INT, b BOOLEAN, f FLOAT)"+ execute conn "INSERT INTO sqldatafromfield (t,i,b,f) VALUES (?,?,?,?)" (("test string" :: T.Text,+ 1 :: Int64,+ True :: Bool,+ 1.11 :: Double))+ execute conn "INSERT INTO sqldatafromfield (t,i,b) VALUES (?,?,?)" (("test string2" :: T.Text,+ 2 :: Int64,+ False :: Bool))+ r <- query_ conn "SELECT * FROM sqldatafromfield" :: IO [[SQLData]]+ let testData = [[SQLText "test string",+ SQLInteger 1,+ SQLInteger 1,+ SQLFloat 1.11],+ [SQLText "test string2",+ SQLInteger 2,+ SQLInteger 0,+ SQLNull]]+ testData @=? r