persistent 2.1.3 → 2.1.4
raw patch · 5 files changed
+35/−19 lines, 5 files
Files
- ChangeLog.md +8/−0
- Database/Persist/Sql/Orphan/PersistQuery.hs +2/−3
- Database/Persist/Sql/Orphan/PersistUnique.hs +9/−14
- Database/Persist/Sql/Util.hs +15/−1
- persistent.cabal +1/−1
ChangeLog.md view
@@ -1,3 +1,11 @@+## 2.1.4++* Fix getBy with a primary key. #342++## 2.1.3++* Break self-referencing cycles in the entity declarations+ ## 2.1.2 * Error with `Double`s without a decimal part [#378](https://github.com/yesodweb/persistent/issues/378)
Database/Persist/Sql/Orphan/PersistQuery.hs view
@@ -14,6 +14,7 @@ import Database.Persist.Sql.Types import Database.Persist.Sql.Raw import Database.Persist.Sql.Orphan.PersistStore (withRawQuery)+import Database.Persist.Sql.Util (dbIdColumns) import qualified Data.Text as T import Data.Text (Text) import Data.Monoid (Monoid (..), (<>))@@ -86,9 +87,7 @@ return $ fmap ($= CL.mapM parse) srcRes where t = entityDef $ dummyFromFilts filts- cols conn = case entityPrimary t of - Just pdef -> T.intercalate "," $ map (connEscapeName conn . fieldDB) $ compositeFields pdef- Nothing -> connEscapeName conn $ fieldDB (entityId t)+ cols conn = T.intercalate "," $ dbIdColumns conn t wher conn = if null filts
Database/Persist/Sql/Orphan/PersistUnique.hs view
@@ -2,10 +2,13 @@ {-# OPTIONS_GHC -fno-warn-orphans #-} module Database.Persist.Sql.Orphan.PersistUnique () where +import Control.Exception (throwIO)+import Control.Monad.IO.Class (liftIO) import Database.Persist import Database.Persist.Sql.Types import Database.Persist.Sql.Raw import Database.Persist.Sql.Orphan.PersistStore (withRawQuery)+import Database.Persist.Sql.Util (dbColumns, parseEntityValues) import qualified Data.Text as T import Data.Monoid (mappend) import qualified Data.Conduit.List as CL@@ -30,31 +33,23 @@ getBy uniq = do conn <- ask- let flds = map (connEscapeName conn . fieldDB) (entityFields t)- let cols = case entityPrimary t of- Just _ -> T.intercalate "," flds- Nothing -> T.intercalate "," $ connEscapeName conn (fieldDB (entityId t)) : flds let sql = T.concat [ "SELECT "- , cols+ , T.intercalate "," $ dbColumns conn t , " FROM " , connEscapeName conn $ entityDB t , " WHERE " , sqlClause conn ]- vals' = persistUniqueToValues uniq- withRawQuery sql vals' $ do+ uvals = persistUniqueToValues uniq+ withRawQuery sql uvals $ do row <- CL.head case row of Nothing -> return Nothing Just [] -> error "getBy: empty row"- Just (kpv:vals) ->- case fromPersistValues vals of- Left s -> error $ T.unpack s- Right x ->- case keyFromValues [kpv] of- Right k -> return $ Just (Entity k x)- Left _ -> error $ "getBy: keyFromValues failed: " `mappend` show kpv+ Just vals -> case parseEntityValues t vals of+ Left err -> liftIO $ throwIO $ PersistMarshalError err+ Right r -> return $ Just r where sqlClause conn = T.intercalate " AND " $ map (go conn) $ toFieldNames' uniq
Database/Persist/Sql/Util.hs view
@@ -5,6 +5,8 @@ , entityColumnCount , isIdField , hasCompositeKey+ , dbIdColumns+ , dbColumns ) where import Data.Maybe (isJust)@@ -32,6 +34,19 @@ hasCompositeKey :: EntityDef -> Bool hasCompositeKey = isJust . entityPrimary +dbIdColumns :: SqlBackend -> EntityDef -> [Text]+dbIdColumns conn t = case entityPrimary t of+ Just pdef -> map (connEscapeName conn . fieldDB) $ compositeFields pdef+ Nothing -> [connEscapeName conn $ fieldDB (entityId t)]++dbColumns :: SqlBackend -> EntityDef -> [Text]+dbColumns conn t = case entityPrimary t of+ Just _ -> flds + Nothing -> escapeDB (entityId t) : flds+ where+ escapeDB = connEscapeName conn . fieldDB+ flds = map escapeDB (entityFields t)+ parseEntityValues :: PersistEntity record => EntityDef -> [PersistValue] -> Either Text (Entity record) parseEntityValues t vals = @@ -64,4 +79,3 @@ isIdField :: PersistEntity record => EntityField record typ -> Bool isIdField f = fieldHaskell (persistFieldDef f) == HaskellName "Id"-
persistent.cabal view
@@ -1,5 +1,5 @@ name: persistent-version: 2.1.3+version: 2.1.4 license: MIT license-file: LICENSE author: Michael Snoyman <michael@snoyman.com>