Enforce a default snippet access level in the DB

This adds a database migration that ensures that
project_features.snippets_access_level defaults to a value of 20 (=
ProjectFeature::ENABLED), instead of NULL. This allows us to simplify
some of the queries used for obtaining snippets, as we no longer need to
handle cases where this column is NULL.
This commit is contained in:
Yorick Peterse 2018-10-26 16:40:56 +02:00
parent 8e674510c5
commit 6d7bf439d6
No known key found for this signature in database
GPG Key ID: EDD30D2BEB691AC9
2 changed files with 43 additions and 1 deletions

View File

@ -0,0 +1,42 @@
# frozen_string_literal: true
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class MigrateSnippetsAccessLevelDefaultValue < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
ENABLED = 20
disable_ddl_transaction!
class ProjectFeature < ActiveRecord::Base
include EachBatch
self.table_name = 'project_features'
end
def up
change_column_default :project_features, :snippets_access_level, ENABLED
# On GitLab.com this will update about 28 000 rows. Since our updates are
# very small and this column is not indexed, these updates should be very
# lightweight.
ProjectFeature.where(snippets_access_level: nil).each_batch do |batch|
batch.update_all(snippets_access_level: ENABLED)
end
# We do not need to perform this in a post-deployment migration as the
# ProjectFeature model already enforces a default value for all new rows.
change_column_null :project_features, :snippets_access_level, false
end
def down
change_column_null :project_features, :snippets_access_level, true
change_column_default :project_features, :snippets_access_level, nil
# We can't migrate from 20 -> NULL, as some projects may have explicitly set
# the access level to 20.
end
end

View File

@ -1594,7 +1594,7 @@ ActiveRecord::Schema.define(version: 20181031190559) do
t.integer "merge_requests_access_level"
t.integer "issues_access_level"
t.integer "wiki_access_level"
t.integer "snippets_access_level"
t.integer "snippets_access_level", default: 20, null: false
t.integer "builds_access_level"
t.datetime "created_at"
t.datetime "updated_at"