Hello community,
here is the log from the commit of package ghc-persistent for openSUSE:Factory checked in at 2017-04-11 09:43:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-persistent (Old)
and /work/SRC/openSUSE:Factory/.ghc-persistent.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-persistent"
Tue Apr 11 09:43:03 2017 rev:7 rq:485151 version:2.6.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-persistent/ghc-persistent.changes 2016-10-18 10:41:03.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.ghc-persistent.new/ghc-persistent.changes 2017-04-11 09:43:03.230959323 +0200
@@ -1,0 +2,5 @@
+Tue Mar 14 09:26:00 UTC 2017 - psimons@suse.com
+
+- Update to version 2.6.1 with cabal2obs.
+
+-------------------------------------------------------------------
Old:
----
persistent-2.6.tar.gz
persistent.cabal
New:
----
persistent-2.6.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-persistent.spec ++++++
--- /var/tmp/diff_new_pack.teyV3i/_old 2017-04-11 09:43:03.834874012 +0200
+++ /var/tmp/diff_new_pack.teyV3i/_new 2017-04-11 09:43:03.834874012 +0200
@@ -1,7 +1,7 @@
#
# spec file for package ghc-persistent
#
-# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -19,14 +19,13 @@
%global pkg_name persistent
%bcond_with tests
Name: ghc-%{pkg_name}
-Version: 2.6
+Version: 2.6.1
Release: 0
Summary: Type-safe, multi-backend data serialization
License: MIT
Group: Development/Languages/Other
Url: https://hackage.haskell.org/package/%{pkg_name}
Source0: https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz
-Source1: https://hackage.haskell.org/package/%{pkg_name}-%{version}/revision/2.cabal#/%{pkg_name}.cabal
BuildRequires: ghc-Cabal-devel
BuildRequires: ghc-aeson-devel
BuildRequires: ghc-attoparsec-devel
@@ -80,7 +79,6 @@
%prep
%setup -q -n %{pkg_name}-%{version}
-cp -p %{SOURCE1} %{pkg_name}.cabal
%build
%ghc_lib_build
@@ -103,5 +101,6 @@
%files devel -f %{name}-devel.files
%defattr(-,root,root,-)
+%doc ChangeLog.md README.md
%changelog
++++++ persistent-2.6.tar.gz -> persistent-2.6.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/ChangeLog.md new/persistent-2.6.1/ChangeLog.md
--- old/persistent-2.6/ChangeLog.md 2016-08-10 05:29:36.000000000 +0200
+++ new/persistent-2.6.1/ChangeLog.md 2017-03-06 13:58:44.000000000 +0100
@@ -1,3 +1,10 @@
+## 2.6.1
+
+* Fix edge case for `\<-. [Nothing]`
+* Introduce `connMaxParams`
+* Add 'getJustEntity' and 'insertRecord' convenience function
+* Minor Haddock improvment
+
## 2.6
* Add `connUpsertSql` type for providing backend-specific upsert sql support.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Class/PersistConfig.hs new/persistent-2.6.1/Database/Persist/Class/PersistConfig.hs
--- old/persistent-2.6/Database/Persist/Class/PersistConfig.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Class/PersistConfig.hs 2017-03-01 07:48:55.000000000 +0100
@@ -9,7 +9,7 @@
import Data.Aeson.Types (Parser)
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Trans.Control (MonadBaseControl)
-import Control.Applicative ((<$>))
+import Control.Applicative as A ((<$>))
import qualified Data.HashMap.Strict as HashMap
-- | Represents a value containing all the configuration options for a specific
@@ -48,7 +48,7 @@
loadConfig (Object o) =
case HashMap.lookup "left" o of
- Just v -> Left <$> loadConfig v
+ Just v -> Left A.<$> loadConfig v
Nothing ->
case HashMap.lookup "right" o of
Just v -> Right <$> loadConfig v
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Class/PersistEntity.hs new/persistent-2.6.1/Database/Persist/Class/PersistEntity.hs
--- old/persistent-2.6/Database/Persist/Class/PersistEntity.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Class/PersistEntity.hs 2017-03-01 07:48:55.000000000 +0100
@@ -32,9 +32,13 @@
import Data.Aeson (ToJSON (..), FromJSON (..), fromJSON, object, (.:), (.=), Value (Object))
import qualified Data.Aeson.Parser as AP
import Data.Aeson.Types (Parser,Result(Error,Success))
+#if MIN_VERSION_aeson(1,0,0)
+import Data.Aeson.Text (encodeToTextBuilder)
+#else
import Data.Aeson.Encode (encodeToTextBuilder)
+#endif
import Data.Attoparsec.ByteString (parseOnly)
-import Control.Applicative ((<$>), (<*>))
+import Control.Applicative as A ((<$>), (<*>))
import Data.Monoid (mappend)
import qualified Data.HashMap.Strict as HM
import Data.Typeable (Typeable)
@@ -218,8 +222,8 @@
keyValueEntityFromJSON :: (PersistEntity record, FromJSON record, FromJSON (Key record))
=> Value -> Parser (Entity record)
keyValueEntityFromJSON (Object o) = Entity
- <$> o .: "key"
- <*> o .: "value"
+ A.<$> o .: "key"
+ A.<*> o .: "value"
keyValueEntityFromJSON _ = fail "keyValueEntityFromJSON: not an object"
-- | Predefined @toJSON@. The resulting JSON looks like
@@ -256,7 +260,7 @@
_ -> error $ T.unpack $ errMsg "expected PersistMap"
fromPersistValue (PersistMap alist) = case after of
- [] -> Left $ errMsg $ "did not find " `mappend` idField `mappend` " field"
+ [] -> Left $ errMsg $ "did not find " `Data.Monoid.mappend` idField `mappend` " field"
("_id", kv):afterRest ->
fromPersistValue (PersistMap (before ++ afterRest)) >>= \record ->
keyFromValues [kv] >>= \k ->
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Class/PersistField.hs new/persistent-2.6.1/Database/Persist/Class/PersistField.hs
--- old/persistent-2.6/Database/Persist/Class/PersistField.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Class/PersistField.hs 2017-03-01 07:48:55.000000000 +0100
@@ -3,9 +3,11 @@
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE PatternGuards #-}
{-# LANGUAGE OverloadedStrings #-}
-#ifndef NO_OVERLAP
+
+#if !MIN_VERSION_base(4,8,0)
{-# LANGUAGE OverlappingInstances #-}
#endif
+
module Database.Persist.Class.PersistField
( PersistField (..)
, SomePersistField (..)
@@ -14,12 +16,17 @@
import Control.Arrow (second)
import Database.Persist.Types.Base
-import Data.Time (Day(..), TimeOfDay, UTCTime, parseTime)
+import Data.Time (Day(..), TimeOfDay, UTCTime,
+#if MIN_VERSION_time(1,5,0)
+ parseTimeM)
+#else
+ parseTime)
+#endif
#ifdef HIGH_PRECISION_DATE
import Data.Time.Clock.POSIX (posixSecondsToUTCTime)
#endif
import Data.ByteString.Char8 (ByteString, unpack, readInt)
-import Control.Applicative
+import Control.Applicative as A
import Data.Int (Int8, Int16, Int32, Int64)
import Data.Word (Word, Word8, Word16, Word32, Word64)
import Data.Text (Text)
@@ -56,8 +63,6 @@
#if MIN_VERSION_base(4,8,0)
import Numeric.Natural (Natural)
-#else
-import Control.Applicative ((<$>))
#endif
-- | A value which can be marshalled to and from a 'PersistValue'.
@@ -66,7 +71,11 @@
fromPersistValue :: PersistValue -> Either T.Text a
#ifndef NO_OVERLAP
-instance PersistField String where
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} PersistField [Char] where
+#else
+instance PersistField [Char] where
+#endif
toPersistValue = PersistText . T.pack
fromPersistValue (PersistText s) = Right $ T.unpack s
fromPersistValue (PersistByteString bs) =
@@ -88,7 +97,7 @@
instance PersistField ByteString where
toPersistValue = PersistByteString
fromPersistValue (PersistByteString bs) = Right bs
- fromPersistValue x = T.encodeUtf8 <$> fromPersistValue x
+ fromPersistValue x = T.encodeUtf8 A.<$> fromPersistValue x
instance PersistField T.Text where
toPersistValue = PersistText
@@ -144,7 +153,7 @@
xs -> error $ "PersistField Int64 failed parsing PersistByteString xs["++show xs++"] i["++show bs++"]"
fromPersistValue x = Left $ T.pack $ "int64 Expected Integer, received: " ++ show x
-instance PersistField Word where
+instance PersistField Data.Word.Word where
toPersistValue = PersistInt64 . fromIntegral
fromPersistValue (PersistInt64 i) = Right $ fromIntegral i
fromPersistValue x = Left $ T.pack $ "Expected Word, received: " ++ show x
@@ -249,9 +258,13 @@
_ ->
case parse8601 $ T.unpack t of
Nothing -> Left $ T.pack $ "Expected UTCTime, received " ++ show x
- Just x -> Right x
+ Just x' -> Right x'
where
+#if MIN_VERSION_time(1,5,0)
+ parse8601 = parseTimeM True defaultTimeLocale "%FT%T%Q"
+#else
parse8601 = parseTime defaultTimeLocale "%FT%T%Q"
+#endif
fromPersistValue x@(PersistByteString s) =
case reads $ unpack s of
(d, _):_ -> Right d
@@ -271,7 +284,11 @@
fromPersistValue PersistNull = Right Nothing
fromPersistValue x = Just <$> fromPersistValue x
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPABLE #-} PersistField a => PersistField [a] where
+#else
instance PersistField a => PersistField [a] where
+#endif
toPersistValue = PersistList . fmap toPersistValue
fromPersistValue (PersistList l) = fromPersistList l
fromPersistValue (PersistText t) = fromPersistValue (PersistByteString $ TE.encodeUtf8 t)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Class/PersistStore.hs new/persistent-2.6.1/Database/Persist/Class/PersistStore.hs
--- old/persistent-2.6/Database/Persist/Class/PersistStore.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Class/PersistStore.hs 2017-03-06 13:58:44.000000000 +0100
@@ -10,10 +10,13 @@
, PersistCore (..)
, PersistStoreRead (..)
, PersistStoreWrite (..)
+ , getEntity
, getJust
+ , getJustEntity
, belongsTo
, belongsToJust
, insertEntity
+ , insertRecord
, ToBackendKey(..)
) where
@@ -173,7 +176,7 @@
get key >>= maybe (liftIO $ throwIO $ KeyNotFound $ show key) return
--- | Same as get, but for a non-null (not Maybe) foreign key
+-- | Same as 'get', but for a non-null (not Maybe) foreign key
-- Unsafe unless your database is enforcing that the foreign key is valid.
getJust :: ( PersistStoreRead backend
, Show (Key record)
@@ -184,6 +187,22 @@
(liftIO $ throwIO $ PersistForeignConstraintUnmet $ T.pack $ show key)
return
+-- | Same as 'getJust', but returns an 'Entity' instead of just the record.
+-- @since 2.6.1
+getJustEntity
+ :: (PersistEntityBackend record ~ BaseBackend backend
+ ,MonadIO m
+ ,PersistEntity record
+ ,PersistStoreRead backend)
+ => Key record -> ReaderT backend m (Entity record)
+getJustEntity key = do
+ record <- getJust key
+ return $
+ Entity
+ { entityKey = key
+ , entityVal = record
+ }
+
-- | Curry this to make a convenience function that loads an associated model.
--
-- > foreign = belongsTo foreignId
@@ -216,3 +235,26 @@
insertEntity e = do
eid <- insert e
return $ Entity eid e
+
+-- | Like @get@, but returns the complete @Entity@.
+getEntity ::
+ ( PersistStoreWrite backend
+ , PersistRecordBackend e backend
+ , MonadIO m
+ ) => Key e -> ReaderT backend m (Maybe (Entity e))
+getEntity key = do
+ maybeModel <- get key
+ return $ fmap (key `Entity`) maybeModel
+
+-- | Like 'insertEntity' but just returns the record instead of 'Entity'.
+-- @since 2.6.1
+insertRecord
+ :: (PersistEntityBackend record ~ BaseBackend backend
+ ,PersistEntity record
+ ,MonadIO m
+ ,PersistStoreWrite backend)
+ => record -> ReaderT backend m record
+insertRecord record = do
+ insert_ record
+ return $ record
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Class/PersistUnique.hs new/persistent-2.6.1/Database/Persist/Class/PersistUnique.hs
--- old/persistent-2.6/Database/Persist/Class/PersistUnique.hs 2016-08-01 15:46:55.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Class/PersistUnique.hs 2017-03-01 07:48:55.000000000 +0100
@@ -119,9 +119,9 @@
-- | Insert a value, checking for conflicts with any unique constraints. If a
-- duplicate exists in the database, it is left untouched. The key of the
-- existing or new entry is returned
-insertOrGet :: (MonadIO m, PersistUniqueWrite backend, PersistRecordBackend record backend)
+_insertOrGet :: (MonadIO m, PersistUniqueWrite backend, PersistRecordBackend record backend)
=> record -> ReaderT backend m (Key record)
-insertOrGet val = do
+_insertOrGet val = do
res <- getByValue val
case res of
Nothing -> insert val
@@ -157,7 +157,7 @@
requireUniques :: (MonadIO m, PersistEntity record) => record -> [Unique record] -> m [Unique record]
requireUniques record [] = liftIO $ throwIO $ userError errorMsg
where
- errorMsg = "getByValue: " `mappend` unpack (recordName record) `mappend` " does not have any Unique"
+ errorMsg = "getByValue: " `Data.Monoid.mappend` unpack (recordName record) `mappend` " does not have any Unique"
requireUniques _ xs = return xs
-- TODO: expose this to users
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Class.hs new/persistent-2.6.1/Database/Persist/Class.hs
--- old/persistent-2.6/Database/Persist/Class.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Class.hs 2017-03-06 13:58:44.000000000 +0100
@@ -8,12 +8,14 @@
, PersistStore
, PersistStoreRead (..)
, PersistStoreWrite (..)
- , BaseBackend(..)
, PersistRecordBackend
, getJust
+ , getJustEntity
+ , getEntity
, belongsTo
, belongsToJust
, insertEntity
+ , insertRecord
-- * PersistUnique
, PersistUnique
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Quasi.hs new/persistent-2.6.1/Database/Persist/Quasi.hs
--- old/persistent-2.6/Database/Persist/Quasi.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Quasi.hs 2017-03-01 07:48:55.000000000 +0100
@@ -49,7 +49,7 @@
let (a, b) = T.break (== end) t
in case parseApplyFT a of
PSSuccess ft t' -> case (T.dropWhile isSpace t', T.uncons b) of
- ("", Just (c, t'')) | c == end -> PSSuccess (ftMod ft) (t'' `mappend` t')
+ ("", Just (c, t'')) | c == end -> PSSuccess (ftMod ft) (t'' `Data.Monoid.mappend` t')
(x, y) -> PSFail $ show (b, x, y)
x -> PSFail $ show x
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Sql/Class.hs new/persistent-2.6.1/Database/Persist/Sql/Class.hs
--- old/persistent-2.6/Database/Persist/Sql/Class.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Sql/Class.hs 2017-03-01 07:48:55.000000000 +0100
@@ -7,15 +7,18 @@
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UndecidableInstances #-}
-#ifndef NO_OVERLAP
+{-# LANGUAGE PatternGuards #-}
+
+#if !MIN_VERSION_base(4,8,0)
{-# LANGUAGE OverlappingInstances #-}
#endif
+
module Database.Persist.Sql.Class
( RawSql (..)
, PersistFieldSql (..)
) where
-import Control.Applicative ((<$>), (<*>))
+import Control.Applicative as A ((<$>), (<*>))
import Database.Persist
import Data.Monoid ((<>))
import Database.Persist.Sql.Types
@@ -33,7 +36,7 @@
import Data.Word
import Data.ByteString (ByteString)
import Text.Blaze.Html (Html)
-import Data.Bits (bitSize)
+import Data.Bits (bitSizeMaybe)
import qualified Data.Vector as V
#if MIN_VERSION_base(4,8,0)
@@ -57,7 +60,7 @@
instance PersistField a => RawSql (Single a) where
rawSqlCols _ _ = (1, [])
rawSqlColCountReason _ = "one column for a 'Single' data type"
- rawSqlProcessRow [pv] = Single <$> fromPersistValue pv
+ rawSqlProcessRow [pv] = Single A.<$> fromPersistValue pv
rawSqlProcessRow _ = Left $ pack "RawSql (Single a): wrong number of columns."
instance
@@ -72,7 +75,7 @@
instance
(PersistEntity record, PersistEntityBackend record ~ backend, IsPersistBackend backend) =>
RawSql (Entity record) where
- rawSqlCols escape ent = (length sqlFields, [intercalate ", " sqlFields])
+ rawSqlCols escape _ent = (length sqlFields, [intercalate ", " sqlFields])
where
sqlFields = map (((name <> ".") <>) . escape)
$ map fieldDB
@@ -86,8 +89,8 @@
1 -> "one column for an 'Entity' data type without fields"
n -> show n ++ " columns for an 'Entity' data type"
rawSqlProcessRow row = case splitAt nKeyFields row of
- (rowKey, rowVal) -> Entity <$> keyFromValues rowKey
- <*> fromPersistValues rowVal
+ (rowKey, rowVal) -> Entity A.<$> keyFromValues rowKey
+ A.<*> fromPersistValues rowVal
where
nKeyFields = length $ entityKeyFields entDef
entDef = entityDef (Nothing :: Maybe record)
@@ -212,7 +215,12 @@
sqlType :: Proxy a -> SqlType
#ifndef NO_OVERLAP
-instance PersistFieldSql String where
+
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPING #-} PersistFieldSql [Char] where
+#else
+instance PersistFieldSql [Char] where
+#endif
sqlType _ = SqlString
#endif
@@ -226,7 +234,7 @@
sqlType _ = SqlString
instance PersistFieldSql Int where
sqlType _
- | bitSize (0 :: Int) <= 32 = SqlInt32
+ | Just x <- bitSizeMaybe (0 :: Int), x <= 32 = SqlInt32
| otherwise = SqlInt64
instance PersistFieldSql Int8 where
sqlType _ = SqlInt32
@@ -256,7 +264,11 @@
sqlType _ = SqlTime
instance PersistFieldSql UTCTime where
sqlType _ = SqlDayTime
+#if MIN_VERSION_base(4,8,0)
+instance {-# OVERLAPPABLE #-} PersistFieldSql a => PersistFieldSql [a] where
+#else
instance PersistFieldSql a => PersistFieldSql [a] where
+#endif
sqlType _ = SqlString
instance PersistFieldSql a => PersistFieldSql (V.Vector a) where
sqlType _ = SqlString
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Sql/Internal.hs new/persistent-2.6.1/Database/Persist/Sql/Internal.hs
--- old/persistent-2.6/Database/Persist/Sql/Internal.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Sql/Internal.hs 2017-03-01 07:48:55.000000000 +0100
@@ -68,10 +68,10 @@
refName :: DBName -> DBName -> DBName
refName (DBName table) (DBName column) =
- DBName $ mconcat [table, "_", column, "_fkey"]
+ DBName $ Data.Monoid.mconcat [table, "_", column, "_fkey"]
resolveTableName :: [EntityDef] -> HaskellName -> DBName
-resolveTableName [] (HaskellName hn) = error $ "Table not found: " `mappend` T.unpack hn
+resolveTableName [] (HaskellName hn) = error $ "Table not found: " `Data.Monoid.mappend` T.unpack hn
resolveTableName (e:es) hn
| entityHaskell e == hn = entityDB e
| otherwise = resolveTableName es hn
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Sql/Migration.hs new/persistent-2.6.1/Database/Persist/Sql/Migration.hs
--- old/persistent-2.6/Database/Persist/Sql/Migration.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Sql/Migration.hs 2017-03-01 07:48:55.000000000 +0100
@@ -33,6 +33,8 @@
safeSql :: CautiousMigration -> [Sql]
safeSql = allSql . filter (not . fst)
+-- | Given a 'Migration', this parses it and returns either a list of
+-- errors associated with the migration or a list of migrations to do.
parseMigration :: MonadIO m => Migration -> ReaderT SqlBackend m (Either [Text] CautiousMigration)
parseMigration =
liftIOReader . liftM go . runWriterT . execWriterT
@@ -42,7 +44,8 @@
liftIOReader (ReaderT m) = ReaderT $ liftIO . m
--- like parseMigration, but call error or return the CautiousMigration
+-- | Like 'parseMigration', but instead of returning the value in an
+-- 'Either' value, it calls 'error' on the error values.
parseMigration' :: MonadIO m => Migration -> ReaderT SqlBackend m (CautiousMigration)
parseMigration' m = do
x <- parseMigration m
@@ -50,18 +53,25 @@
Left errs -> error $ unlines $ map unpack errs
Right sql -> return sql
+-- | Prints a migration.
printMigration :: MonadIO m => Migration -> ReaderT SqlBackend m ()
printMigration m = showMigration m
>>= mapM_ (liftIO . Data.Text.IO.putStrLn)
+-- | Convert a 'Migration' to a list of 'Text' values corresponding to their
+-- 'Sql' statements.
showMigration :: MonadIO m => Migration -> ReaderT SqlBackend m [Text]
showMigration m = map (flip snoc ';') `liftM` getMigration m
+-- | Return all of the 'Sql' values associated with the given migration.
+-- Calls 'error' if there's a parse error on any migration.
getMigration :: MonadIO m => Migration -> ReaderT SqlBackend m [Sql]
getMigration m = do
mig <- parseMigration' m
return $ allSql mig
+-- | Runs a migration. If the migration fails to parse or if any of the
+-- migrations are unsafe, then this calls 'error' to halt the program.
runMigration :: MonadIO m
=> Migration
-> ReaderT SqlBackend m ()
@@ -74,6 +84,9 @@
-> ReaderT SqlBackend m [Text]
runMigrationSilent m = liftBaseOp_ (hSilence [stderr]) $ runMigration' m True
+-- | Run the given migration against the database. If the migration fails
+-- to parse, or there are any unsafe migrations, then this will error at
+-- runtime. This returns a list of the migrations that were executed.
runMigration'
:: MonadIO m
=> Migration
@@ -93,6 +106,8 @@
displayMigration (True, s) = "*** " ++ unpack s ++ ";"
displayMigration (False, s) = " " ++ unpack s ++ ";"
+-- | Like 'runMigration', but this will perform the unsafe database
+-- migrations instead of erroring out.
runMigrationUnsafe :: MonadIO m
=> Migration
-> ReaderT SqlBackend m ()
@@ -116,6 +131,9 @@
-- choose to have this special sorting applied.
isCreate t = pack "CREATe " `isPrefixOf` t
+-- | Given a list of old entity definitions and a new 'EntityDef' in
+-- @val@, this creates a 'Migration' to update the old list of definitions
+-- with the new one.
migrate :: [EntityDef]
-> EntityDef
-> Migration
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Sql/Orphan/PersistQuery.hs new/persistent-2.6.1/Database/Persist/Sql/Orphan/PersistQuery.hs
--- old/persistent-2.6/Database/Persist/Sql/Orphan/PersistQuery.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Sql/Orphan/PersistQuery.hs 2017-03-01 07:48:55.000000000 +0100
@@ -183,7 +183,7 @@
, T.intercalate "," $ map (go' conn . go) upds
, wher
]
- let dat = map updatePersistValue upds `mappend`
+ let dat = map updatePersistValue upds `Data.Monoid.mappend`
getFiltsValues conn filts
rawExecuteCount sql dat
where
@@ -273,7 +273,7 @@
(True, Just pdef, _) ->
error $ "unhandled error for composite/non id primary keys filter=" ++ show pfilter ++ " persistList=" ++ show allVals ++ " pdef=" ++ show pdef
- _ -> case (isNull, pfilter, varCount) of
+ _ -> case (isNull, pfilter, length notNullVals) of
(True, Eq, _) -> (name <> " IS NULL", [])
(True, Ne, _) -> (name <> " IS NOT NULL", [])
(False, Ne, _) -> (T.concat
@@ -298,7 +298,8 @@
, qmarks
, ")"
], notNullVals)
- (_, NotIn, 0) -> ("1=1", [])
+ (False, NotIn, 0) -> ("1=1", [])
+ (True, NotIn, 0) -> (name <> " IS NOT NULL", [])
(False, NotIn, _) -> (T.concat
[ "("
, name
@@ -353,9 +354,6 @@
Right x ->
let x' = filter (/= PersistNull) $ map toPersistValue x
in "(" <> T.intercalate "," (map (const "?") x') <> ")"
- varCount = case value of
- Left _ -> 1
- Right x -> length x
showSqlFilter Eq = "="
showSqlFilter Ne = "<>"
showSqlFilter Gt = ">"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Sql/Orphan/PersistStore.hs new/persistent-2.6.1/Database/Persist/Sql/Orphan/PersistStore.hs
--- old/persistent-2.6/Database/Persist/Sql/Orphan/PersistStore.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Sql/Orphan/PersistStore.hs 2017-03-03 10:45:56.000000000 +0100
@@ -123,7 +123,7 @@
go'' n Subtract = T.concat [n, "=", n, "-?"]
go'' n Multiply = T.concat [n, "=", n, "*?"]
go'' n Divide = T.concat [n, "=", n, "/?"]
- go'' _ (BackendSpecificUpdate up) = error $ T.unpack $ "BackendSpecificUpdate" `mappend` up `mappend` "not supported"
+ go'' _ (BackendSpecificUpdate up) = error $ T.unpack $ "BackendSpecificUpdate" `Data.Monoid.mappend` up `mappend` "not supported"
let go' (x, pu) = go'' (connEscapeName conn x) pu
let wher = whereStmtForKey conn k
let sql = T.concat
@@ -212,22 +212,32 @@
valss = map (map toPersistValue . toPersistFields) vals
+
insertMany_ [] = return ()
- insertMany_ vals = do
- conn <- ask
- let sql = T.concat
- [ "INSERT INTO "
- , connEscapeName conn (entityDB t)
- , "("
- , T.intercalate "," $ map (connEscapeName conn . fieldDB) $ entityFields t
- , ") VALUES ("
- , T.intercalate "),(" $ replicate (length valss) $ T.intercalate "," $ map (const "?") (entityFields t)
- , ")"
- ]
- rawExecute sql (concat valss)
+ insertMany_ vals0 = do conn <- ask
+ case connMaxParams conn of
+ Nothing -> insertMany_' vals0
+ Just maxParams -> let chunkSize = maxParams `div` length (entityFields t) in
+ mapM_ insertMany_' (chunksOf chunkSize vals0)
where
- t = entityDef vals
- valss = map (map toPersistValue . toPersistFields) vals
+ insertMany_' vals = do
+ conn <- ask
+ let valss = map (map toPersistValue . toPersistFields) vals
+ let sql = T.concat
+ [ "INSERT INTO "
+ , connEscapeName conn (entityDB t)
+ , "("
+ , T.intercalate "," $ map (connEscapeName conn . fieldDB) $ entityFields t
+ , ") VALUES ("
+ , T.intercalate "),(" $ replicate (length valss) $ T.intercalate "," $ map (const "?") (entityFields t)
+ , ")"
+ ]
+ rawExecute sql (concat valss)
+
+ t = entityDef vals0
+ -- Implement this here to avoid depending on the split package
+ chunksOf _ [] = []
+ chunksOf size xs = let (chunk, rest) = splitAt size xs in chunk : chunksOf size rest
replace k val = do
conn <- ask
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Sql/Orphan/PersistUnique.hs new/persistent-2.6.1/Database/Persist/Sql/Orphan/PersistUnique.hs
--- old/persistent-2.6/Database/Persist/Sql/Orphan/PersistUnique.hs 2016-08-10 05:20:24.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Sql/Orphan/PersistUnique.hs 2017-03-01 07:48:55.000000000 +0100
@@ -16,7 +16,6 @@
import Data.Monoid (mappend, (<>))
import qualified Data.Conduit.List as CL
import Control.Monad.Trans.Reader (ask, withReaderT)
-import Control.Monad (when, liftM)
defaultUpsert :: (MonadIO m, PersistEntity record, PersistUniqueWrite backend
, PersistEntityBackend record ~ BaseBackend backend)
@@ -33,7 +32,7 @@
case connUpsertSql conn of
Just upsertSql -> case updates of
[] -> defaultUpsert record updates
- xs -> do
+ _:_ -> do
let upds = T.intercalate "," $ map (go' . go) updates
sql = upsertSql t upds
vals = (map toPersistValue $ toPersistFields record) ++ (map updatePersistValue updates) ++ (unqs uniqueKey)
@@ -43,7 +42,7 @@
go'' n Subtract = T.concat [n, "=", n, "-?"]
go'' n Multiply = T.concat [n, "=", n, "*?"]
go'' n Divide = T.concat [n, "=", n, "/?"]
- go'' _ (BackendSpecificUpdate up) = error $ T.unpack $ "BackendSpecificUpdate" `mappend` up `mappend` "not supported"
+ go'' _ (BackendSpecificUpdate up) = error $ T.unpack $ "BackendSpecificUpdate" `Data.Monoid.mappend` up `mappend` "not supported"
go' (x, pu) = go'' (connEscapeName conn x) pu
go x = (fieldDB $ updateFieldDef x, updateUpdate x)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Sql/Raw.hs new/persistent-2.6.1/Database/Persist/Sql/Raw.hs
--- old/persistent-2.6/Database/Persist/Sql/Raw.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Sql/Raw.hs 2017-03-01 07:48:55.000000000 +0100
@@ -11,7 +11,6 @@
import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.Reader (ReaderT, ask, MonadReader)
import Data.Acquire (allocateAcquire, Acquire, mkAcquire, with)
-import Data.Functor ((<$>))
import Data.IORef (writeIORef, readIORef, newIORef)
import Control.Exception (throwIO)
import Control.Monad (when, liftM)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Sql/Types/Internal.hs new/persistent-2.6.1/Database/Persist/Sql/Types/Internal.hs
--- old/persistent-2.6/Database/Persist/Sql/Types/Internal.hs 2016-08-10 05:20:24.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Sql/Types/Internal.hs 2017-03-03 10:45:56.000000000 +0100
@@ -81,6 +81,11 @@
, connRDBMS :: Text
, connLimitOffset :: (Int,Int) -> Bool -> Text -> Text
, connLogFunc :: LogFunc
+ , connMaxParams :: Maybe Int
+ -- ^ Some databases (probably only Sqlite) have a limit on how
+ -- many question-mark parameters may be used in a statement
+ --
+ -- @since 2.6.1
}
deriving Typeable
instance HasPersistBackend SqlBackend where
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Sql/Types.hs new/persistent-2.6.1/Database/Persist/Sql/Types.hs
--- old/persistent-2.6/Database/Persist/Sql/Types.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Sql/Types.hs 2017-03-01 07:48:55.000000000 +0100
@@ -19,22 +19,13 @@
import Control.Exception (Exception)
import Control.Monad.Trans.Resource (ResourceT)
-import Data.Acquire (Acquire)
import Control.Monad.Logger (NoLoggingT)
-import Control.Monad.IO.Class (MonadIO (..))
import Control.Monad.Trans.Reader (ReaderT (..))
import Control.Monad.Trans.Writer (WriterT)
import Data.Typeable (Typeable)
import Database.Persist.Types
import Database.Persist.Sql.Types.Internal
-import Data.IORef (IORef)
-import Data.Map (Map)
-import Data.Int (Int64)
-import Data.Conduit (Source)
import Data.Pool (Pool)
-import Language.Haskell.TH.Syntax (Loc)
-import Control.Monad.Logger (LogSource, LogLevel)
-import System.Log.FastLogger (LogStr)
import Data.Text (Text)
-- | Deprecated synonym for @SqlBackend@.
@@ -80,16 +71,8 @@
-- some complex @JOIN@ query, or a database-specific command
-- needs to be issued.
--
--- To issue raw SQL queries you could use 'R.withStmt', which
--- allows you to do anything you need. However, its API is
--- /low-level/ and you need to parse each row yourself. However,
--- most of your complex queries will have simple results -- some
--- of your entities and maybe a couple of derived columns.
---
--- This is where 'rawSql' comes in. Like 'R.withStmt', you may
--- issue /any/ SQL query. However, it does all the hard work for
--- you and automatically parses the rows of the result. It may
--- return:
+-- To issue raw SQL queries, use 'rawSql'. It does all the hard work of
+-- automatically parsing the rows of the result. It may return:
--
-- * An 'Entity', that which 'selectList' returns.
-- All of your entity's fields are
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist/Types/Base.hs new/persistent-2.6.1/Database/Persist/Types/Base.hs
--- old/persistent-2.6/Database/Persist/Types/Base.hs 2016-08-10 05:20:24.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist/Types/Base.hs 2017-03-01 07:48:55.000000000 +0100
@@ -1,6 +1,7 @@
{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-deprecations #-} -- usage of Error typeclass
module Database.Persist.Types.Base where
import qualified Data.Aeson as A
@@ -16,10 +17,9 @@
import qualified Data.ByteString.Base64 as B64
import qualified Data.Vector as V
import Control.Arrow (second)
-import Control.Applicative ((<$>))
+import Control.Applicative as A ((<$>))
import Data.Time (Day, TimeOfDay, UTCTime)
import Data.Int (Int64)
-import qualified Data.Text.Read
import Data.ByteString (ByteString, foldl')
import Data.Bits (shiftL, shiftR)
import qualified Data.ByteString as BS
@@ -90,7 +90,13 @@
instance FromHttpApiData Checkmark where
parseUrlPiece = parseBoundedTextData
-instance PathPiece Checkmark
+instance PathPiece Checkmark where
+ toPathPiece Active = "active"
+ toPathPiece Inactive = "inactive"
+
+ fromPathPiece "active" = Just Active
+ fromPathPiece "inactive" = Just Inactive
+ fromPathPiece _ = Nothing
data IsNullable = Nullable !WhyNullable
| NotNullable
@@ -324,9 +330,9 @@
instance FromHttpApiData PersistValue where
parseUrlPiece input =
- PersistInt64 <$> parseUrlPiece input
- PersistList <$> readTextData input
- PersistText <$> return input
+ PersistInt64 A.<$> parseUrlPiece input
+ PersistList A.<$> readTextData input
+ PersistText A.<$> return input
where
infixl 3
Left _ y = y
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/Database/Persist.hs new/persistent-2.6.1/Database/Persist.hs
--- old/persistent-2.6/Database/Persist.hs 2016-07-17 04:15:37.000000000 +0200
+++ new/persistent-2.6.1/Database/Persist.hs 2017-03-01 07:48:55.000000000 +0100
@@ -53,7 +53,9 @@
import Data.Text.Lazy (toStrict)
import Data.Text.Lazy.Builder (toLazyText)
import Data.Aeson (toJSON, ToJSON)
-#if MIN_VERSION_aeson(0, 7, 0)
+#if MIN_VERSION_aeson(1, 0, 0)
+import Data.Aeson.Text (encodeToTextBuilder)
+#elif MIN_VERSION_aeson(0, 7, 0)
import Data.Aeson.Encode (encodeToTextBuilder)
#else
import Data.Aeson.Encode (fromValue)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/persistent-2.6/persistent.cabal new/persistent-2.6.1/persistent.cabal
--- old/persistent-2.6/persistent.cabal 2016-08-10 05:28:57.000000000 +0200
+++ new/persistent-2.6.1/persistent.cabal 2017-03-03 10:45:56.000000000 +0100
@@ -1,5 +1,5 @@
name: persistent
-version: 2.6
+version: 2.6.1
license: MIT
license-file: LICENSE
author: Michael Snoyman