persistent-mysql 2.10.3.1 → 2.12.0.0
raw patch · 3 files changed
+148/−132 lines, 3 filesdep −persistent-templatedep ~persistent
Dependencies removed: persistent-template
Dependency ranges changed: persistent
Files
- ChangeLog.md +4/−0
- Database/Persist/MySQL.hs +141/−128
- persistent-mysql.cabal +3/−4
ChangeLog.md view
@@ -1,5 +1,9 @@ # Changelog for persistent-mysql +## 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)+ ## 2.10.3.1 * Fix foreign key migrations [#1167] https://github.com/yesodweb/persistent/pull/1167 * Fix a bug where a foreign key of a field to its table was ignored.
Database/Persist/MySQL.hs view
@@ -41,7 +41,7 @@ import Control.Monad import Control.Monad.IO.Class (MonadIO (..)) import Control.Monad.IO.Unlift (MonadUnliftIO)-import Control.Monad.Logger (MonadLogger, runNoLoggingT)+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)@@ -86,7 +86,7 @@ -- The pool is properly released after the action finishes using -- it. Note that you should not use the given 'ConnectionPool' -- outside the action since it may be already been released.-withMySQLPool :: (MonadLogger m, MonadUnliftIO m)+withMySQLPool :: (MonadLoggerIO m, MonadUnliftIO m) => MySQL.ConnectInfo -- ^ Connection information. -> Int@@ -100,7 +100,7 @@ -- | Create a MySQL connection pool. Note that it's your -- responsibility to properly close the connection pool when -- unneeded. Use 'withMySQLPool' for automatic resource control.-createMySQLPool :: (MonadUnliftIO m, MonadLogger m)+createMySQLPool :: (MonadUnliftIO m, MonadLoggerIO m) => MySQL.ConnectInfo -- ^ Connection information. -> Int@@ -111,7 +111,7 @@ -- | Same as 'withMySQLPool', but instead of opening a pool -- of connections, only one connection is opened.-withMySQLConn :: (MonadUnliftIO m, MonadLogger m)+withMySQLConn :: (MonadUnliftIO m, MonadLoggerIO m) => MySQL.ConnectInfo -- ^ Connection information. -> (SqlBackend -> m a)@@ -141,7 +141,9 @@ MySQL.execute_ conn "start transaction" >> return () , connCommit = const $ MySQL.commit conn , connRollback = const $ MySQL.rollback conn- , connEscapeName = pack . escapeDBName+ , connEscapeFieldName = T.pack . escapeF+ , connEscapeTableName = T.pack . escapeE . entityDB+ , connEscapeRawName = T.pack . escapeDBName . T.unpack , connNoLimit = "LIMIT 18446744073709551615" -- This noLimit is suggested by MySQL's own docs, see -- <http://dev.mysql.com/doc/refman/5.5/en/select.html>@@ -172,10 +174,10 @@ Just _ -> ISRManyKeys sql vals Nothing -> ISRInsertGet sql "SELECT LAST_INSERT_ID()" where- (fieldNames, placeholders) = unzip (Util.mkInsertPlaceholders ent escape)+ (fieldNames, placeholders) = unzip (Util.mkInsertPlaceholders ent escapeFT) sql = T.concat [ "INSERT INTO "- , escape $ entityDB ent+ , escapeET $ entityDB ent , "(" , T.intercalate "," fieldNames , ") VALUES("@@ -245,9 +247,9 @@ render (P (PersistRational r)) = MySQL.Plain $ BBB.fromString $ show (fromRational r :: Pico) -- FIXME: Too Ambiguous, can not select precision without information about field- render (P (PersistDbSpecific s)) = MySQL.Plain $ BBS.fromByteString s- render (P (PersistLiteral l)) = MySQL.Plain $ BBS.fromByteString l- render (P (PersistLiteralEscaped e)) = MySQL.Escape e+ render (P (PersistLiteral_ DbSpecific s)) = MySQL.Plain $ BBS.fromByteString s+ render (P (PersistLiteral_ Unescaped l)) = MySQL.Plain $ BBS.fromByteString l+ render (P (PersistLiteral_ Escaped e)) = MySQL.Escape e render (P (PersistArray a)) = MySQL.render (P (PersistList a)) render (P (PersistObjectId _)) = error "Refusing to serialize a PersistObjectId to a MySQL value"@@ -362,8 +364,9 @@ addReference allDefs refConstraintName refTblName cname (crFieldCascade cRef) guard $ cname /= fieldDB (entityId val)- return $ AlterColumn name (refTblName, refTarget)+ return $ AlterColumn name refTarget + let foreignsAlt = map (\fdef ->@@ -374,11 +377,11 @@ in AlterColumn name- ( foreignRefTableDBName fdef- , AddReference+ (AddReference (foreignRefTableDBName fdef) (foreignConstraintNameDBName fdef)- childfields parentfields+ childfields+ parentfields (foreignFieldCascade fdef) ) )@@ -436,7 +439,7 @@ addTable cols entity = AddTable $ concat -- Lower case e: see Database.Persist.Sql.Migration [ "CREATe TABLE "- , escapeDBName name+ , escapeE name , "(" , idtxt , if null nonIdCols then [] else ","@@ -448,7 +451,7 @@ filter (\c -> cName c /= fieldDB (entityId entity) ) cols name = entityDB entity idtxt = case entityPrimary entity of- Just pdef -> concat [" PRIMARY KEY (", intercalate "," $ map (escapeDBName . fieldDB) $ compositeFields pdef, ")"]+ Just pdef -> concat [" PRIMARY KEY (", intercalate "," $ map (escapeF . fieldDB) $ compositeFields pdef, ")"] Nothing -> let defText = defaultAttribute $ fieldAttrs $ entityId entity sType = fieldSqlType $ entityId entity@@ -457,7 +460,7 @@ _ -> "" maxlen = findMaxLenOfField (entityId entity) in concat- [ escapeDBName $ fieldDB $ entityId entity+ [ escapeF $ fieldDB $ entityId entity , " " <> showSqlType sType maxlen False , " NOT NULL" , autoIncrementText@@ -465,7 +468,7 @@ ] -- | Find out the type of a column.-findTypeOfColumn :: [EntityDef] -> DBName -> DBName -> (DBName, FieldType)+findTypeOfColumn :: [EntityDef] -> EntityNameDB -> FieldNameDB -> (FieldNameDB, FieldType) findTypeOfColumn allDefs name col = maybe (error $ "Could not find type of column " ++@@ -479,7 +482,7 @@ return (fieldType fieldDef) -- | Find out the maxlen of a column (default to 200)-findMaxLenOfColumn :: [EntityDef] -> DBName -> DBName -> (DBName, Integer)+findMaxLenOfColumn :: [EntityDef] -> EntityNameDB -> FieldNameDB -> (FieldNameDB, Integer) findMaxLenOfColumn allDefs name col = maybe (col, 200) ((,) col) $ do@@ -501,11 +504,11 @@ addReference :: [EntityDef] -- ^ List of all known 'EntityDef's.- -> DBName+ -> ConstraintNameDB -- ^ Foreign key name- -> DBName+ -> EntityNameDB -- ^ Referenced table name- -> DBName+ -> FieldNameDB -- ^ Column name -> FieldCascade -> AlterColumn@@ -523,35 +526,33 @@ data AlterColumn = Change Column | Add' Column- | Drop- | Default String- | NoDefault- | Gen SqlType (Maybe Integer) String- | NoGen SqlType (Maybe Integer)- | Update' String+ | Drop Column+ | Default Column String+ | NoDefault Column+ | Gen Column SqlType (Maybe Integer) String+ | NoGen Column SqlType (Maybe Integer)+ | Update' Column String -- | See the definition of the 'showAlter' function to see how these fields are used. | AddReference- DBName -- Referenced table- DBName -- Foreign key name- [DBName] -- Referencing columns- [DBName] -- Referenced columns+ EntityNameDB -- Referenced table+ ConstraintNameDB -- Foreign key name+ [FieldNameDB] -- Referencing columns+ [FieldNameDB] -- Referenced columns FieldCascade- | DropReference DBName+ | DropReference ConstraintNameDB deriving Show -type AlterColumn' = (DBName, AlterColumn)--data AlterTable = AddUniqueConstraint DBName [(DBName, FieldType, Integer)]- | DropUniqueConstraint DBName+data AlterTable = AddUniqueConstraint ConstraintNameDB [(FieldNameDB, FieldType, Integer)]+ | DropUniqueConstraint ConstraintNameDB deriving Show data AlterDB = AddTable String- | AlterColumn DBName AlterColumn'- | AlterTable DBName AlterTable+ | AlterColumn EntityNameDB AlterColumn+ | AlterTable EntityNameDB AlterTable deriving Show -udToPair :: UniqueDef -> (DBName, [DBName])+udToPair :: UniqueDef -> (ConstraintNameDB, [FieldNameDB]) udToPair ud = (uniqueDBName ud, map snd $ uniqueFields ud) ----------------------------------------------------------------------@@ -564,7 +565,7 @@ => MySQL.ConnectInfo -> (Text -> IO Statement) -> EntityDef -> [Column]- -> IO [Either Text (Either Column (DBName, [DBName]))]+ -> IO [Either Text (Either Column (ConstraintNameDB, [FieldNameDB]))] getColumns connectInfo getter def cols = do -- Find out all columns.@@ -607,9 +608,9 @@ refMap = Map.fromList $ foldl ref [] cols where ref rs c = case cReference c of Nothing -> rs- (Just r) -> (unDBName $ cName c, r) : rs+ (Just r) -> (unFieldNameDB $ cName c, r) : rs vals = [ PersistText $ pack $ MySQL.connectDatabase connectInfo- , PersistText $ unDBName $ entityDB def+ , PersistText $ unEntityNameDB $ entityDB def -- , PersistText $ unDBName $ fieldDB $ entityId def ] @@ -627,7 +628,7 @@ , PersistText clmnName] = return ( cntrName, clmnName ) check other = fail $ "helperCntrs: unexpected " ++ show other rows <- mapM check =<< CL.consume- return $ map (Right . Right . (DBName . fst . head &&& map (DBName . snd)))+ return $ map (Right . Right . (ConstraintNameDB . fst . head &&& map (FieldNameDB . snd))) $ groupBy ((==) `on` fst) rows @@ -636,7 +637,7 @@ :: HasCallStack => MySQL.ConnectInfo -> (Text -> IO Statement)- -> DBName+ -> EntityNameDB -> [PersistValue] -> Maybe ColumnReference -> IO (Either Text Column)@@ -704,7 +705,7 @@ -- Okay! return Column- { cName = DBName $ cname+ { cName = FieldNameDB cname , cNull = null_ == "YES" , cSqlType = typ , cDefault = default_@@ -736,10 +737,10 @@ ] let vars = [ PersistText $ pack $ MySQL.connectDatabase connectInfo- , PersistText $ unDBName $ tname+ , PersistText $ unEntityNameDB tname , PersistText cname , PersistText $ pack $ MySQL.connectDatabase connectInfo- , PersistText $ unDBName refName'+ , PersistText $ unConstraintNameDB refName' ] parseCascadeAction txt = case txt of@@ -757,14 +758,14 @@ Nothing [[PersistText tab, PersistText ref, PersistInt64 pos, PersistText onDel, PersistText onUpd]] -> if pos == 1- then Just $ ColumnReference (DBName tab) (DBName ref) FieldCascade+ then Just $ ColumnReference (EntityNameDB tab) (ConstraintNameDB ref) FieldCascade { fcOnUpdate = parseCascadeAction onUpd , fcOnDelete = parseCascadeAction onDel } else Nothing xs -> error $ mconcat [ "MySQL.getColumn/getRef: error fetching constraints. Expected a single result for foreign key query for table: "- , T.unpack (unDBName tname)+ , T.unpack (unEntityNameDB tname) , " and column: " , T.unpack cname , " but got: "@@ -819,9 +820,9 @@ getAlters :: [EntityDef] -> EntityDef- -> ([Column], [(DBName, [DBName])])- -> ([Column], [(DBName, [DBName])])- -> ([AlterColumn'], [AlterTable])+ -> ([Column], [(ConstraintNameDB, [FieldNameDB])])+ -> ([Column], [(ConstraintNameDB, [FieldNameDB])])+ -> ([AlterColumn], [AlterTable]) getAlters allDefs edef (c1, u1) (c2, u2) = (getAltersC c1 c2, getAltersU u1 u2) where@@ -832,9 +833,8 @@ in alters ++ getAltersC news old' dropColumn col =- map ((,) (cName col)) $ [DropReference (crConstraintName cr) | Just cr <- [cReference col]] ++- [Drop]+ [Drop col] getAltersU [] old = map (DropUniqueConstraint . fst) old getAltersU ((name, cols):news) old =@@ -865,55 +865,55 @@ -> [EntityDef] -> Column -> [Column]- -> ([AlterColumn'], [Column])+ -> ([AlterColumn], [Column]) findAlters edef allDefs col@(Column name isNull type_ def gen _defConstraintName maxLen ref) cols = case filter ((name ==) . cName) cols of -- new fkey that didn't exist before [] -> case ref of- Nothing -> ([(name, Add' col)],[])+ Nothing -> ([Add' col],[]) Just cr -> let tname = crTableName cr cname = crConstraintName cr cnstr = [addReference allDefs cname tname name (crFieldCascade cr)] in- (map ((,) tname) (Add' col : cnstr), cols)+ (Add' col : cnstr, cols) Column _ isNull' type_' def' gen' _defConstraintName' maxLen' ref' : _ -> let -- Foreign key refDrop = case (ref == ref', ref') of (False, Just ColumnReference {crConstraintName=cname}) ->- [(name, DropReference cname)]+ [DropReference cname] _ -> [] refAdd = case (ref == ref', ref) of (False, Just ColumnReference {crTableName=tname, crConstraintName=cname, crFieldCascade = cfc }) | tname /= entityDB edef- , cname /= fieldDB (entityId edef)+ , unConstraintNameDB cname /= unFieldNameDB (fieldDB (entityId edef)) ->- [(tname, addReference allDefs cname tname name cfc)]+ [addReference allDefs cname tname name cfc] _ -> [] -- Type and nullability modType | showSqlType type_ maxLen False `ciEquals` showSqlType type_' maxLen' False && isNull == isNull' = []- | otherwise = [(name, Change col)]+ | otherwise = [Change col] -- Default value -- Avoid DEFAULT NULL, since it is always unnecessary, and is an error for text/blob fields modDef = if def == def' then [] else case def of- Nothing -> [(name, NoDefault)]+ Nothing -> [NoDefault col] Just s -> if T.toUpper s == "NULL" then []- else [(name, Default $ T.unpack s)]+ else [Default col $ T.unpack s] -- Does the generated value need to change? modGen = if gen == gen' then [] else case gen of- Nothing -> [(name, NoGen type_ maxLen)]- Just genExpr -> [(name, Gen type_ maxLen $ T.unpack genExpr)]+ Nothing -> [NoGen col type_ maxLen]+ Just genExpr -> [Gen col type_ maxLen $ T.unpack genExpr] in ( refDrop ++ modType ++ modDef ++ modGen ++ refAdd , filter ((name /=) . cName) cols@@ -929,7 +929,7 @@ -- column. showColumn :: Column -> String showColumn (Column n nu t def gen _defConstraintName maxLen ref) = concat- [ escapeDBName n+ [ escapeF n , " " , showSqlType t maxLen True , " "@@ -946,7 +946,7 @@ else " DEFAULT " ++ T.unpack s , case ref of Nothing -> ""- Just cRef -> " REFERENCES " ++ escapeDBName (crTableName cRef)+ Just cRef -> " REFERENCES " ++ escapeE (crTableName cRef) <> " " <> T.unpack (renderFieldCascade (crFieldCascade cRef)) ] @@ -975,142 +975,154 @@ -- | Render an action that must be done on the database. showAlterDb :: AlterDB -> (Bool, Text) showAlterDb (AddTable s) = (False, pack s)-showAlterDb (AlterColumn t (c, ac)) =- (isUnsafe ac, pack $ showAlter t (c, ac))+showAlterDb (AlterColumn t ac) =+ (isUnsafe ac, pack $ showAlter t ac) where- isUnsafe Drop = True- isUnsafe _ = False+ isUnsafe Drop{} = True+ isUnsafe _ = False showAlterDb (AlterTable t at) = (False, pack $ showAlterTable t at) -- | Render an action that must be done on a table.-showAlterTable :: DBName -> AlterTable -> String+showAlterTable :: EntityNameDB -> AlterTable -> String showAlterTable table (AddUniqueConstraint cname cols) = concat [ "ALTER TABLE "- , escapeDBName table+ , escapeE table , " ADD CONSTRAINT "- , escapeDBName cname+ , escapeC cname , " UNIQUE(" , intercalate "," $ map escapeDBName' cols , ")" ] where- escapeDBName' (name, (FTTypeCon _ "Text" ), maxlen) = escapeDBName name ++ "(" ++ show maxlen ++ ")"- escapeDBName' (name, (FTTypeCon _ "String" ), maxlen) = escapeDBName name ++ "(" ++ show maxlen ++ ")"- escapeDBName' (name, (FTTypeCon _ "ByteString"), maxlen) = escapeDBName name ++ "(" ++ show maxlen ++ ")"- escapeDBName' (name, _ , _) = escapeDBName name+ escapeDBName' (name, (FTTypeCon _ "Text" ), maxlen) = escapeF name ++ "(" ++ show maxlen ++ ")"+ escapeDBName' (name, (FTTypeCon _ "String" ), maxlen) = escapeF name ++ "(" ++ show maxlen ++ ")"+ escapeDBName' (name, (FTTypeCon _ "ByteString"), maxlen) = escapeF name ++ "(" ++ show maxlen ++ ")"+ escapeDBName' (name, _ , _) = escapeF name showAlterTable table (DropUniqueConstraint cname) = concat [ "ALTER TABLE "- , escapeDBName table+ , escapeE table , " DROP INDEX "- , escapeDBName cname+ , escapeC cname ] -- | Render an action that must be done on a column.-showAlter :: DBName -> AlterColumn' -> String-showAlter table (oldName, Change (Column n nu t def gen defConstraintName maxLen _ref)) =+showAlter :: EntityNameDB -> AlterColumn -> String+showAlter table (Change (Column n nu t def gen defConstraintName maxLen _ref)) = concat [ "ALTER TABLE "- , escapeDBName table+ , escapeE table , " CHANGE "- , escapeDBName oldName+ , escapeF n , " " , showColumn (Column n nu t def gen defConstraintName maxLen Nothing) ]-showAlter table (_, Add' col) =+showAlter table (Add' col) = concat [ "ALTER TABLE "- , escapeDBName table+ , escapeE table , " ADD COLUMN " , showColumn col ]-showAlter table (n, Drop) =+showAlter table (Drop c) = concat [ "ALTER TABLE "- , escapeDBName table+ , escapeE table , " DROP COLUMN "- , escapeDBName n+ , escapeF (cName c) ]-showAlter table (n, Default s) =+showAlter table (Default c s) = concat [ "ALTER TABLE "- , escapeDBName table+ , escapeE table , " ALTER COLUMN "- , escapeDBName n+ , escapeF (cName c) , " SET DEFAULT " , s ]-showAlter table (n, NoDefault) =+showAlter table (NoDefault c) = concat [ "ALTER TABLE "- , escapeDBName table+ , escapeE table , " ALTER COLUMN "- , escapeDBName n+ , escapeF (cName c) , " DROP DEFAULT" ]-showAlter table (col, Gen typ len expr) =+showAlter table (Gen col typ len expr) = concat [ "ALTER TABLE "- , escapeDBName table+ , escapeE table , " MODIFY COLUMN "- , escapeDBName col+ , escapeF (cName col) , " " , showSqlType typ len True , " GENERATED ALWAYS AS (" , expr , ") STORED" ]-showAlter table (col, NoGen typ len) =+showAlter table (NoGen col typ len) = concat [ "ALTER TABLE "- , escapeDBName table+ , escapeE table , " MODIFY COLUMN "- , escapeDBName col+ , escapeF (cName col) , " " , showSqlType typ len True ]-showAlter table (n, Update' s) =+showAlter table (Update' c s) = concat [ "UPDATE "- , escapeDBName table+ , escapeE table , " SET "- , escapeDBName n+ , escapeF (cName c) , "=" , s , " WHERE "- , escapeDBName n+ , escapeF (cName c) , " IS NULL" ]-showAlter table (_, AddReference reftable fkeyname t2 id2 fc) = concat+showAlter table (AddReference reftable fkeyname t2 id2 fc) = concat [ "ALTER TABLE "- , escapeDBName table+ , escapeE table , " ADD CONSTRAINT "- , escapeDBName fkeyname+ , escapeC fkeyname , " FOREIGN KEY("- , intercalate "," $ map escapeDBName t2+ , intercalate "," $ map escapeF t2 , ") REFERENCES "- , escapeDBName reftable+ , escapeE reftable , "("- , intercalate "," $ map escapeDBName id2+ , intercalate "," $ map escapeF id2 , ") " , T.unpack $ renderFieldCascade fc ]-showAlter table (_, DropReference cname) = concat+showAlter table (DropReference cname) = concat [ "ALTER TABLE "- , escapeDBName table+ , escapeE table , " DROP FOREIGN KEY "- , escapeDBName cname+ , escapeC cname ] ---------------------------------------------------------------------- -escape :: DBName -> Text-escape = T.pack . escapeDBName+escapeC :: ConstraintNameDB -> String+escapeC = escapeWith (escapeDBName . T.unpack) +escapeE :: EntityNameDB -> String+escapeE = escapeWith (escapeDBName . T.unpack)++escapeF :: FieldNameDB -> String+escapeF = escapeWith (escapeDBName . T.unpack)++escapeET :: EntityNameDB -> Text+escapeET = escapeWith (T.pack . escapeDBName . T.unpack)++escapeFT :: FieldNameDB -> Text+escapeFT = escapeWith (T.pack . escapeDBName . T.unpack)+ -- | Escape a database name to be included on a query.-escapeDBName :: DBName -> String-escapeDBName (DBName s) = '`' : go (T.unpack s)+escapeDBName :: String -> String+escapeDBName str = '`' : go str where go ('`':xs) = '`' : '`' : go xs go ( x :xs) = x : go xs@@ -1200,7 +1212,7 @@ map (findTypeAndMaxLen name) ucols ] let foreigns = do Column { cName=cname, cReference= Just ColumnReference{crTableName = refTable, crConstraintName = refConstr, crFieldCascade = cfc }} <- newcols- return $ AlterColumn name (refTable, addReference allDefs refConstr refTable cname cfc)+ return $ AlterColumn name (addReference allDefs refConstr refTable cname cfc) let foreignsAlt = map@@ -1209,8 +1221,7 @@ in AlterColumn name- ( foreignRefTableDBName fdef- , AddReference+ (AddReference (foreignRefTableDBName fdef) (foreignConstraintNameDBName fdef) childfields@@ -1249,7 +1260,9 @@ connBegin = undefined, connCommit = undefined, connRollback = undefined,- connEscapeName = undefined,+ connEscapeFieldName = T.pack . escapeDBName . T.unpack . unFieldNameDB,+ connEscapeTableName = T.pack . escapeDBName . T.unpack . unEntityNameDB . entityDB,+ connEscapeRawName = T.pack . escapeDBName . T.unpack, connNoLimit = undefined, connRDBMS = undefined, connLimitOffset = undefined,@@ -1458,13 +1471,13 @@ CopyField rec -> Right (fieldDbToText (persistFieldDef rec)) CopyUnlessEq rec val -> Left (fieldDbToText (persistFieldDef rec), toPersistValue val) (fieldsToMaybeCopy, updateFieldNames) = partitionEithers $ map mfieldDef fieldValues- fieldDbToText = T.pack . escapeDBName . fieldDB+ fieldDbToText = T.pack . escapeF . fieldDB entityDef' = entityDef records firstField = case entityFieldNames of [] -> error "The entity you're trying to insert does not have any fields." (field:_) -> field entityFieldNames = map fieldDbToText (entityFields entityDef')- tableName = T.pack . escapeDBName . entityDB $ entityDef'+ tableName = T.pack . escapeE . entityDB $ entityDef' copyUnlessValues = map snd fieldsToMaybeCopy recordValues = concatMap (map toPersistValue . toPersistFields) records recordPlaceholders = Util.commaSeparated $ map (Util.parenWrapped . Util.commaSeparated . map (const "?") . toPersistFields) records@@ -1480,7 +1493,7 @@ ] condFieldSets = map (uncurry mkCondFieldSet) fieldsToMaybeCopy fieldSets = map (\n -> T.concat [n, "=VALUES(", n, ")"]) updateFieldNames- upds = map (Util.mkUpdateText' (pack . escapeDBName) id) updates+ upds = map (Util.mkUpdateText' (pack . escapeF) id) updates updsValues = map (\(Update _ val _) -> toPersistValue val) updates updateText = case fieldSets <> upds <> condFieldSets of [] -> T.concat [firstField, "=", firstField]@@ -1510,10 +1523,10 @@ putManySql' :: [FieldDef] -> EntityDef -> Int -> Text putManySql' (filter isFieldNotGenerated -> fields) ent n = q where- fieldDbToText = escape . fieldDB+ fieldDbToText = (T.pack . escapeF) . fieldDB mkAssignment f = T.concat [f, "=VALUES(", f, ")"] - table = escape . entityDB $ ent+ table = (T.pack . escapeE) . entityDB $ ent columns = Util.commaSeparated $ map fieldDbToText fields placeholders = map (const "?") fields updates = map (mkAssignment . fieldDbToText) fields
persistent-mysql.cabal view
@@ -1,5 +1,5 @@ name: persistent-mysql-version: 2.10.3.1+version: 2.12.0.0 license: MIT license-file: LICENSE author: Felipe Lessa <felipe.lessa@gmail.com>, Michael Snoyman@@ -28,14 +28,14 @@ library build-depends: base >= 4.9 && < 5- , persistent >= 2.11 && < 3+ , persistent >= 2.12 && < 3 , aeson >= 1.0 , blaze-builder , bytestring >= 0.10.8 , conduit >= 1.2.12 , containers >= 0.5 , monad-logger- , mysql >= 0.1.4 && < 0.2+ , mysql >= 0.1.4 && < 0.3 , mysql-simple >= 0.4.4 && < 0.5 , resourcet >= 1.1 , resource-pool@@ -63,7 +63,6 @@ , persistent , persistent-mysql , persistent-qq- , persistent-template , persistent-test , bytestring , containers