Skip to content

Draft: Project: add 'last_updated_at' column and trigger

Jonas Wälter requested to merge siemens/gitlab:project/last_updated_at into master

What does this MR do and why?

This is the first step of the implementation plan in #349493 (closed).

This MR adds a new last_updated_at column to the projects table. It also adds a trigger to ensure that the column is updated automatically when one of the three timestamps (last_activity_at, last_repository_updated_at, updated_at) is updated.

🛠 with at Siemens

/cc @bufferoverflow

Database Migration

$ rails db:migrate
== 20220103155507 AddLastUpdatedAtToProjects: migrating =======================
-- add_column(:projects, :last_updated_at, :datetime_with_timezone, {:null=>true})
   -> 0.0089s
== 20220103155507 AddLastUpdatedAtToProjects: migrated (0.0091s) ==============

== 20220103162901 AddLastUpdatedAtTriggerToProjects: migrating ================
-- execute("CREATE OR REPLACE FUNCTION update_project_last_updated_at()\nRETURNS TRIGGER AS\n$$\nBEGIN\nNEW.last_updated_at := GREATEST(TIMEZONE('UTC', NEW.updated_at), TIMEZONE('UTC', NEW.last_activity_at), TIMEZONE('UTC', NEW.last_repository_updated_at));\nRETURN NEW;\n\nEND\n$$ LANGUAGE PLPGSQL\n")
   -> 0.0088s
-- execute("CREATE TRIGGER trigger_update_project_last_updated_at_on_project_update\nBEFORE UPDATE OF updated_at, last_activity_at, last_repository_updated_at ON projects\nFOR EACH ROW\n\nEXECUTE FUNCTION update_project_last_updated_at()\n")
   -> 0.0044s
== 20220103162901 AddLastUpdatedAtTriggerToProjects: migrated (0.0513s) =======
$ rails db:rollback STEP=2
== 20220103162901 AddLastUpdatedAtTriggerToProjects: reverting ================
-- execute("DROP TRIGGER IF EXISTS trigger_update_project_last_updated_at_on_project_update ON projects")
   -> 0.0053s
-- execute("DROP FUNCTION IF EXISTS update_project_last_updated_at()")
   -> 0.0013s
== 20220103162901 AddLastUpdatedAtTriggerToProjects: reverted (0.0068s) =======

== 20220103155507 AddLastUpdatedAtToProjects: reverting =======================
-- remove_column(:projects, :last_updated_at, :datetime_with_timezone, {:null=>true})
   -> 0.0056s
== 20220103155507 AddLastUpdatedAtToProjects: reverted (0.0094s) ==============

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Jonas Wälter

Merge request reports