diff --git a/src/Database/Esqueleto/Utils.hs b/src/Database/Esqueleto/Utils.hs index 8828d9d4f..36c33d573 100644 --- a/src/Database/Esqueleto/Utils.hs +++ b/src/Database/Esqueleto/Utils.hs @@ -17,7 +17,7 @@ module Database.Esqueleto.Utils , selectExists, selectNotExists , SqlHashable , sha256 - , maybe, unsafeCoalesce + , maybe, maybeEq, unsafeCoalesce , bool , max, min , SqlProject(..) @@ -242,6 +242,25 @@ maybe onNothing onJust val = E.case_ (onJust $ E.veryUnsafeCoerceSqlExprValue val) ] (E.else_ onNothing) + +infix 4 `maybeEq` + +maybeEq :: PersistField a + => E.SqlExpr (E.Value (Maybe a)) + -> E.SqlExpr (E.Value (Maybe a)) + -> E.SqlExpr (E.Value Bool) +-- ^ `E.==.` but treat `E.nothing` as identical +maybeEq a b = E.case_ + [ E.when_ + (E.isNothing a) + E.then_ + (E.isNothing b) + , E.when_ + (E.isNothing b) + E.then_ + false -- (E.isNothing a) + ] + (E.else_ $ a E.==. b) bool :: PersistField a => E.SqlExpr (E.Value a) diff --git a/src/Jobs/Handler/Files.hs b/src/Jobs/Handler/Files.hs index 0d4774ea9..de85244c0 100644 --- a/src/Jobs/Handler/Files.hs +++ b/src/Jobs/Handler/Files.hs @@ -10,6 +10,7 @@ import Database.Persist.Sql (deleteWhereCount) import qualified Database.Esqueleto as E import qualified Database.Esqueleto.Utils as E +import qualified Database.Esqueleto.Internal.Sql as E (unsafeSqlCastAs) import qualified Data.Conduit.Combinators as C import qualified Data.Conduit.List as C (mapMaybe) @@ -55,7 +56,9 @@ dispatchJobPruneUnreferencedFiles = JobHandlerAtomic . hoist lift $ do E.update $ \fileContent -> do let isReferenced = E.any E.exists . fileReferences $ fileContent E.^. FileContentHash - E.set fileContent [ FileContentUnreferencedSince E.=. E.bool (E.just . E.maybe (E.val now) (E.min $ E.val now) $ fileContent E.^. FileContentUnreferencedSince) E.nothing isReferenced ] + now' = E.unsafeSqlCastAs "TIMESTAMP WITH TIME ZONE" $ E.val now + shouldBe = E.bool (E.just . E.maybe now' (E.min now') $ fileContent E.^. FileContentUnreferencedSince) E.nothing isReferenced + E.set fileContent [ FileContentUnreferencedSince E.=. shouldBe ] let getCandidates = E.selectSource . E.from $ \fileContent -> do @@ -71,7 +74,8 @@ dispatchJobPruneUnreferencedFiles = JobHandlerAtomic . hoist lift $ do .| C.map (view $ _1 . _Value) .| C.mapM (\fRef -> Sum <$> deleteWhereCount [FileContentHash ==. fRef]) .| C.fold - $logInfoS "PruneUnreferencedFiles" [st|Deleted #{deleted} long-unreferenced files|] + when (deleted > 0) $ + $logInfoS "PruneUnreferencedFiles" [st|Deleted #{deleted} long-unreferenced files|] dispatchJobInjectFiles :: JobHandler UniWorX @@ -100,7 +104,8 @@ dispatchJobInjectFiles = JobHandlerException . maybeT (return ()) $ do fmap ((, mempty) . Sum) . lift. lift . E.insertSelectCount $ let isReferenced = E.any E.exists $ fileReferences (E.val fRef) - in return $ FileContent E.<# E.val fRef E.<&> E.val content E.<&> E.bool (E.just $ E.val now) E.nothing isReferenced + now' = E.unsafeSqlCastAs "TIMESTAMP WITH TIME ZONE" $ E.val now + in return $ FileContent E.<# E.val fRef E.<&> E.val content E.<&> E.bool (E.just now') E.nothing isReferenced runAppMinio . maybeT (return ()) . catchIfMaybeT minioIsDoesNotExist $ Minio.removeObject uploadBucket obj return res