@@ -11,11 +11,12 @@ module Database.Database
1111
1212import Config (databasePath , runDb )
1313import Control.Monad (void )
14- import Control.Monad.IO.Class (liftIO )
14+ import Control.Monad.IO.Class (MonadIO , liftIO )
1515import Data.Maybe (fromMaybe )
1616import Data.Text as T (findIndex , length , reverse , take , unpack )
1717import Database.CourseVideoSeed (seedVideos )
18- import Database.Persist.Sqlite (insert_ , runMigration , runMigrationQuiet )
18+ import Database.Persist.Sqlite (SqlPersistT , entityVal , insert_ , runMigration , runMigrationQuiet ,
19+ selectFirst )
1920import Database.Tables
2021import System.Directory (createDirectoryIfMissing )
2122import WebParsing.ArtSciParser (parseCalendar )
@@ -35,11 +36,23 @@ setupDatabase quiet = do
3536 let ind = (T. length dbPath - ) . fromMaybe 0 . T. findIndex (== ' /' ) . T. reverse $ dbPath
3637 db = T. unpack $ T. take ind dbPath
3738 createDirectoryIfMissing True db
38- runDb (
39- if quiet
40- then void $ runMigrationQuiet migrateAll
41- else runMigration migrateAll
42- )
39+
40+ -- Match SQL database with ORM, then initialize schema version table
41+ let migrateFunction = if quiet then void . runMigrationQuiet else runMigration
42+ runDb $ void $ migrateFunction migrateAll >> getDatabaseVersion
43+
44+ -- | Gets the current version of the database.
45+ -- If no version is defined, initialize the
46+ -- version to 1 and return that.
47+ getDatabaseVersion :: MonadIO m => SqlPersistT m Int
48+ getDatabaseVersion = do
49+ result <- selectFirst [] []
50+ case result of
51+ Just entity -> pure $ schemaVersionVersion $ entityVal entity
52+ Nothing -> do
53+ let initialVersion = 1
54+ insert_ $ SchemaVersion initialVersion
55+ pure initialVersion
4356
4457-- | Sets up the course information from Artsci Calendar
4558populateCalendar :: IO ()
0 commit comments