fix(migration): make index migration truly idempotent

This commit is contained in:
Gregor Kleen 2020-08-02 14:08:01 +02:00
parent eb9c6760b9
commit 7a17535600

View File

@ -140,23 +140,31 @@ getMissingMigrations = do
migrateManual :: Migration
migrateManual =
addMigrations
[ (False, "CREATE INDEX IF NOT EXISTS course_application_file_content ON course_application_file (content)")
, (False, "CREATE INDEX IF NOT EXISTS material_file_content ON material_file (content)")
, (False, "CREATE INDEX IF NOT EXISTS course_news_file_content ON course_news_file (content)")
, (False, "CREATE INDEX IF NOT EXISTS sheet_file_content ON sheet_file (content)")
, (False, "CREATE INDEX IF NOT EXISTS course_app_instruction_file_content ON course_app_instruction_file (content)")
, (False, "CREATE INDEX IF NOT EXISTS allocation_matching_log ON allocation_matching (log)")
, (False, "CREATE INDEX IF NOT EXISTS submission_file_content ON submission_file (content)")
, (False, "CREATE INDEX IF NOT EXISTS session_file_content ON session_file (content)")
, (False, "CREATE INDEX IF NOT EXISTS file_lock_content ON file_lock (content)")
, (False, "CREATE INDEX IF NOT EXISTS user_lower_display_email ON \"user\" (lower(display_email))")
, (False, "CREATE INDEX IF NOT EXISTS user_lower_email ON \"user\" (lower(email))")
, (False, "CREATE INDEX IF NOT EXISTS user_lower_ident ON \"user\" (lower(ident))")
, (False, "CREATE INDEX IF NOT EXISTS submission_sheet ON submission (sheet)")
, (False, "CREATE INDEX IF NOT EXISTS submission_edit_submission ON submission_edit (submission)")
migrateManual = do
mapM_ (uncurry addIndex)
[ ("course_application_file_content", "CREATE INDEX course_application_file_content ON course_application_file (content)" )
, ("material_file_content", "CREATE INDEX material_file_content ON material_file (content)" )
, ("course_news_file_content", "CREATE INDEX course_news_file_content ON course_news_file (content)" )
, ("sheet_file_content", "CREATE INDEX sheet_file_content ON sheet_file (content)" )
, ("course_app_instruction_file_content", "CREATE INDEX course_app_instruction_file_content ON course_app_instruction_file (content)")
, ("allocation_matching_log", "CREATE INDEX allocation_matching_log ON allocation_matching (log)" )
, ("submission_file_content", "CREATE INDEX submission_file_content ON submission_file (content)" )
, ("session_file_content", "CREATE INDEX session_file_content ON session_file (content)" )
, ("file_lock_content", "CREATE INDEX file_lock_content ON file_lock (content)" )
, ("user_lower_display_email", "CREATE INDEX user_lower_display_email ON \"user\" (lower(display_email))" )
, ("user_lower_email", "CREATE INDEX user_lower_email ON \"user\" (lower(email))" )
, ("user_lower_ident", "CREATE INDEX user_lower_ident ON \"user\" (lower(ident))" )
, ("submission_sheet", "CREATE INDEX submission_sheet ON submission (sheet)" )
, ("submission_edit_submission", "CREATE INDEX submission_edit_submission ON submission_edit (submission)" )
]
where
addIndex :: Text -> Sql -> Migration
addIndex ixName ixDef = do
res <- lift $ lift [sqlQQ|SELECT EXISTS (SELECT 1 FROM pg_indexes WHERE schemaname = current_schema() AND indexname = #{ixName})|]
alreadyDefined <- case res of
[Single e] -> return e
_other -> return True
unless alreadyDefined $ addMigration False ixDef
{-