persistent-mysql 2.12.0.0 → 2.12.1.0
raw patch · 4 files changed
+41/−22 lines, 4 files
Files
- ChangeLog.md +5/−0
- Database/Persist/MySQL.hs +32/−21
- persistent-mysql.cabal +1/−1
- test/InsertDuplicateUpdate.hs +3/−0
ChangeLog.md view
@@ -1,5 +1,10 @@ # Changelog for persistent-mysql +## 2.12.1.0++* Expose `openMySQLConn` for explicit reference to opened connection. [#1248](https://github.com/yesodweb/persistent/pull/1248)+ * Makes it convenient to use with `mysql-simple`.+ ## 2.12.0.0 * Decomposed `HaskellName` into `ConstraintNameHS`, `EntityNameHS`, `FieldNameHS`. Decomposed `DBName` into `ConstraintNameDB`, `EntityNameDB`, `FieldNameDB` respectively. [#1174](https://github.com/yesodweb/persistent/pull/1174)
Database/Persist/MySQL.hs view
@@ -32,36 +32,36 @@ , copyUnlessNull , copyUnlessEmpty , copyUnlessEq+ , openMySQLConn ) where -import qualified Blaze.ByteString.Builder.Char8 as BBB import qualified Blaze.ByteString.Builder.ByteString as BBS+import qualified Blaze.ByteString.Builder.Char8 as BBB import Control.Arrow import Control.Monad-import Control.Monad.IO.Class (MonadIO (..))+import Control.Monad.IO.Class (MonadIO(..)) import Control.Monad.IO.Unlift (MonadUnliftIO) import Control.Monad.Logger (MonadLoggerIO, runNoLoggingT) import Control.Monad.Trans.Class (lift) import Control.Monad.Trans.Except (ExceptT, runExceptT)-import Control.Monad.Trans.Reader (runReaderT, ReaderT)+import Control.Monad.Trans.Reader (ReaderT, runReaderT) import Control.Monad.Trans.Writer (runWriterT) -import GHC.Stack-import Data.Conduit-import qualified Data.Conduit.List as CL import Data.Acquire (Acquire, mkAcquire, with) import Data.Aeson import Data.Aeson.Types (modifyFailure) import Data.ByteString (ByteString)+import Data.Conduit+import qualified Data.Conduit.List as CL import Data.Either (partitionEithers) import Data.Fixed (Pico) import Data.Function (on)-import Data.Int (Int64) import Data.IORef-import Data.List (find, intercalate, sort, groupBy)+import Data.Int (Int64)+import Data.List (find, groupBy, intercalate, sort) import qualified Data.Map as Map-import Data.Maybe (listToMaybe, mapMaybe, fromMaybe)+import Data.Maybe (fromMaybe, listToMaybe, mapMaybe) import Data.Monoid ((<>)) import qualified Data.Monoid as Monoid import Data.Pool (Pool)@@ -69,18 +69,19 @@ import qualified Data.Text as T import qualified Data.Text.Encoding as T import qualified Data.Text.IO as T+import GHC.Stack import System.Environment (getEnvironment) import Database.Persist.Sql import Database.Persist.Sql.Types.Internal (makeIsolationLevelStatement) import qualified Database.Persist.Sql.Util as Util -import qualified Database.MySQL.Base as MySQLBase-import qualified Database.MySQL.Base.Types as MySQLBase-import qualified Database.MySQL.Simple as MySQL-import qualified Database.MySQL.Simple.Param as MySQL+import qualified Database.MySQL.Base as MySQLBase+import qualified Database.MySQL.Base.Types as MySQLBase+import qualified Database.MySQL.Simple as MySQL+import qualified Database.MySQL.Simple.Param as MySQL import qualified Database.MySQL.Simple.Result as MySQL-import qualified Database.MySQL.Simple.Types as MySQL+import qualified Database.MySQL.Simple.Types as MySQL -- | Create a MySQL connection pool and run the given action. -- The pool is properly released after the action finishes using@@ -120,14 +121,17 @@ withMySQLConn = withSqlConn . open' --- | Internal function that opens a connection to the MySQL--- server.-open' :: MySQL.ConnectInfo -> LogFunc -> IO SqlBackend-open' ci logFunc = do+-- | Open a connection to MySQL server, initialize the 'SqlBackend' and return+-- their tuple+--+-- @since 2.12.1.0+openMySQLConn :: MySQL.ConnectInfo -> LogFunc -> IO (MySQL.Connection, SqlBackend)+openMySQLConn ci logFunc = do conn <- MySQL.connect ci MySQLBase.autocommit conn False -- disable autocommit! smap <- newIORef $ Map.empty- return $ SqlBackend+ let+ backend = SqlBackend { connPrepare = prepare' conn , connStmtMap = smap , connInsertSql = insertSql'@@ -153,7 +157,14 @@ , connMaxParams = Nothing , connRepsertManySql = Just repsertManySql }+ pure (conn, backend) ++-- | Internal function that opens a connection to the MySQL server.+open' :: MySQL.ConnectInfo -> LogFunc -> IO SqlBackend+open' ci logFunc = snd <$> openMySQLConn ci logFunc++ -- | Prepare a query. We don't support prepared statements, but -- we'll do some client-side preprocessing here. prepare' :: MySQL.Connection -> Text -> IO Statement@@ -320,7 +331,7 @@ -- Controversial conversions go MySQLBase.Set _ _ = convertPV PersistText go MySQLBase.Enum _ _ = convertPV PersistText- -- Conversion using PersistDbSpecific+ -- Conversion using PersistLiteral go MySQLBase.Geometry _ _ = \_ m -> case m of Just g -> PersistLiteral g@@ -1428,7 +1439,7 @@ -- [] -- @ ----- Once we run that code on the datahase, the new data set looks like this:+-- Once we run that code on the database, the new data set looks like this: -- -- > items: -- > +------+-------------+-------+----------+
persistent-mysql.cabal view
@@ -1,5 +1,5 @@ name: persistent-mysql-version: 2.12.0.0+version: 2.12.1.0 license: MIT license-file: LICENSE author: Felipe Lessa <felipe.lessa@gmail.com>, Michael Snoyman
test/InsertDuplicateUpdate.hs view
@@ -61,12 +61,15 @@ dbItems <- map entityVal <$> selectList [] [] sort dbItems @== sort (newItem : items) it "updates existing records" $ db $ do+ let postUpdate = map (\i -> i { itemQuantity = fmap (+1) (itemQuantity i) }) items deleteWhere ([] :: [Filter Item]) insertMany_ items insertManyOnDuplicateKeyUpdate items [] [ItemQuantity +=. Just 1]+ dbItems <- sort . fmap entityVal <$> selectList [] []+ dbItems @== sort postUpdate it "only copies passing values" $ db $ do deleteWhere ([] :: [Filter Item]) insertMany_ items