Add helper program for migrating DB for the future version
This commit is contained in:
parent
00f2c4567a
commit
f7895f46b4
88
app/upgrade-to-0-2.hs
Normal file
88
app/upgrade-to-0-2.hs
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE GADTs, FlexibleContexts #-}
|
||||||
|
{-# LANGUAGE Arrows, NoMonomorphismRestriction #-}
|
||||||
|
{-# LANGUAGE MultiParamTypeClasses, PartialTypeSignatures #-}
|
||||||
|
{-# LANGUAGE GeneralizedNewtypeDeriving, EmptyDataDecls #-}
|
||||||
|
|
||||||
|
import Prelude hiding (FilePath)
|
||||||
|
|
||||||
|
import Control.Monad.Reader (ReaderT)
|
||||||
|
import Database.Persist
|
||||||
|
import Database.Persist.Postgresql
|
||||||
|
import Control.Monad.Logger (runNoLoggingT)
|
||||||
|
import Control.Monad.Trans.Resource (runResourceT)
|
||||||
|
|
||||||
|
import qualified Data.ByteString as BS
|
||||||
|
import qualified Data.ByteString.UTF8 as BSU
|
||||||
|
|
||||||
|
import qualified Database.Esqueleto as E
|
||||||
|
import Database.Esqueleto ((^.))
|
||||||
|
|
||||||
|
import Model
|
||||||
|
--share [mkPersist sqlSettings, mkMigrate "migrateAll"]
|
||||||
|
-- $(persistFileWith lowerCaseSettings "config/models")
|
||||||
|
|
||||||
|
dbSpecification dbName = BS.concat ["host=localhost dbname=", BSU.fromString dbName]
|
||||||
|
|
||||||
|
dbConnection dbName = withPostgresqlConn (dbSpecification dbName)
|
||||||
|
|
||||||
|
runOnDb :: String -> ReaderT SqlBackend _ a -> IO a
|
||||||
|
runOnDb dbName = runNoLoggingT . runResourceT . (dbConnection dbName) . runSqlConn
|
||||||
|
|
||||||
|
process :: String -> IO ()
|
||||||
|
process dbName = do
|
||||||
|
Prelude.putStrLn "Getting all variants…"
|
||||||
|
variants <- runOnDb dbName
|
||||||
|
$ E.select $ E.from $ \(challenge, submission, variant, test, out) -> do
|
||||||
|
E.where_ (submission ^. SubmissionChallenge E.==. challenge ^. ChallengeId
|
||||||
|
E.&&. variant ^. VariantSubmission E.==. submission ^. SubmissionId
|
||||||
|
E.&&. test ^. TestChallenge E.==. challenge ^. ChallengeId
|
||||||
|
E.&&. out ^. OutTest E.==. test ^. TestId
|
||||||
|
E.&&. out ^. OutVariant E.==. variant ^. VariantId)
|
||||||
|
return (variant, submission, out, test)
|
||||||
|
|
||||||
|
Prelude.putStrLn "Adding evaluations…"
|
||||||
|
_ <- mapM (processVariant dbName) variants
|
||||||
|
|
||||||
|
putStrLn "DELETING"
|
||||||
|
runOnDb dbName $ deleteWhere [EvaluationVersion ==. Nothing]
|
||||||
|
|
||||||
|
return ()
|
||||||
|
|
||||||
|
processVariant :: String -> (Entity Variant, Entity Submission, Entity Out, Entity Test) -> IO ()
|
||||||
|
processVariant dbName (variant, Entity _ submission, Entity _ out, Entity testId _) = do
|
||||||
|
Prelude.putStrLn (show $ entityKey variant)
|
||||||
|
|
||||||
|
evaluations <- runOnDb dbName
|
||||||
|
$ E.select $ E.from $ \evaluation -> do
|
||||||
|
E.where_ (E.val (outChecksum out) E.==. evaluation ^. EvaluationChecksum
|
||||||
|
-- all this complication here and with orderBy due
|
||||||
|
-- to the legacy issue with evaluation version sometimes missing
|
||||||
|
E.&&. (evaluation ^. EvaluationVersion E.==. E.just (E.val (submissionVersion submission))
|
||||||
|
E.||. E.isNothing (evaluation ^. EvaluationVersion))
|
||||||
|
E.&&. evaluation ^. EvaluationTest E.==. E.val testId)
|
||||||
|
E.orderBy [E.asc (E.isNothing (evaluation ^. EvaluationVersion))]
|
||||||
|
return evaluation
|
||||||
|
|
||||||
|
case evaluations of
|
||||||
|
(Entity _ e:_) -> do
|
||||||
|
case evaluationVersion e of
|
||||||
|
Just _ -> putStrLn "OK found!"
|
||||||
|
Nothing -> do
|
||||||
|
putStrLn "NONE FOUND INSERTING"
|
||||||
|
_ <- runOnDb dbName $ insert $ Evaluation testId
|
||||||
|
(outChecksum out)
|
||||||
|
(evaluationScore e)
|
||||||
|
(evaluationErrorMessage e)
|
||||||
|
(evaluationStamp e)
|
||||||
|
(Just $ submissionVersion submission)
|
||||||
|
return ()
|
||||||
|
[] -> do
|
||||||
|
putStrLn "MISSING EVALUATION"
|
||||||
|
|
||||||
|
return ()
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
let dbName = "gonito"
|
||||||
|
process dbName
|
20
gonito.cabal
20
gonito.cabal
@ -170,6 +170,26 @@ executable gonito-bin
|
|||||||
|
|
||||||
ghc-options: -threaded -O2 -rtsopts -with-rtsopts=-N
|
ghc-options: -threaded -O2 -rtsopts -with-rtsopts=-N
|
||||||
|
|
||||||
|
executable upgrade-to-0-2
|
||||||
|
if flag(library-only)
|
||||||
|
Buildable: False
|
||||||
|
|
||||||
|
main-is: upgrade-to-0-2.hs
|
||||||
|
hs-source-dirs: app
|
||||||
|
build-depends: base
|
||||||
|
, gonito
|
||||||
|
, esqueleto
|
||||||
|
, text
|
||||||
|
, monad-logger
|
||||||
|
, persistent
|
||||||
|
, persistent-postgresql
|
||||||
|
, resourcet
|
||||||
|
, bytestring
|
||||||
|
, persistent-template
|
||||||
|
, mtl
|
||||||
|
, utf8-string
|
||||||
|
|
||||||
|
ghc-options: -threaded -O2 -rtsopts -with-rtsopts=-N
|
||||||
|
|
||||||
test-suite test
|
test-suite test
|
||||||
type: exitcode-stdio-1.0
|
type: exitcode-stdio-1.0
|
||||||
|
Loading…
Reference in New Issue
Block a user